﻿/* 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 "tree/ErrorNode.h"
#include "ParserRuleContext.h"
#include "tree/ParseTreeListener.h"
#include "support/CPPUtils.h"

#include "tree/IterativeParseTreeWalker.h"
#include "tree/ParseTreeWalker.h"

using namespace antlr4::tree;
using namespace antlrcpp;

static IterativeParseTreeWalker defaultWalker;
ParseTreeWalker &ParseTreeWalker::DEFAULT = defaultWalker;

ParseTreeWalker::~ParseTreeWalker() {
}

void ParseTreeWalker::walk(ParseTreeListener *listener, ParseTree *t) const {
  if (is<ErrorNode *>(t)) {
    listener->visitErrorNode(dynamic_cast<ErrorNode *>(t));
    return;
  } else if (is<TerminalNode *>(t)) {
    listener->visitTerminal(dynamic_cast<TerminalNode *>(t));
    return;
  }

  enterRule(listener, t);
  for (auto &child : t->children) {
    walk(listener, child);
  }
  exitRule(listener, t);
}

void ParseTreeWalker::enterRule(ParseTreeListener *listener, ParseTree *r) const {
  ParserRuleContext *ctx = dynamic_cast<ParserRuleContext *>(r);
  listener->enterEveryRule(ctx);
  ctx->enterRule(listener);
}

void ParseTreeWalker::exitRule(ParseTreeListener *listener, ParseTree *r) const {
  ParserRuleContext *ctx = dynamic_cast<ParserRuleContext *>(r);
  ctx->exitRule(listener);
  listener->exitEveryRule(ctx);
}
