// Copyright (c) 2015, 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 analyzer.src.generated.visitors;

import 'package:analyzer/src/generated/ast.dart';

/// An [AstVisitor] that delegates calls to visit methods to all [delegates]
/// before calling [visitChildren].
class DelegatingAstVisitor<T> implements AstVisitor<T> {
  Iterable<AstVisitor<T>> _delegates;
  DelegatingAstVisitor(this._delegates);

  @override
  T visitAdjacentStrings(AdjacentStrings node) {
    _delegates.forEach((delegate) => delegate.visitAdjacentStrings(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitAnnotation(Annotation node) {
    _delegates.forEach((delegate) => delegate.visitAnnotation(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitArgumentList(ArgumentList node) {
    _delegates.forEach((delegate) => delegate.visitArgumentList(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitAsExpression(AsExpression node) {
    _delegates.forEach((delegate) => delegate.visitAsExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitAssertStatement(AssertStatement node) {
    _delegates.forEach((delegate) => delegate.visitAssertStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitAssignmentExpression(AssignmentExpression node) {
    _delegates.forEach((delegate) => delegate.visitAssignmentExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitAwaitExpression(AwaitExpression node) {
    _delegates.forEach((delegate) => delegate.visitAwaitExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitBinaryExpression(BinaryExpression node) {
    _delegates.forEach((delegate) => delegate.visitBinaryExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitBlock(Block node) {
    _delegates.forEach((delegate) => delegate.visitBlock(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitBlockFunctionBody(BlockFunctionBody node) {
    _delegates.forEach((delegate) => delegate.visitBlockFunctionBody(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitBooleanLiteral(BooleanLiteral node) {
    _delegates.forEach((delegate) => delegate.visitBooleanLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitBreakStatement(BreakStatement node) {
    _delegates.forEach((delegate) => delegate.visitBreakStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitCascadeExpression(CascadeExpression node) {
    _delegates.forEach((delegate) => delegate.visitCascadeExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitCatchClause(CatchClause node) {
    _delegates.forEach((delegate) => delegate.visitCatchClause(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitClassDeclaration(ClassDeclaration node) {
    _delegates.forEach((delegate) => delegate.visitClassDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitClassTypeAlias(ClassTypeAlias node) {
    _delegates.forEach((delegate) => delegate.visitClassTypeAlias(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitComment(Comment node) {
    _delegates.forEach((delegate) => delegate.visitComment(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitCommentReference(CommentReference node) {
    _delegates.forEach((delegate) => delegate.visitCommentReference(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitCompilationUnit(CompilationUnit node) {
    _delegates.forEach((delegate) => delegate.visitCompilationUnit(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitConditionalExpression(ConditionalExpression node) {
    _delegates.forEach((delegate) => delegate.visitConditionalExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitConfiguration(Configuration node) {
    _delegates.forEach((delegate) => delegate.visitConfiguration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitConstructorDeclaration(ConstructorDeclaration node) {
    _delegates
        .forEach((delegate) => delegate.visitConstructorDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
    _delegates
        .forEach((delegate) => delegate.visitConstructorFieldInitializer(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitConstructorName(ConstructorName node) {
    _delegates.forEach((delegate) => delegate.visitConstructorName(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitContinueStatement(ContinueStatement node) {
    _delegates.forEach((delegate) => delegate.visitContinueStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitDeclaredIdentifier(DeclaredIdentifier node) {
    _delegates.forEach((delegate) => delegate.visitDeclaredIdentifier(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitDefaultFormalParameter(DefaultFormalParameter node) {
    _delegates
        .forEach((delegate) => delegate.visitDefaultFormalParameter(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitDoStatement(DoStatement node) {
    _delegates.forEach((delegate) => delegate.visitDoStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitDottedName(DottedName node) {
    _delegates.forEach((delegate) => delegate.visitDottedName(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitDoubleLiteral(DoubleLiteral node) {
    _delegates.forEach((delegate) => delegate.visitDoubleLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitEmptyFunctionBody(EmptyFunctionBody node) {
    _delegates.forEach((delegate) => delegate.visitEmptyFunctionBody(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitEmptyStatement(EmptyStatement node) {
    _delegates.forEach((delegate) => delegate.visitEmptyStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitEnumConstantDeclaration(EnumConstantDeclaration node) {
    _delegates
        .forEach((delegate) => delegate.visitEnumConstantDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitEnumDeclaration(EnumDeclaration node) {
    _delegates.forEach((delegate) => delegate.visitEnumDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitExportDirective(ExportDirective node) {
    _delegates.forEach((delegate) => delegate.visitExportDirective(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitExpressionFunctionBody(ExpressionFunctionBody node) {
    _delegates
        .forEach((delegate) => delegate.visitExpressionFunctionBody(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitExpressionStatement(ExpressionStatement node) {
    _delegates.forEach((delegate) => delegate.visitExpressionStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitExtendsClause(ExtendsClause node) {
    _delegates.forEach((delegate) => delegate.visitExtendsClause(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFieldDeclaration(FieldDeclaration node) {
    _delegates.forEach((delegate) => delegate.visitFieldDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFieldFormalParameter(FieldFormalParameter node) {
    _delegates.forEach((delegate) => delegate.visitFieldFormalParameter(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitForEachStatement(ForEachStatement node) {
    _delegates.forEach((delegate) => delegate.visitForEachStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFormalParameterList(FormalParameterList node) {
    _delegates.forEach((delegate) => delegate.visitFormalParameterList(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitForStatement(ForStatement node) {
    _delegates.forEach((delegate) => delegate.visitForStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFunctionDeclaration(FunctionDeclaration node) {
    _delegates.forEach((delegate) => delegate.visitFunctionDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
    _delegates.forEach(
        (delegate) => delegate.visitFunctionDeclarationStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFunctionExpression(FunctionExpression node) {
    _delegates.forEach((delegate) => delegate.visitFunctionExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
    _delegates.forEach(
        (delegate) => delegate.visitFunctionExpressionInvocation(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFunctionTypeAlias(FunctionTypeAlias node) {
    _delegates.forEach((delegate) => delegate.visitFunctionTypeAlias(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
    _delegates.forEach(
        (delegate) => delegate.visitFunctionTypedFormalParameter(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitHideCombinator(HideCombinator node) {
    _delegates.forEach((delegate) => delegate.visitHideCombinator(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitIfStatement(IfStatement node) {
    _delegates.forEach((delegate) => delegate.visitIfStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitImplementsClause(ImplementsClause node) {
    _delegates.forEach((delegate) => delegate.visitImplementsClause(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitImportDirective(ImportDirective node) {
    _delegates.forEach((delegate) => delegate.visitImportDirective(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitIndexExpression(IndexExpression node) {
    _delegates.forEach((delegate) => delegate.visitIndexExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitInstanceCreationExpression(InstanceCreationExpression node) {
    _delegates
        .forEach((delegate) => delegate.visitInstanceCreationExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitIntegerLiteral(IntegerLiteral node) {
    _delegates.forEach((delegate) => delegate.visitIntegerLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitInterpolationExpression(InterpolationExpression node) {
    _delegates
        .forEach((delegate) => delegate.visitInterpolationExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitInterpolationString(InterpolationString node) {
    _delegates.forEach((delegate) => delegate.visitInterpolationString(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitIsExpression(IsExpression node) {
    _delegates.forEach((delegate) => delegate.visitIsExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitLabel(Label node) {
    _delegates.forEach((delegate) => delegate.visitLabel(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitLabeledStatement(LabeledStatement node) {
    _delegates.forEach((delegate) => delegate.visitLabeledStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitLibraryDirective(LibraryDirective node) {
    _delegates.forEach((delegate) => delegate.visitLibraryDirective(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitLibraryIdentifier(LibraryIdentifier node) {
    _delegates.forEach((delegate) => delegate.visitLibraryIdentifier(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitListLiteral(ListLiteral node) {
    _delegates.forEach((delegate) => delegate.visitListLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitMapLiteral(MapLiteral node) {
    _delegates.forEach((delegate) => delegate.visitMapLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitMapLiteralEntry(MapLiteralEntry node) {
    _delegates.forEach((delegate) => delegate.visitMapLiteralEntry(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitMethodDeclaration(MethodDeclaration node) {
    _delegates.forEach((delegate) => delegate.visitMethodDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitMethodInvocation(MethodInvocation node) {
    _delegates.forEach((delegate) => delegate.visitMethodInvocation(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitNamedExpression(NamedExpression node) {
    _delegates.forEach((delegate) => delegate.visitNamedExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitNativeClause(NativeClause node) {
    _delegates.forEach((delegate) => delegate.visitNativeClause(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitNativeFunctionBody(NativeFunctionBody node) {
    _delegates.forEach((delegate) => delegate.visitNativeFunctionBody(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitNullLiteral(NullLiteral node) {
    _delegates.forEach((delegate) => delegate.visitNullLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitParenthesizedExpression(ParenthesizedExpression node) {
    _delegates
        .forEach((delegate) => delegate.visitParenthesizedExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitPartDirective(PartDirective node) {
    _delegates.forEach((delegate) => delegate.visitPartDirective(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitPartOfDirective(PartOfDirective node) {
    _delegates.forEach((delegate) => delegate.visitPartOfDirective(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitPostfixExpression(PostfixExpression node) {
    _delegates.forEach((delegate) => delegate.visitPostfixExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitPrefixedIdentifier(PrefixedIdentifier node) {
    _delegates.forEach((delegate) => delegate.visitPrefixedIdentifier(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitPrefixExpression(PrefixExpression node) {
    _delegates.forEach((delegate) => delegate.visitPrefixExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitPropertyAccess(PropertyAccess node) {
    _delegates.forEach((delegate) => delegate.visitPropertyAccess(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitRedirectingConstructorInvocation(
      RedirectingConstructorInvocation node) {
    _delegates.forEach(
        (delegate) => delegate.visitRedirectingConstructorInvocation(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitRethrowExpression(RethrowExpression node) {
    _delegates.forEach((delegate) => delegate.visitRethrowExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitReturnStatement(ReturnStatement node) {
    _delegates.forEach((delegate) => delegate.visitReturnStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitScriptTag(ScriptTag node) {
    _delegates.forEach((delegate) => delegate.visitScriptTag(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitShowCombinator(ShowCombinator node) {
    _delegates.forEach((delegate) => delegate.visitShowCombinator(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSimpleFormalParameter(SimpleFormalParameter node) {
    _delegates.forEach((delegate) => delegate.visitSimpleFormalParameter(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSimpleIdentifier(SimpleIdentifier node) {
    _delegates.forEach((delegate) => delegate.visitSimpleIdentifier(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSimpleStringLiteral(SimpleStringLiteral node) {
    _delegates.forEach((delegate) => delegate.visitSimpleStringLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitStringInterpolation(StringInterpolation node) {
    _delegates.forEach((delegate) => delegate.visitStringInterpolation(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSuperConstructorInvocation(SuperConstructorInvocation node) {
    _delegates
        .forEach((delegate) => delegate.visitSuperConstructorInvocation(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSuperExpression(SuperExpression node) {
    _delegates.forEach((delegate) => delegate.visitSuperExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSwitchCase(SwitchCase node) {
    _delegates.forEach((delegate) => delegate.visitSwitchCase(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSwitchDefault(SwitchDefault node) {
    _delegates.forEach((delegate) => delegate.visitSwitchDefault(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSwitchStatement(SwitchStatement node) {
    _delegates.forEach((delegate) => delegate.visitSwitchStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitSymbolLiteral(SymbolLiteral node) {
    _delegates.forEach((delegate) => delegate.visitSymbolLiteral(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitThisExpression(ThisExpression node) {
    _delegates.forEach((delegate) => delegate.visitThisExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitThrowExpression(ThrowExpression node) {
    _delegates.forEach((delegate) => delegate.visitThrowExpression(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
    _delegates
        .forEach((delegate) => delegate.visitTopLevelVariableDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitTryStatement(TryStatement node) {
    _delegates.forEach((delegate) => delegate.visitTryStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitTypeArgumentList(TypeArgumentList node) {
    _delegates.forEach((delegate) => delegate.visitTypeArgumentList(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitTypeName(TypeName node) {
    _delegates.forEach((delegate) => delegate.visitTypeName(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitTypeParameter(TypeParameter node) {
    _delegates.forEach((delegate) => delegate.visitTypeParameter(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitTypeParameterList(TypeParameterList node) {
    _delegates.forEach((delegate) => delegate.visitTypeParameterList(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitVariableDeclaration(VariableDeclaration node) {
    _delegates.forEach((delegate) => delegate.visitVariableDeclaration(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitVariableDeclarationList(VariableDeclarationList node) {
    _delegates
        .forEach((delegate) => delegate.visitVariableDeclarationList(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitVariableDeclarationStatement(VariableDeclarationStatement node) {
    _delegates.forEach(
        (delegate) => delegate.visitVariableDeclarationStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitWhileStatement(WhileStatement node) {
    _delegates.forEach((delegate) => delegate.visitWhileStatement(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitWithClause(WithClause node) {
    _delegates.forEach((delegate) => delegate.visitWithClause(node));
    node.visitChildren(this);
    return null;
  }

  @override
  T visitYieldStatement(YieldStatement node) {
    _delegates.forEach((delegate) => delegate.visitYieldStatement(node));
    node.visitChildren(this);
    return null;
  }
}
