// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library polymer_expressions.visitor;

import 'expression.dart';

abstract class Visitor<E extends Expression> {
  visit(E s) => s.accept(this);
  visitEmptyExpression(EmptyExpression e);
  visitParenthesizedExpression(ParenthesizedExpression e);
  visitInvoke(Invoke i);
  visitLiteral(Literal l);
  visitMapLiteral(MapLiteral l);
  visitMapLiteralEntry(MapLiteralEntry l);
  visitIdentifier(Identifier i);
  visitBinaryOperator(BinaryOperator o);
  visitUnaryOperator(UnaryOperator o);
  visitInExpression(InExpression c);
}

abstract class RecursiveVisitor<E> extends Visitor<E> {
  visitExpression(E e);

  visitEmptyExpression(EmptyExpression e) => visitExpression(e);

  visitParenthesizedExpression(ParenthesizedExpression e) {
    visit(e);
    visitExpression(e);
  }

  visitInvoke(Invoke i) {
    visit(i.receiver);
    if (i.arguments != null) {
      for (var a in i.arguments) {
        visit(a);
      }
    }
    visitExpression(i);
  }

  visitLiteral(Literal l) => visitExpression(l);

  visitMapLiteral(MapLiteral l) {
    for (var e in l.entries) {
      visit(e);
    }
    visitExpression(l);
  }

  visitMapLiteralEntry(MapLiteralEntry e) {
    visit(e.key);
    visit(e.entryValue);
    visitExpression(e);
  }

  visitIdentifier(Identifier i) => visitExpression(i);

  visitBinaryOperator(BinaryOperator o) {
    visit(o.left);
    visit(o.right);
    visitExpression(o);
  }

  visitUnaryOperator(UnaryOperator o) {
    visit(o.child);
    visitExpression(o);
  }

  visitInExpression(InExpression c) {
    visit(c.left);
    visit(c.right);
    visitExpression(c);
  }
}