| // Copyright (c) 2016, 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. |
| |
| import 'ast.dart'; |
| |
| /// The interface for visitors of the boolean selector AST. |
| abstract class Visitor<T> { |
| T visitVariable(VariableNode node); |
| T visitNot(NotNode node); |
| T visitOr(OrNode node); |
| T visitAnd(AndNode node); |
| T visitConditional(ConditionalNode node); |
| } |
| |
| /// An abstract superclass for side-effect-based visitors. |
| /// |
| /// The default implementations of this visitor's methods just traverse the AST |
| /// and do nothing with it. |
| abstract class RecursiveVisitor implements Visitor { |
| const RecursiveVisitor(); |
| |
| void visitVariable(VariableNode node) {} |
| |
| void visitNot(NotNode node) { |
| node.child.accept(this); |
| } |
| |
| void visitOr(OrNode node) { |
| node.left.accept(this); |
| node.right.accept(this); |
| } |
| |
| void visitAnd(AndNode node) { |
| node.left.accept(this); |
| node.right.accept(this); |
| } |
| |
| void visitConditional(ConditionalNode node) { |
| node.condition.accept(this); |
| node.whenTrue.accept(this); |
| node.whenFalse.accept(this); |
| } |
| } |