// Copyright (c) 2012, 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 visitor;

import '../closure.dart'
    show BoxFieldElement, ClosureClassElement, ClosureFieldElement;
import 'elements.dart';

abstract class ElementVisitor<R, A> {
  const ElementVisitor();

  R visit(Element e, A arg) => e.accept(this, arg);

  R visitErroneousElement(ErroneousElement e, A arg) => null;
  R visitWarnOnUseElement(WarnOnUseElement e, A arg) => null;
  R visitAmbiguousElement(AmbiguousElement e, A arg) => null;
  R visitCompilationUnitElement(CompilationUnitElement e, A arg) => null;
  R visitLibraryElement(LibraryElement e, A arg) => null;
  R visitImportElement(ImportElement e, A arg) => null;
  R visitExportElement(ExportElement e, A arg) => null;
  R visitPrefixElement(PrefixElement e, A arg) => null;
  R visitTypedefElement(TypedefElement e, A arg) => null;
  R visitLocalVariableElement(LocalVariableElement e, A arg) => null;
  R visitParameterElement(ParameterElement e, A arg) => null;
  R visitFormalElement(FormalElement e, A arg) => null;
  R visitFieldElement(FieldElement e, A arg) => null;
  R visitFieldParameterElement(InitializingFormalElement e, A arg) => null;
  R visitAbstractFieldElement(AbstractFieldElement e, A arg) => null;
  R visitMethodElement(FunctionElement e, A arg) => null;
  R visitGetterElement(GetterElement e, A arg) => null;
  R visitSetterElement(SetterElement e, A arg) => null;
  R visitLocalFunctionElement(LocalFunctionElement e, A arg) => null;
  R visitConstructorElement(ConstructorElement e, A arg) => null;
  R visitConstructorBodyElement(ConstructorBodyElement e, A arg) => null;
  R visitClassElement(ClassElement e, A arg) => null;
  R visitMixinApplicationElement(MixinApplicationElement e, A arg) => null;
  R visitEnumClassElement(EnumClassElement e, A arg) => null;
  R visitTypeVariableElement(TypeVariableElement e, A arg) => null;
  R visitBoxFieldElement(BoxFieldElement e, A arg) => null;
  R visitClosureClassElement(ClosureClassElement e, A arg) => null;
  R visitClosureFieldElement(ClosureFieldElement e, A arg) => null;
}

abstract class BaseElementVisitor<R, A> extends ElementVisitor<R, A> {
  const BaseElementVisitor();

  R visitElement(Element e, A arg);

  @override
  R visitErroneousElement(ErroneousElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitWarnOnUseElement(WarnOnUseElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitAmbiguousElement(AmbiguousElement e, A arg) {
    return visitElement(e, arg);
  }

  R visitScopeContainerElement(ScopeContainerElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitCompilationUnitElement(CompilationUnitElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitLibraryElement(LibraryElement e, A arg) {
    return visitScopeContainerElement(e, arg);
  }

  @override
  R visitImportElement(ImportElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitExportElement(ExportElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitPrefixElement(PrefixElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitTypedefElement(TypedefElement e, A arg) {
    return visitElement(e, arg);
  }

  R visitVariableElement(VariableElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitLocalVariableElement(LocalVariableElement e, A arg) {
    return visitVariableElement(e, arg);
  }

  @override
  R visitParameterElement(ParameterElement e, A arg) {
    return visitVariableElement(e, arg);
  }

  @override
  R visitFormalElement(FormalElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitFieldElement(FieldElement e, A arg) {
    return visitVariableElement(e, arg);
  }

  @override
  R visitFieldParameterElement(InitializingFormalElement e, A arg) {
    return visitParameterElement(e, arg);
  }

  @override
  R visitAbstractFieldElement(AbstractFieldElement e, A arg) {
    return visitElement(e, arg);
  }

  R visitFunctionElement(FunctionElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitMethodElement(MethodElement e, A arg) {
    return visitFunctionElement(e, arg);
  }

  @override
  R visitGetterElement(GetterElement e, A arg) {
    return visitFunctionElement(e, arg);
  }

  @override
  R visitSetterElement(SetterElement e, A arg) {
    return visitFunctionElement(e, arg);
  }

  @override
  R visitLocalFunctionElement(LocalFunctionElement e, A arg) {
    return visitFunctionElement(e, arg);
  }

  @override
  R visitConstructorElement(ConstructorElement e, A arg) {
    return visitFunctionElement(e, arg);
  }

  @override
  R visitConstructorBodyElement(ConstructorBodyElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitClassElement(ClassElement e, A arg) {
    return visitScopeContainerElement(e, arg);
  }

  R visitTypeDeclarationElement(TypeDeclarationElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitMixinApplicationElement(MixinApplicationElement e, A arg) {
    return visitClassElement(e, arg);
  }

  @override
  R visitEnumClassElement(EnumClassElement e, A arg) {
    return visitClassElement(e, arg);
  }

  @override
  R visitTypeVariableElement(TypeVariableElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitBoxFieldElement(BoxFieldElement e, A arg) {
    return visitElement(e, arg);
  }

  @override
  R visitClosureClassElement(ClosureClassElement e, A arg) {
    return visitClassElement(e, arg);
  }

  @override
  R visitClosureFieldElement(ClosureFieldElement e, A arg) {
    return visitVariableElement(e, arg);
  }
}
