﻿/* 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/ParserATNSimulator.h"
#include "Parser.h"
#include "atn/PredicateTransition.h"
#include "atn/ATN.h"
#include "atn/ATNState.h"
#include "support/CPPUtils.h"

#include "FailedPredicateException.h"

using namespace antlr4;
using namespace antlrcpp;

FailedPredicateException::FailedPredicateException(Parser *recognizer) : FailedPredicateException(recognizer, "", "") {
}

FailedPredicateException::FailedPredicateException(Parser *recognizer, const std::string &predicate): FailedPredicateException(recognizer, predicate, "") {
}

FailedPredicateException::FailedPredicateException(Parser *recognizer, const std::string &predicate, const std::string &message)
  : RecognitionException(!message.empty() ? message : "failed predicate: " + predicate + "?", recognizer,
                         recognizer->getInputStream(), recognizer->getContext(), recognizer->getCurrentToken()) {

  atn::ATNState *s = recognizer->getInterpreter<atn::ATNSimulator>()->atn.states[recognizer->getState()];
  atn::Transition *transition = s->transitions[0];
  if (is<atn::PredicateTransition*>(transition)) {
    _ruleIndex = static_cast<atn::PredicateTransition *>(transition)->ruleIndex;
    _predicateIndex = static_cast<atn::PredicateTransition *>(transition)->predIndex;
  } else {
    _ruleIndex = 0;
    _predicateIndex = 0;
  }

  _predicate = predicate;
}

size_t FailedPredicateException::getRuleIndex() {
  return _ruleIndex;
}

size_t FailedPredicateException::getPredIndex() {
  return _predicateIndex;
}

std::string FailedPredicateException::getPredicate() {
  return _predicate;
}
