// 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 'elements.dart';
import '../closure.dart'
    show BoxFieldElement,
         ClosureClassElement,
         ClosureFieldElement;

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 visitVariableElement(VariableElement 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);
  }

  @override
  R visitVariableElement(VariableElement e, A arg) {
    return visitElement(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);
  }
}