﻿/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
 * Use of this file is governed by the BSD 3-clause license that
 * can be found in the LICENSE.txt file in the project root.
 */

#include "atn/ATN.h"
#include "Recognizer.h"
#include "support/StringUtils.h"
#include "ParserRuleContext.h"
#include "misc/IntervalSet.h"

#include "RecognitionException.h"

using namespace antlr4;

RecognitionException::RecognitionException(Recognizer *recognizer, IntStream *input, ParserRuleContext *ctx,
                                           Token *offendingToken)
  : RecognitionException("", recognizer, input, ctx, offendingToken) {
}

RecognitionException::RecognitionException(const std::string &message, Recognizer *recognizer, IntStream *input,
                                           ParserRuleContext *ctx, Token *offendingToken)
  : RuntimeException(message), _recognizer(recognizer), _input(input), _ctx(ctx), _offendingToken(offendingToken) {
  InitializeInstanceFields();
  if (recognizer != nullptr) {
    _offendingState = recognizer->getState();
  }
}

RecognitionException::~RecognitionException() {
}

size_t RecognitionException::getOffendingState() const {
  return _offendingState;
}

void RecognitionException::setOffendingState(size_t offendingState) {
  _offendingState = offendingState;
}

misc::IntervalSet RecognitionException::getExpectedTokens() const {
  if (_recognizer) {
    return _recognizer->getATN().getExpectedTokens(_offendingState, _ctx);
  }
  return misc::IntervalSet::EMPTY_SET;
}

RuleContext* RecognitionException::getCtx() const {
  return _ctx;
}

IntStream* RecognitionException::getInputStream() const {
  return _input;
}

Token* RecognitionException::getOffendingToken() const {
  return _offendingToken;
}

Recognizer* RecognitionException::getRecognizer() const {
  return _recognizer;
}

void RecognitionException::InitializeInstanceFields() {
  _offendingState = INVALID_INDEX;
}
