/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.engine.element.visitor; import com.google.dart.engine.element.ClassElement; import com.google.dart.engine.element.CompilationUnitElement; import com.google.dart.engine.element.ConstructorElement; import com.google.dart.engine.element.Element; import com.google.dart.engine.element.ElementVisitor; import com.google.dart.engine.element.EmbeddedHtmlScriptElement; import com.google.dart.engine.element.ExecutableElement; import com.google.dart.engine.element.ExportElement; import com.google.dart.engine.element.ExternalHtmlScriptElement; import com.google.dart.engine.element.FieldElement; import com.google.dart.engine.element.FieldFormalParameterElement; import com.google.dart.engine.element.FunctionElement; import com.google.dart.engine.element.FunctionTypeAliasElement; import com.google.dart.engine.element.HtmlElement; import com.google.dart.engine.element.HtmlScriptElement; import com.google.dart.engine.element.ImportElement; import com.google.dart.engine.element.LabelElement; import com.google.dart.engine.element.LibraryElement; import com.google.dart.engine.element.LocalElement; import com.google.dart.engine.element.LocalVariableElement; import com.google.dart.engine.element.MethodElement; import com.google.dart.engine.element.MultiplyDefinedElement; import com.google.dart.engine.element.ParameterElement; import com.google.dart.engine.element.PrefixElement; import com.google.dart.engine.element.PropertyAccessorElement; import com.google.dart.engine.element.PropertyInducingElement; import com.google.dart.engine.element.ToolkitObjectElement; import com.google.dart.engine.element.TopLevelVariableElement; import com.google.dart.engine.element.TypeParameterElement; import com.google.dart.engine.element.VariableElement; import com.google.dart.engine.element.angular.AngularComponentElement; import com.google.dart.engine.element.angular.AngularControllerElement; import com.google.dart.engine.element.angular.AngularDecoratorElement; import com.google.dart.engine.element.angular.AngularElement; import com.google.dart.engine.element.angular.AngularFormatterElement; import com.google.dart.engine.element.angular.AngularHasSelectorElement; import com.google.dart.engine.element.angular.AngularPropertyElement; import com.google.dart.engine.element.angular.AngularScopePropertyElement; import com.google.dart.engine.element.angular.AngularSelectorElement; import com.google.dart.engine.element.angular.AngularViewElement; import com.google.dart.engine.element.polymer.PolymerAttributeElement; import com.google.dart.engine.element.polymer.PolymerElement; import com.google.dart.engine.element.polymer.PolymerTagDartElement; import com.google.dart.engine.element.polymer.PolymerTagHtmlElement; /** * Instances of the class {@code GeneralizingElementVisitor} implement an element visitor that will * recursively visit all of the elements in an element model (like instances of the class * {@link RecursiveElementVisitor}). In addition, when an element of a specific type is visited not * only will the visit method for that specific type of element be invoked, but additional methods * for the supertypes of that element will also be invoked. For example, using an instance of this * class to visit a {@link MethodElement} will cause the method * {@link #visitMethodElement(MethodElement)} to be invoked but will also cause the methods * {@link #visitExecutableElement(ExecutableElement)} and {@link #visitElement(Element)} to be * subsequently invoked. This allows visitors to be written that visit all executable elements * without needing to override the visit method for each of the specific subclasses of * {@link ExecutableElement}. * <p> * Note, however, that unlike many visitors, element visitors visit objects based on the interfaces * implemented by those elements. Because interfaces form a graph structure rather than a tree * structure the way classes do, and because it is generally undesirable for an object to be visited * more than once, this class flattens the interface graph into a pseudo-tree. In particular, this * class treats elements as if the element types were structured in the following way: * <p> * * <pre> * Element * ClassElement * CompilationUnitElement * ExecutableElement * ConstructorElement * LocalElement * FunctionElement * MethodElement * PropertyAccessorElement * ExportElement * HtmlElement * ImportElement * LabelElement * LibraryElement * MultiplyDefinedElement * PrefixElement * TypeAliasElement * TypeParameterElement * UndefinedElement * VariableElement * PropertyInducingElement * FieldElement * TopLevelVariableElement * LocalElement * LocalVariableElement * ParameterElement * FieldFormalParameterElement * </pre> * <p> * Subclasses that override a visit method must either invoke the overridden visit method or * explicitly invoke the more general visit method. Failure to do so will cause the visit methods * for superclasses of the element to not be invoked and will cause the children of the visited node * to not be visited. * * @coverage dart.engine.element */ public class GeneralizingElementVisitor<R> implements ElementVisitor<R> { @Override public R visitAngularComponentElement(AngularComponentElement element) { return visitAngularHasSelectorElement(element); } @Override public R visitAngularControllerElement(AngularControllerElement element) { return visitAngularHasSelectorElement(element); } @Override public R visitAngularDirectiveElement(AngularDecoratorElement element) { return visitAngularHasSelectorElement(element); } public R visitAngularElement(AngularElement element) { return visitToolkitObjectElement(element); } @Override public R visitAngularFormatterElement(AngularFormatterElement element) { return visitAngularElement(element); } public R visitAngularHasSelectorElement(AngularHasSelectorElement element) { return visitAngularElement(element); } @Override public R visitAngularPropertyElement(AngularPropertyElement element) { return visitAngularElement(element); } @Override public R visitAngularScopePropertyElement(AngularScopePropertyElement element) { return visitAngularElement(element); } @Override public R visitAngularSelectorElement(AngularSelectorElement element) { return visitAngularElement(element); } @Override public R visitAngularViewElement(AngularViewElement element) { return visitAngularElement(element); } @Override public R visitClassElement(ClassElement element) { return visitElement(element); } @Override public R visitCompilationUnitElement(CompilationUnitElement element) { return visitElement(element); } @Override public R visitConstructorElement(ConstructorElement element) { return visitExecutableElement(element); } public R visitElement(Element element) { element.visitChildren(this); return null; } @Override public R visitEmbeddedHtmlScriptElement(EmbeddedHtmlScriptElement element) { return visitHtmlScriptElement(element); } public R visitExecutableElement(ExecutableElement element) { return visitElement(element); } @Override public R visitExportElement(ExportElement element) { return visitElement(element); } @Override public R visitExternalHtmlScriptElement(ExternalHtmlScriptElement element) { return visitHtmlScriptElement(element); } @Override public R visitFieldElement(FieldElement element) { return visitPropertyInducingElement(element); } @Override public R visitFieldFormalParameterElement(FieldFormalParameterElement element) { return visitParameterElement(element); } @Override public R visitFunctionElement(FunctionElement element) { return visitLocalElement(element); } @Override public R visitFunctionTypeAliasElement(FunctionTypeAliasElement element) { return visitElement(element); } @Override public R visitHtmlElement(HtmlElement element) { return visitElement(element); } public R visitHtmlScriptElement(HtmlScriptElement element) { return visitElement(element); } @Override public R visitImportElement(ImportElement element) { return visitElement(element); } @Override public R visitLabelElement(LabelElement element) { return visitElement(element); } @Override public R visitLibraryElement(LibraryElement element) { return visitElement(element); } public R visitLocalElement(LocalElement element) { if (element instanceof LocalVariableElement) { return visitVariableElement((LocalVariableElement) element); } else if (element instanceof ParameterElement) { return visitVariableElement((ParameterElement) element); } else if (element instanceof FunctionElement) { return visitExecutableElement((FunctionElement) element); } return null; } @Override public R visitLocalVariableElement(LocalVariableElement element) { return visitLocalElement(element); } @Override public R visitMethodElement(MethodElement element) { return visitExecutableElement(element); } @Override public R visitMultiplyDefinedElement(MultiplyDefinedElement element) { return visitElement(element); } @Override public R visitParameterElement(ParameterElement element) { return visitLocalElement(element); } @Override public R visitPolymerAttributeElement(PolymerAttributeElement element) { return visitPolymerElement(element); } public R visitPolymerElement(PolymerElement element) { return visitToolkitObjectElement(element); } @Override public R visitPolymerTagDartElement(PolymerTagDartElement element) { return visitPolymerElement(element); } @Override public R visitPolymerTagHtmlElement(PolymerTagHtmlElement element) { return visitPolymerElement(element); } @Override public R visitPrefixElement(PrefixElement element) { return visitElement(element); } @Override public R visitPropertyAccessorElement(PropertyAccessorElement element) { return visitExecutableElement(element); } public R visitPropertyInducingElement(PropertyInducingElement element) { return visitVariableElement(element); } public R visitToolkitObjectElement(ToolkitObjectElement element) { return visitElement(element); } @Override public R visitTopLevelVariableElement(TopLevelVariableElement element) { return visitPropertyInducingElement(element); } @Override public R visitTypeParameterElement(TypeParameterElement element) { return visitElement(element); } public R visitVariableElement(VariableElement element) { return visitElement(element); } }