Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(768)

Unified Diff: pkg/analyzer_experimental/lib/src/generated/element.dart

Issue 16337007: Version 0.5.13.1 . (Closed) Base URL: http://dart.googlecode.com/svn/trunk/dart/
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer_experimental/lib/src/generated/element.dart
===================================================================
--- pkg/analyzer_experimental/lib/src/generated/element.dart (revision 23549)
+++ pkg/analyzer_experimental/lib/src/generated/element.dart (working copy)
@@ -15,12 +15,14 @@
import 'constant.dart' show EvaluationResultImpl;
import 'utilities_dart.dart';
+
/**
* The interface {@code Annotation} defines the behavior of objects representing a single annotation
* associated with an element.
* @coverage dart.engine.element
*/
abstract class Annotation {
+
/**
* Return the element representing the field, variable, or const constructor being used as an
* annotation.
@@ -28,47 +30,83 @@
*/
Element get element;
}
+
/**
* The interface {@code ClassElement} defines the behavior of elements that represent a class.
* @coverage dart.engine.element
*/
abstract class ClassElement implements Element {
+
/**
* Return an array containing all of the accessors (getters and setters) declared in this class.
* @return the accessors declared in this class
*/
List<PropertyAccessorElement> get accessors;
+
/**
- * Return an array containing all the supertypes defined for this class and its supertypes.
+ * Return an array containing all the supertypes defined for this class and its supertypes. This
+ * includes superclasses, mixins and interfaces.
* @return all the supertypes of this class, including mixins
*/
List<InterfaceType> get allSupertypes;
+
/**
* Return an array containing all of the constructors declared in this class.
* @return the constructors declared in this class
*/
List<ConstructorElement> get constructors;
+
/**
* Return an array containing all of the fields declared in this class.
* @return the fields declared in this class
*/
List<FieldElement> get fields;
+
/**
+ * Return the element representing the getter with the given name that is declared in this class,
+ * or {@code null} if this class does not declare a getter with the given name.
+ * @param getterName the name of the getter to be returned
+ * @return the getter declared in this class with the given name
+ */
+ PropertyAccessorElement getGetter(String getterName);
+
+ /**
* Return an array containing all of the interfaces that are implemented by this class.
+ * <p>
+ * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
+ * to be semantically invalid. In particular, it is not safe to assume that the inheritance
+ * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
+ * must explicitly guard against infinite loops.
* @return the interfaces that are implemented by this class
*/
List<InterfaceType> get interfaces;
+
/**
+ * Return the element representing the method with the given name that is declared in this class,
+ * or {@code null} if this class does not declare a method with the given name.
+ * @param methodName the name of the method to be returned
+ * @return the method declared in this class with the given name
+ */
+ MethodElement getMethod(String methodName);
+
+ /**
* Return an array containing all of the methods declared in this class.
* @return the methods declared in this class
*/
List<MethodElement> get methods;
+
/**
* Return an array containing all of the mixins that are applied to the class being extended in
* order to derive the superclass of this class.
+ * <p>
+ * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
+ * to be semantically invalid. In particular, it is not safe to assume that the inheritance
+ * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
+ * must explicitly guard against infinite loops.
* @return the mixins that are applied to derive the superclass of this class
*/
List<InterfaceType> get mixins;
+
/**
* Return the named constructor declared in this class with the given name, or {@code null} if
* this class does not declare a named constructor with the given name.
@@ -76,23 +114,40 @@
* @return the element representing the specified constructor
*/
ConstructorElement getNamedConstructor(String name);
+
/**
+ * Return the element representing the setter with the given name that is declared in this class,
+ * or {@code null} if this class does not declare a setter with the given name.
+ * @param setterName the name of the getter to be returned
+ * @return the setter declared in this class with the given name
+ */
+ PropertyAccessorElement getSetter(String setterName);
+
+ /**
* Return the superclass of this class, or {@code null} if the class represents the class
* 'Object'. All other classes will have a non-{@code null} superclass. If the superclass was not
* explicitly declared then the implicit superclass 'Object' will be returned.
+ * <p>
+ * <b>Note:</b> Because the element model represents the state of the code, it is possible for it
+ * to be semantically invalid. In particular, it is not safe to assume that the inheritance
+ * structure of a class does not contain a cycle. Clients that traverse the inheritance structure
+ * must explicitly guard against infinite loops.
* @return the superclass of this class
*/
InterfaceType get supertype;
+
/**
* Return the type defined by the class.
* @return the type defined by the class
*/
InterfaceType get type;
+
/**
* Return an array containing all of the type variables declared for this class.
* @return the type variables declared for this class
*/
List<TypeVariableElement> get typeVariables;
+
/**
* Return the unnamed constructor declared in this class, or {@code null} if this class does not
* declare an unnamed constructor but does declare named constructors. The returned constructor
@@ -101,17 +156,33 @@
* @return the unnamed constructor defined in this class
*/
ConstructorElement get unnamedConstructor;
+
/**
+ * Return {@code true} if this class or its superclass declares a non-final instance field.
+ * @return {@code true} if this class or its superclass declares a non-final instance field
+ */
+ bool hasNonFinalField();
+
+ /**
+ * Return {@code true} if this class has reference to super (so, for example, cannot be used as a
+ * mixin).
+ * @return {@code true} if this class has reference to super
+ */
+ bool hasReferenceToSuper();
+
+ /**
* Return {@code true} if this class is abstract. A class is abstract if it has an explicit{@code abstract} modifier. Note, that this definition of <i>abstract</i> is different from
* <i>has unimplemented members</i>.
* @return {@code true} if this class is abstract
*/
bool isAbstract();
+
/**
* Return {@code true} if this class is defined by a typedef construct.
* @return {@code true} if this class is defined by a typedef construct
*/
bool isTypedef();
+
/**
* Return {@code true} if this class can validly be used as a mixin when defining another class.
* The behavior of this method is defined by the Dart Language Specification in section 9:
@@ -122,23 +193,8 @@
* @return {@code true} if this class can validly be used as a mixin
*/
bool isValidMixin();
+
/**
- * Return the executable element representing the method, getter or setter that results from
- * looking up the given member in this class with respect to the given library, or {@code null} if
- * the look up fails. This method is used to determine what member the passed name is inherited
- * from. The behavior of this method is defined by the Dart Language Specification in section
- * 8.1.1: Let <i>C</i> be a class declared in library <i>L</i> with superclass <i>S</i> and let
- * <i>C</i> declare an instance member <i>m</i>, and assume <i>S</i> declares an instance member
- * </i>m'</i> with the same name as m. Then <i>m</i> overrides m'</i> iff <i>m'</i> is accessible
- * to <i>L</i>, <i>m</i> has the same name as <i>m'</i> and neither <i>m</i> nor <i>m'</i> are
- * fields.
- * @param memberName the name of the member being looked up
- * @param library the library with respect to which the lookup is being performed
- * @return the result of looking up the given member in this class with respect to the given
- * library
- */
- ExecutableElement lookUpExecutable(String memberName, LibraryElement library);
- /**
* Return the element representing the getter that results from looking up the given getter in
* this class with respect to the given library, or {@code null} if the look up fails. The
* behavior of this method is defined by the Dart Language Specification in section 12.15.1:
@@ -158,6 +214,7 @@
* library
*/
PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library);
+
/**
* Return the element representing the method that results from looking up the given method in
* this class with respect to the given library, or {@code null} if the look up fails. The
@@ -177,6 +234,7 @@
* library
*/
MethodElement lookUpMethod(String methodName, LibraryElement library);
+
/**
* Return the element representing the setter that results from looking up the given setter in
* this class with respect to the given library, or {@code null} if the look up fails. The
@@ -198,38 +256,45 @@
*/
PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
}
+
/**
* The interface {@code CompilationUnitElement} defines the behavior of elements representing a
* compilation unit.
* @coverage dart.engine.element
*/
-abstract class CompilationUnitElement implements Element {
+abstract class CompilationUnitElement implements Element, UriReferencedElement {
+
/**
* Return an array containing all of the top-level accessors (getters and setters) contained in
* this compilation unit.
* @return the top-level accessors contained in this compilation unit
*/
List<PropertyAccessorElement> get accessors;
+
/**
* Return the library in which this compilation unit is defined.
* @return the library in which this compilation unit is defined
*/
LibraryElement get enclosingElement;
+
/**
* Return an array containing all of the top-level functions contained in this compilation unit.
* @return the top-level functions contained in this compilation unit
*/
List<FunctionElement> get functions;
+
/**
* Return an array containing all of the function type aliases contained in this compilation unit.
* @return the function type aliases contained in this compilation unit
*/
List<FunctionTypeAliasElement> get functionTypeAliases;
+
/**
* Return an array containing all of the top-level variables contained in this compilation unit.
* @return the top-level variables contained in this compilation unit
*/
List<TopLevelVariableElement> get topLevelVariables;
+
/**
* Return the class defined in this compilation unit that has the given name, or {@code null} if
* this compilation unit does not define a class with the given name.
@@ -237,34 +302,46 @@
* @return the class with the given name that is defined in this compilation unit
*/
ClassElement getType(String className);
+
/**
* Return an array containing all of the classes contained in this compilation unit.
* @return the classes contained in this compilation unit
*/
List<ClassElement> get types;
}
+
/**
* The interface {@code ConstructorElement} defines the behavior of elements representing a
* constructor or a factory method defined within a type.
* @coverage dart.engine.element
*/
abstract class ConstructorElement implements ExecutableElement {
+
/**
* Return the type in which this constructor is defined.
* @return the type in which this constructor is defined
*/
ClassElement get enclosingElement;
+
/**
+ * Return the constructor to which this constructor is redirecting.
+ * @return the constructor to which this constructor is redirecting
+ */
+ ConstructorElement get redirectedConstructor;
+
+ /**
* Return {@code true} if this constructor is a const constructor.
* @return {@code true} if this constructor is a const constructor
*/
bool isConst();
+
/**
* Return {@code true} if this constructor represents a factory constructor.
* @return {@code true} if this constructor represents a factory constructor
*/
bool isFactory();
}
+
/**
* The interface {@code Element} defines the behavior common to all of the elements in the element
* model. Generally speaking, the element model is a semantic model of the program that represents
@@ -287,17 +364,20 @@
* @coverage dart.engine.element
*/
abstract class Element {
+
/**
* A comparator that can be used to sort elements by their name offset. Elements with a smaller
* offset will be sorted to be before elements with a larger name offset.
*/
static Comparator<Element> SORT_BY_OFFSET = (Element firstElement, Element secondElement) => firstElement.nameOffset - secondElement.nameOffset;
+
/**
* Use the given visitor to visit this element.
* @param visitor the visitor that will visit this element
* @return the value returned by the visitor as a result of visiting this element
*/
accept(ElementVisitor visitor);
+
/**
* Return the documentation comment for this element as it appears in the original source
* (complete with the beginning and ending delimiters), or {@code null} if this element does not
@@ -308,28 +388,42 @@
* analysis could not be performed
*/
String computeDocumentationComment();
+
/**
* Return the element of the given class that most immediately encloses this element, or{@code null} if there is no enclosing element of the given class.
* @param elementClass the class of the element to be returned
* @return the element that encloses this element
*/
Element getAncestor(Type elementClass);
+
/**
* Return the analysis context in which this element is defined.
* @return the analysis context in which this element is defined
*/
AnalysisContext get context;
+
/**
+ * Return the display name of this element, or {@code null} if this element does not have a name.
+ * <p>
+ * In most cases the name and the display name are the same. Differences though are cases such as
+ * setters where the name of some setter {@code set f(x)} is {@code f=}, instead of {@code f}.
+ * @return the display name of this element
+ */
+ String get displayName;
+
+ /**
* Return the element that either physically or logically encloses this element. This will be{@code null} if this element is a library because libraries are the top-level elements in the
* model.
* @return the element that encloses this element
*/
Element get enclosingElement;
+
/**
* Return the kind of element that this is.
* @return the kind of this element
*/
ElementKind get kind;
+
/**
* Return the library that contains this element. This will be the element itself if it is a
* library element. This will be {@code null} if this element is an HTML file because HTML files
@@ -337,22 +431,26 @@
* @return the library that contains this element
*/
LibraryElement get library;
+
/**
* Return an object representing the location of this element in the element model. The object can
* be used to locate this element at a later time.
* @return the location of this element in the element model
*/
ElementLocation get location;
+
/**
* Return an array containing all of the metadata associated with this element.
* @return the metadata associated with this element
*/
List<Annotation> get metadata;
+
/**
* Return the name of this element, or {@code null} if this element does not have a name.
* @return the name of this element
*/
String get name;
+
/**
* Return the offset of the name of this element in the file that contains the declaration of this
* element, or {@code -1} if this element is synthetic, does not have a name, or otherwise does
@@ -360,12 +458,14 @@
* @return the offset of the name of this element
*/
int get nameOffset;
+
/**
* Return the source that contains this element, or {@code null} if this element is not contained
* in a source.
* @return the source that contains this element
*/
Source get source;
+
/**
* Return {@code true} if this element, assuming that it is within scope, is accessible to code in
* the given library. This is defined by the Dart Language Specification in section 3.2:
@@ -375,6 +475,7 @@
* @return {@code true} if this element is accessible to code in the given library
*/
bool isAccessibleIn(LibraryElement library);
+
/**
* Return {@code true} if this element is synthetic. A synthetic element is an element that is not
* represented in the source code explicitly, but is implied by the source code, such as the
@@ -382,6 +483,7 @@
* @return {@code true} if this element is synthetic
*/
bool isSynthetic();
+
/**
* Use the given visitor to visit all of the children of this element. There is no guarantee of
* the order in which the children will be visited.
@@ -389,6 +491,7 @@
*/
void visitChildren(ElementVisitor<Object> visitor);
}
+
/**
* The enumeration {@code ElementKind} defines the various kinds of elements in the element model.
* @coverage dart.engine.element
@@ -420,9 +523,13 @@
static final ElementKind TYPE_VARIABLE = new ElementKind('TYPE_VARIABLE', 23, "type variable");
static final ElementKind UNIVERSE = new ElementKind('UNIVERSE', 24, "<universe>");
static final List<ElementKind> values = [CLASS, COMPILATION_UNIT, CONSTRUCTOR, DYNAMIC, EMBEDDED_HTML_SCRIPT, ERROR, EXPORT, EXTERNAL_HTML_SCRIPT, FIELD, FUNCTION, GETTER, HTML, IMPORT, LABEL, LIBRARY, LOCAL_VARIABLE, METHOD, NAME, PARAMETER, PREFIX, SETTER, TOP_LEVEL_VARIABLE, FUNCTION_TYPE_ALIAS, TYPE_VARIABLE, UNIVERSE];
- final String __name;
- final int __ordinal;
- int get ordinal => __ordinal;
+
+ /// The name of this enum constant, as declared in the enum declaration.
+ final String name;
+
+ /// The position in the enum declaration.
+ final int ordinal;
+
/**
* Return the kind of the given element, or {@link #ERROR} if the element is {@code null}. This is
* a utility method that can reduce the need for null checks in other places.
@@ -435,31 +542,36 @@
}
return element.kind;
}
+
/**
* The name displayed in the UI for this kind of element.
*/
String _displayName;
+
/**
* Initialize a newly created element kind to have the given display name.
* @param displayName the name displayed in the UI for this kind of element
*/
- ElementKind(this.__name, this.__ordinal, String displayName) {
+ ElementKind(this.name, this.ordinal, String displayName) {
this._displayName = displayName;
}
+
/**
* Return the name displayed in the UI for this kind of element.
* @return the name of this {@link ElementKind} to display in UI.
*/
String get displayName => _displayName;
- int compareTo(ElementKind other) => __ordinal - other.__ordinal;
- String toString() => __name;
+ int compareTo(ElementKind other) => ordinal - other.ordinal;
+ String toString() => name;
}
+
/**
* The interface {@code ElementLocation} defines the behavior of objects that represent the location
* of an element within the element model.
* @coverage dart.engine.element
*/
abstract class ElementLocation {
+
/**
* Return an encoded representation of this location that can be used to create a location that is
* equal to this location.
@@ -467,6 +579,7 @@
*/
String get encoding;
}
+
/**
* The interface {@code ElementVisitor} defines the behavior of objects that can be used to visit an
* element structure.
@@ -496,49 +609,58 @@
R visitTopLevelVariableElement(TopLevelVariableElement element);
R visitTypeVariableElement(TypeVariableElement element);
}
+
/**
* The interface {@code EmbeddedHtmlScriptElement} defines the behavior of elements representing a
* script tag in an HTML file having content that defines a Dart library.
* @coverage dart.engine.element
*/
abstract class EmbeddedHtmlScriptElement implements HtmlScriptElement {
+
/**
* Return the library element defined by the content of the script tag.
* @return the library element (not {@code null})
*/
LibraryElement get scriptLibrary;
}
+
/**
* The interface {@code ExecutableElement} defines the behavior of elements representing an
* executable object, including functions, methods, constructors, getters, and setters.
* @coverage dart.engine.element
*/
abstract class ExecutableElement implements Element {
+
/**
* Return an array containing all of the functions defined within this executable element.
* @return the functions defined within this executable element
*/
List<FunctionElement> get functions;
+
/**
* Return an array containing all of the labels defined within this executable element.
* @return the labels defined within this executable element
*/
List<LabelElement> get labels;
+
/**
* Return an array containing all of the local variables defined within this executable element.
* @return the local variables defined within this executable element
*/
List<LocalVariableElement> get localVariables;
+
/**
* Return an array containing all of the parameters defined by this executable element.
* @return the parameters defined by this executable element
*/
List<ParameterElement> get parameters;
+
/**
* Return the type of function defined by this executable element.
* @return the type of function defined by this executable element
*/
FunctionType get type;
+
/**
* Return {@code true} if this executable element is an operator. The test may be based on the
* name of the executable element, in which case the result will be correct when the name is
@@ -546,6 +668,7 @@
* @return {@code true} if this executable element is an operator
*/
bool isOperator();
+
/**
* Return {@code true} if this element is a static element. A static element is an element that is
* not associated with a particular instance, but rather with an entire library or class.
@@ -553,28 +676,33 @@
*/
bool isStatic();
}
+
/**
* The interface {@code ExportElement} defines the behavior of objects representing information
* about a single export directive within a library.
* @coverage dart.engine.element
*/
-abstract class ExportElement implements Element {
+abstract class ExportElement implements Element, UriReferencedElement {
+
/**
* An empty array of export elements.
*/
static List<ExportElement> EMPTY_ARRAY = new List<ExportElement>(0);
+
/**
* Return an array containing the combinators that were specified as part of the export directive
* in the order in which they were specified.
* @return the combinators specified in the export directive
*/
List<NamespaceCombinator> get combinators;
+
/**
* Return the library that is exported from this library by this export directive.
* @return the library that is exported from this library
*/
LibraryElement get exportedLibrary;
}
+
/**
* The interface {@code ExternalHtmlScriptElement} defines the behavior of elements representing a
* script tag in an HTML file having a {@code source} attribute that references a Dart library
@@ -582,6 +710,7 @@
* @coverage dart.engine.element
*/
abstract class ExternalHtmlScriptElement implements HtmlScriptElement {
+
/**
* Return the source referenced by this element, or {@code null} if this element does not
* reference a Dart library source file.
@@ -589,23 +718,27 @@
*/
Source get scriptSource;
}
+
/**
* The interface {@code FieldElement} defines the behavior of elements representing a field defined
* within a type.
* @coverage dart.engine.element
*/
abstract class FieldElement implements PropertyInducingElement {
+
/**
* Return the type in which this field is defined.
* @return the type in which this field is defined
*/
ClassElement get enclosingElement;
}
+
/**
* The interface {@code FieldFormalParameterElement} defines the behavior of elements representing a
* field formal parameter defined within a constructor element.
*/
abstract class FieldFormalParameterElement implements ParameterElement {
+
/**
* Return the field element associated with this field formal parameter, or {@code null} if the
* parameter references a field that doesn't exist.
@@ -613,45 +746,53 @@
*/
FieldElement get field;
}
+
/**
* The interface {@code FunctionElement} defines the behavior of elements representing a function.
* @coverage dart.engine.element
*/
abstract class FunctionElement implements ExecutableElement, LocalElement {
}
+
/**
* The interface {@code FunctionTypeAliasElement} defines the behavior of elements representing a
* function type alias ({@code typedef}).
* @coverage dart.engine.element
*/
abstract class FunctionTypeAliasElement implements Element {
+
/**
* Return the compilation unit in which this type alias is defined.
* @return the compilation unit in which this type alias is defined
*/
CompilationUnitElement get enclosingElement;
+
/**
* Return an array containing all of the parameters defined by this type alias.
* @return the parameters defined by this type alias
*/
List<ParameterElement> get parameters;
+
/**
* Return the type of function defined by this type alias.
* @return the type of function defined by this type alias
*/
FunctionType get type;
+
/**
* Return an array containing all of the type variables defined for this type.
* @return the type variables defined for this type
*/
List<TypeVariableElement> get typeVariables;
}
+
/**
* The interface {@code HideCombinator} defines the behavior of combinators that cause some of the
* names in a namespace to be hidden when being imported.
* @coverage dart.engine.element
*/
abstract class HideCombinator implements NamespaceCombinator {
+
/**
* Return an array containing the names that are not to be made visible in the importing library
* even if they are defined in the imported library.
@@ -659,11 +800,13 @@
*/
List<String> get hiddenNames;
}
+
/**
* The interface {@code HtmlElement} defines the behavior of elements representing an HTML file.
* @coverage dart.engine.element
*/
abstract class HtmlElement implements Element {
+
/**
* Return an array containing all of the script elements contained in the HTML file. This includes
* scripts with libraries that are defined by the content of a script tag as well as libraries
@@ -672,6 +815,7 @@
*/
List<HtmlScriptElement> get scripts;
}
+
/**
* The interface {@code HtmlScriptElement} defines the behavior of elements representing a script
* tag in an HTML file.
@@ -681,27 +825,32 @@
*/
abstract class HtmlScriptElement implements Element {
}
+
/**
* The interface {@code ImportElement} defines the behavior of objects representing information
* about a single import directive within a library.
* @coverage dart.engine.element
*/
-abstract class ImportElement implements Element {
+abstract class ImportElement implements Element, UriReferencedElement {
+
/**
* An empty array of import elements.
*/
static List<ImportElement> EMPTY_ARRAY = new List<ImportElement>(0);
+
/**
* Return an array containing the combinators that were specified as part of the import directive
* in the order in which they were specified.
* @return the combinators specified in the import directive
*/
List<NamespaceCombinator> get combinators;
+
/**
* Return the library that is imported into this library by this import directive.
* @return the library that is imported into this library
*/
LibraryElement get importedLibrary;
+
/**
* Return the prefix that was specified as part of the import directive, or {@code null} if there
* was no prefix specified.
@@ -709,44 +858,52 @@
*/
PrefixElement get prefix;
}
+
/**
* The interface {@code LabelElement} defines the behavior of elements representing a label
* associated with a statement.
* @coverage dart.engine.element
*/
abstract class LabelElement implements Element {
+
/**
* Return the executable element in which this label is defined.
* @return the executable element in which this label is defined
*/
ExecutableElement get enclosingElement;
}
+
/**
* The interface {@code LibraryElement} defines the behavior of elements representing a library.
* @coverage dart.engine.element
*/
abstract class LibraryElement implements Element {
+
/**
* Return the compilation unit that defines this library.
* @return the compilation unit that defines this library
*/
CompilationUnitElement get definingCompilationUnit;
+
/**
* Return the entry point for this library, or {@code null} if this library does not have an entry
* point. The entry point is defined to be a zero argument top-level function whose name is{@code main}.
* @return the entry point for this library
*/
FunctionElement get entryPoint;
+
/**
* Return an array containing all of the libraries that are exported from this library.
* @return an array containing all of the libraries that are exported from this library
*/
List<LibraryElement> get exportedLibraries;
+
/**
* Return an array containing all of the exports defined in this library.
* @return the exports defined in this library
*/
List<ExportElement> get exports;
+
/**
* Return an array containing all of the libraries that are imported into this library. This
* includes all of the libraries that are imported using a prefix (also available through the
@@ -754,23 +911,27 @@
* @return an array containing all of the libraries that are imported into this library
*/
List<LibraryElement> get importedLibraries;
+
/**
* Return an array containing all of the imports defined in this library.
* @return the imports defined in this library
*/
List<ImportElement> get imports;
+
/**
* Return an array containing all of the compilation units that are included in this library using
* a {@code part} directive. This does not include the defining compilation unit that contains the{@code part} directives.
* @return the compilation units that are included in this library
*/
List<CompilationUnitElement> get parts;
+
/**
* Return an array containing elements for each of the prefixes used to {@code import} libraries
* into this library. Each prefix can be used in more than one {@code import} directive.
* @return the prefixes used to {@code import} libraries into this library
*/
List<PrefixElement> get prefixes;
+
/**
* Return the class defined in this library that has the given name, or {@code null} if this
* library does not define a class with the given name.
@@ -778,16 +939,19 @@
* @return the class with the given name that is defined in this library
*/
ClassElement getType(String className);
+
/**
* Answer {@code true} if this library is an application that can be run in the browser.
* @return {@code true} if this library is an application that can be run in the browser
*/
bool isBrowserApplication();
+
/**
* Return {@code true} if this library is the dart:core library.
* @return {@code true} if this library is the dart:core library
*/
bool isDartCore();
+
/**
* Return {@code true} if this library is up to date with respect to the given time stamp. If any
* transitively referenced Source is newer than the time stamp, this method returns false.
@@ -796,12 +960,14 @@
*/
bool isUpToDate2(int timeStamp);
}
+
/**
* The interface {@code LocalElement} defines the behavior of elements that can be (but are not
* required to be) defined within a method or function (an {@link ExecutableElement}).
* @coverage dart.engine.element
*/
abstract class LocalElement implements Element {
+
/**
* Return a source range that covers the approximate portion of the source in which the name of
* this element is visible, or {@code null} if there is no single range of characters within which
@@ -820,6 +986,7 @@
*/
SourceRange get visibleRange;
}
+
/**
* The interface {@code LocalVariableElement} defines the behavior common to elements that represent
* a local variable.
@@ -827,17 +994,20 @@
*/
abstract class LocalVariableElement implements LocalElement, VariableElement {
}
+
/**
* The interface {@code MethodElement} defines the behavior of elements that represent a method
* defined within a type.
* @coverage dart.engine.element
*/
abstract class MethodElement implements ExecutableElement {
+
/**
* Return the type in which this method is defined.
* @return the type in which this method is defined
*/
ClassElement get enclosingElement;
+
/**
* Return {@code true} if this method is abstract. Methods are abstract if they are not external
* and have no body.
@@ -845,6 +1015,7 @@
*/
bool isAbstract();
}
+
/**
* The interface {@code MultiplyDefinedElement} defines the behavior of pseudo-elements that
* represent multiple elements defined within a single scope that have the same name. This situation
@@ -854,6 +1025,7 @@
* @coverage dart.engine.element
*/
abstract class MultiplyDefinedElement implements Element {
+
/**
* Return an array containing all of the elements that were defined within the scope to have the
* same name.
@@ -861,57 +1033,67 @@
*/
List<Element> get conflictingElements;
}
+
/**
* The interface {@code NamespaceCombinator} defines the behavior common to objects that control how
* namespaces are combined.
* @coverage dart.engine.element
*/
abstract class NamespaceCombinator {
+
/**
* An empty array of namespace combinators.
*/
static List<NamespaceCombinator> EMPTY_ARRAY = new List<NamespaceCombinator>(0);
}
+
/**
* The interface {@code ParameterElement} defines the behavior of elements representing a parameter
* defined within an executable element.
* @coverage dart.engine.element
*/
abstract class ParameterElement implements LocalElement, VariableElement {
+
/**
* Return the kind of this parameter.
* @return the kind of this parameter
*/
ParameterKind get parameterKind;
+
/**
* Return an array containing all of the parameters defined by this parameter. A parameter will
* only define other parameters if it is a function typed parameter.
* @return the parameters defined by this parameter element
*/
List<ParameterElement> get parameters;
+
/**
* Return {@code true} if this parameter is an initializing formal parameter.
* @return {@code true} if this parameter is an initializing formal parameter
*/
bool isInitializingFormal();
}
+
/**
* The interface {@code PrefixElement} defines the behavior common to elements that represent a
* prefix used to import one or more libraries into another library.
* @coverage dart.engine.element
*/
abstract class PrefixElement implements Element {
+
/**
* Return the library into which other libraries are imported using this prefix.
* @return the library into which other libraries are imported using this prefix
*/
LibraryElement get enclosingElement;
+
/**
* Return an array containing all of the libraries that are imported using this prefix.
* @return the libraries that are imported using this prefix
*/
List<LibraryElement> get importedLibraries;
}
+
/**
* The interface {@code PropertyAccessorElement} defines the behavior of elements representing a
* getter or a setter. Note that explicitly defined property accessors implicitly define a synthetic
@@ -928,23 +1110,50 @@
* @coverage dart.engine.element
*/
abstract class PropertyAccessorElement implements ExecutableElement {
+
/**
+ * Return the accessor representing the getter that corresponds to (has the same name as) this
+ * setter, or {@code null} if this accessor is not a setter or if there is no corresponding
+ * getter.
+ * @return the getter that corresponds to this setter
+ */
+ PropertyAccessorElement get correspondingGetter;
+
+ /**
+ * Return the accessor representing the setter that corresponds to (has the same name as) this
+ * getter, or {@code null} if this accessor is not a getter or if there is no corresponding
+ * setter.
+ * @return the setter that corresponds to this getter
+ */
+ PropertyAccessorElement get correspondingSetter;
+
+ /**
* Return the field or top-level variable associated with this accessor. If this accessor was
* explicitly defined (is not synthetic) then the variable associated with it will be synthetic.
* @return the variable associated with this accessor
*/
PropertyInducingElement get variable;
+
/**
+ * Return {@code true} if this accessor is abstract. Accessors are abstract if they are not
+ * external and have no body.
+ * @return {@code true} if this accessor is abstract
+ */
+ bool isAbstract();
+
+ /**
* Return {@code true} if this accessor represents a getter.
* @return {@code true} if this accessor represents a getter
*/
bool isGetter();
+
/**
* Return {@code true} if this accessor represents a setter.
* @return {@code true} if this accessor represents a setter
*/
bool isSetter();
}
+
/**
* The interface {@code PropertyInducingElement} defines the behavior of elements representing a
* variable that has an associated getter and possibly a setter. Note that explicitly defined
@@ -962,12 +1171,14 @@
* @coverage dart.engine.element
*/
abstract class PropertyInducingElement implements VariableElement {
+
/**
* Return the getter associated with this variable. If this variable was explicitly defined (is
* not synthetic) then the getter associated with it will be synthetic.
* @return the getter associated with this variable
*/
PropertyAccessorElement get getter;
+
/**
* Return the setter associated with this variable, or {@code null} if the variable is effectively{@code final} and therefore does not have a setter associated with it. (This can happen either
* because the variable is explicitly defined as being {@code final} or because the variable is
@@ -976,6 +1187,7 @@
* @return the setter associated with this variable
*/
PropertyAccessorElement get setter;
+
/**
* Return {@code true} if this element is a static element. A static element is an element that is
* not associated with a particular instance, but rather with an entire library or class.
@@ -983,12 +1195,14 @@
*/
bool isStatic();
}
+
/**
* The interface {@code ShowCombinator} defines the behavior of combinators that cause some of the
* names in a namespace to be visible (and the rest hidden) when being imported.
* @coverage dart.engine.element
*/
abstract class ShowCombinator implements NamespaceCombinator {
+
/**
* Return an array containing the names that are to be made visible in the importing library if
* they are defined in the imported library.
@@ -996,6 +1210,7 @@
*/
List<String> get shownNames;
}
+
/**
* The interface {@code TopLevelVariableElement} defines the behavior of elements representing a
* top-level variable.
@@ -1003,24 +1218,28 @@
*/
abstract class TopLevelVariableElement implements PropertyInducingElement {
}
+
/**
* The interface {@code TypeVariableElement} defines the behavior of elements representing a type
* variable.
* @coverage dart.engine.element
*/
abstract class TypeVariableElement implements Element {
+
/**
* Return the type representing the bound associated with this variable, or {@code null} if this
* variable does not have an explicit bound.
* @return the type representing the bound associated with this variable
*/
Type2 get bound;
+
/**
* Return the type defined by this type variable.
* @return the type defined by this type variable
*/
TypeVariableType get type;
}
+
/**
* The interface {@code UndefinedElement} defines the behavior of pseudo-elements that represent
* names that are undefined. This situation is not allowed by the language, so objects implementing
@@ -1030,12 +1249,28 @@
*/
abstract class UndefinedElement implements Element {
}
+
/**
+ * The interface {@code UriReferencedElement} defines the behavior of objects included into a
+ * library using some URI.
+ * @coverage dart.engine.element
+ */
+abstract class UriReferencedElement implements Element {
+
+ /**
+ * Return the URI that is used to include this element into the enclosing library, or {@code null}if this is the defining compilation unit of a library.
+ * @return the URI that is used to include this element into the enclosing library
+ */
+ String get uri;
+}
+
+/**
* The interface {@code VariableElement} defines the behavior common to elements that represent a
* variable.
* @coverage dart.engine.element
*/
abstract class VariableElement implements Element {
+
/**
* Return a synthetic function representing this variable's initializer, or {@code null} if this
* variable does not have an initializer. The function will have no parameters. The return type of
@@ -1043,17 +1278,20 @@
* @return a synthetic function representing this variable's initializer
*/
FunctionElement get initializer;
+
/**
* Return the declared type of this variable, or {@code null} if the variable did not have a
* declared type (such as if it was declared using the keyword 'var').
* @return the declared type of this variable
*/
Type2 get type;
+
/**
* Return {@code true} if this variable was declared with the 'const' modifier.
* @return {@code true} if this variable was declared with the 'const' modifier
*/
bool isConst();
+
/**
* Return {@code true} if this variable was declared with the 'final' modifier. Variables that are
* declared with the 'const' modifier will return {@code false} even though they are implicitly
@@ -1062,6 +1300,7 @@
*/
bool isFinal();
}
+
/**
* 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
@@ -1155,6 +1394,7 @@
R visitTypeVariableElement(TypeVariableElement element) => visitElement(element);
R visitVariableElement(VariableElement element) => visitElement(element);
}
+
/**
* Instances of the class {@code RecursiveElementVisitor} implement an element visitor that will
* recursively visit all of the element in an element model. For example, using an instance of this
@@ -1256,6 +1496,7 @@
return null;
}
}
+
/**
* Instances of the class {@code SimpleElementVisitor} implement an element visitor that will do
* nothing when visiting an element. It is intended to be a superclass for classes that use the
@@ -1287,19 +1528,23 @@
R visitTopLevelVariableElement(TopLevelVariableElement element) => null;
R visitTypeVariableElement(TypeVariableElement element) => null;
}
+
/**
* Instances of the class {@code AnnotationImpl} implement an {@link Annotation}.
* @coverage dart.engine.element
*/
class AnnotationImpl implements Annotation {
+
/**
* The element representing the field, variable, or constructor being used as an annotation.
*/
Element _element;
+
/**
* An empty array of annotations.
*/
static List<AnnotationImpl> EMPTY_ARRAY = new List<AnnotationImpl>(0);
+
/**
* Initialize a newly created annotation.
* @param element the element representing the field, variable, or constructor being used as an
@@ -1311,52 +1556,64 @@
Element get element => _element;
String toString() => "@${_element.toString()}";
}
+
/**
* Instances of the class {@code ClassElementImpl} implement a {@code ClassElement}.
* @coverage dart.engine.element
*/
class ClassElementImpl extends ElementImpl implements ClassElement {
+
/**
* An array containing all of the accessors (getters and setters) contained in this class.
*/
List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the constructors contained in this class.
*/
List<ConstructorElement> _constructors = ConstructorElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the fields contained in this class.
*/
List<FieldElement> _fields = FieldElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the mixins that are applied to the class being extended in order to
* derive the superclass of this class.
*/
List<InterfaceType> _mixins = InterfaceTypeImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the interfaces that are implemented by this class.
*/
List<InterfaceType> _interfaces = InterfaceTypeImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the methods contained in this class.
*/
List<MethodElement> _methods = MethodElementImpl.EMPTY_ARRAY;
+
/**
* The superclass of the class, or {@code null} if the class does not have an explicit superclass.
*/
InterfaceType _supertype;
+
/**
* The type defined by the class.
*/
InterfaceType _type;
+
/**
* An array containing all of the type variables defined for this class.
*/
List<TypeVariableElement> _typeVariables = TypeVariableElementImpl.EMPTY_ARRAY;
+
/**
* An empty array of type elements.
*/
static List<ClassElement> EMPTY_ARRAY = new List<ClassElement>(0);
+
/**
* Initialize a newly created class element to have the given name.
* @param name the name of this element
@@ -1366,7 +1623,7 @@
accept(ElementVisitor visitor) => visitor.visitClassElement(this);
List<PropertyAccessorElement> get accessors => _accessors;
List<InterfaceType> get allSupertypes {
- Set<InterfaceType> list = new Set<InterfaceType>();
+ List<InterfaceType> list = new List<InterfaceType>();
collectAllSupertypes(list);
return new List.from(list);
}
@@ -1399,22 +1656,8 @@
return null;
}
List<ConstructorElement> get constructors => _constructors;
+
/**
- * Return the executable elemement representing the getter, setter or method with the given name
- * that is declared in this class, or {@code null} if this class does not declare a member with
- * the given name.
- * @param memberName the name of the getter to be returned
- * @return the member declared in this class with the given name
- */
- ExecutableElement getExecutable(String memberName) {
- for (PropertyAccessorElement accessor in _accessors) {
- if (accessor.name == memberName) {
- return accessor;
- }
- }
- return getMethod(memberName);
- }
- /**
* Given some name, this returns the {@link FieldElement} with the matching name, if there is no
* such field, then {@code null} is returned.
* @param name some name to lookup a field element with
@@ -1429,12 +1672,6 @@
return null;
}
List<FieldElement> get fields => _fields;
- /**
- * Return the element representing the getter with the given name that is declared in this class,
- * or {@code null} if this class does not declare a getter with the given name.
- * @param getterName the name of the getter to be returned
- * @return the getter declared in this class with the given name
- */
PropertyAccessorElement getGetter(String getterName) {
for (PropertyAccessorElement accessor in _accessors) {
if (accessor.isGetter() && accessor.name == getterName) {
@@ -1445,12 +1682,6 @@
}
List<InterfaceType> get interfaces => _interfaces;
ElementKind get kind => ElementKind.CLASS;
- /**
- * Return the element representing the method with the given name that is declared in this class,
- * or {@code null} if this class does not declare a method with the given name.
- * @param methodName the name of the method to be returned
- * @return the method declared in this class with the given name
- */
MethodElement getMethod(String methodName) {
for (MethodElement method in _methods) {
if (method.name == methodName) {
@@ -1470,13 +1701,10 @@
}
return null;
}
- /**
- * Return the element representing the setter with the given name that is declared in this class,
- * or {@code null} if this class does not declare a setter with the given name.
- * @param setterName the name of the getter to be returned
- * @return the setter declared in this class with the given name
- */
PropertyAccessorElement getSetter(String setterName) {
+ if (!setterName.endsWith("=")) {
+ setterName += '=';
+ }
for (PropertyAccessorElement accessor in _accessors) {
if (accessor.isSetter() && accessor.name == setterName) {
return accessor;
@@ -1489,105 +1717,123 @@
List<TypeVariableElement> get typeVariables => _typeVariables;
ConstructorElement get unnamedConstructor {
for (ConstructorElement element in constructors) {
- String name2 = element.name;
- if (name2 == null || name2.isEmpty) {
+ String name = element.displayName;
+ if (name == null || name.isEmpty) {
return element;
}
}
return null;
}
- bool isAbstract() => hasModifier(Modifier.ABSTRACT);
- bool isTypedef() => hasModifier(Modifier.TYPEDEF);
- bool isValidMixin() => hasModifier(Modifier.MIXIN);
- ExecutableElement lookUpExecutable(String memberName, LibraryElement library) {
- ExecutableElement element = getExecutable(memberName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- for (InterfaceType mixin in _mixins) {
- ClassElement mixinElement = mixin.element;
- if (mixinElement != null) {
- ClassElementImpl mixinElementImpl = mixinElement as ClassElementImpl;
- element = mixinElementImpl.getExecutable(memberName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
+ bool hasNonFinalField() {
+ List<ClassElement> classesToVisit = new List<ClassElement>();
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
+ classesToVisit.add(this);
+ while (!classesToVisit.isEmpty) {
+ ClassElement currentElement = classesToVisit.removeAt(0);
+ if (javaSetAdd(visitedClasses, currentElement)) {
+ for (FieldElement field in currentElement.fields) {
+ if (!field.isFinal() && !field.isConst() && !field.isStatic() && !field.isSynthetic()) {
+ return true;
+ }
}
+ for (InterfaceType mixinType in currentElement.mixins) {
+ ClassElement mixinElement = mixinType.element;
+ classesToVisit.add(mixinElement);
+ }
+ InterfaceType supertype2 = currentElement.supertype;
+ if (supertype2 != null) {
+ ClassElement superElement = supertype2.element;
+ if (superElement != null) {
+ classesToVisit.add(superElement);
+ }
+ }
}
}
- if (_supertype != null) {
- ClassElement supertypeElement = _supertype.element;
- if (supertypeElement != null) {
- return supertypeElement.lookUpExecutable(memberName, library);
- }
- }
- return null;
+ return false;
}
+ bool hasReferenceToSuper() => hasModifier(Modifier.REFERENCES_SUPER);
+ bool isAbstract() => hasModifier(Modifier.ABSTRACT);
+ bool isTypedef() => hasModifier(Modifier.TYPEDEF);
+ bool isValidMixin() => hasModifier(Modifier.MIXIN);
PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
- PropertyAccessorElement element = getGetter(getterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- for (InterfaceType mixin in _mixins) {
- ClassElement mixinElement = mixin.element;
- if (mixinElement != null) {
- element = ((mixinElement as ClassElementImpl)).getGetter(getterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
+ ClassElement currentElement = this;
+ while (currentElement != null && !visitedClasses.contains(currentElement)) {
+ javaSetAdd(visitedClasses, currentElement);
+ PropertyAccessorElement element = currentElement.getGetter(getterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ for (InterfaceType mixin in currentElement.mixins) {
+ ClassElement mixinElement = mixin.element;
+ if (mixinElement != null) {
+ element = mixinElement.getGetter(getterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
}
}
- }
- if (_supertype != null) {
- ClassElement supertypeElement = _supertype.element;
- if (supertypeElement != null) {
- return supertypeElement.lookUpGetter(getterName, library);
+ InterfaceType supertype2 = currentElement.supertype;
+ if (supertype2 == null) {
+ return null;
}
+ currentElement = supertype2.element;
}
return null;
}
MethodElement lookUpMethod(String methodName, LibraryElement library) {
- MethodElement element = getMethod(methodName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- for (InterfaceType mixin in _mixins) {
- ClassElement mixinElement = mixin.element;
- if (mixinElement != null) {
- element = ((mixinElement as ClassElementImpl)).getMethod(methodName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
+ ClassElement currentElement = this;
+ while (currentElement != null && !visitedClasses.contains(currentElement)) {
+ javaSetAdd(visitedClasses, currentElement);
+ MethodElement element = currentElement.getMethod(methodName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ for (InterfaceType mixin in currentElement.mixins) {
+ ClassElement mixinElement = mixin.element;
+ if (mixinElement != null) {
+ element = mixinElement.getMethod(methodName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
}
}
- }
- if (_supertype != null) {
- ClassElement supertypeElement = _supertype.element;
- if (supertypeElement != null) {
- return supertypeElement.lookUpMethod(methodName, library);
+ InterfaceType supertype2 = currentElement.supertype;
+ if (supertype2 == null) {
+ return null;
}
+ currentElement = supertype2.element;
}
return null;
}
PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
- PropertyAccessorElement element = getSetter(setterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
- }
- for (InterfaceType mixin in _mixins) {
- ClassElement mixinElement = mixin.element;
- if (mixinElement != null) {
- element = ((mixinElement as ClassElementImpl)).getSetter(setterName);
- if (element != null && element.isAccessibleIn(library)) {
- return element;
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
+ ClassElement currentElement = this;
+ while (currentElement != null && !visitedClasses.contains(currentElement)) {
+ javaSetAdd(visitedClasses, currentElement);
+ PropertyAccessorElement element = currentElement.getSetter(setterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
+ for (InterfaceType mixin in currentElement.mixins) {
+ ClassElement mixinElement = mixin.element;
+ if (mixinElement != null) {
+ element = mixinElement.getSetter(setterName);
+ if (element != null && element.isAccessibleIn(library)) {
+ return element;
+ }
}
}
- }
- if (_supertype != null) {
- ClassElement supertypeElement = _supertype.element;
- if (supertypeElement != null) {
- return supertypeElement.lookUpSetter(setterName, library);
+ InterfaceType supertype2 = currentElement.supertype;
+ if (supertype2 == null) {
+ return null;
}
+ currentElement = supertype2.element;
}
return null;
}
+
/**
* Set whether this class is abstract to correspond to the given value.
* @param isAbstract {@code true} if the class is abstract
@@ -1595,6 +1841,7 @@
void set abstract(bool isAbstract) {
setModifier(Modifier.ABSTRACT, isAbstract);
}
+
/**
* Set the accessors contained in this class to the given accessors.
* @param accessors the accessors contained in this class
@@ -1605,6 +1852,7 @@
}
this._accessors = accessors2;
}
+
/**
* Set the constructors contained in this class to the given constructors.
* @param constructors the constructors contained in this class
@@ -1615,6 +1863,7 @@
}
this._constructors = constructors2;
}
+
/**
* Set the fields contained in this class to the given fields.
* @param fields the fields contained in this class
@@ -1625,13 +1874,23 @@
}
this._fields = fields2;
}
+
/**
+ * Set whether this class references 'super' to the given value.
+ * @param isReferencedSuper {@code true} references 'super'
+ */
+ void set hasReferenceToSuper2(bool isReferencedSuper) {
+ setModifier(Modifier.REFERENCES_SUPER, isReferencedSuper);
+ }
+
+ /**
* Set the interfaces that are implemented by this class to the given types.
* @param the interfaces that are implemented by this class
*/
void set interfaces(List<InterfaceType> interfaces2) {
this._interfaces = interfaces2;
}
+
/**
* Set the methods contained in this class to the given methods.
* @param methods the methods contained in this class
@@ -1642,6 +1901,7 @@
}
this._methods = methods2;
}
+
/**
* Set the mixins that are applied to the class being extended in order to derive the superclass
* of this class to the given types.
@@ -1650,6 +1910,7 @@
void set mixins(List<InterfaceType> mixins2) {
this._mixins = mixins2;
}
+
/**
* Set the superclass of the class to the given type.
* @param supertype the superclass of the class
@@ -1657,6 +1918,7 @@
void set supertype(InterfaceType supertype2) {
this._supertype = supertype2;
}
+
/**
* Set the type defined by the class to the given type.
* @param type the type defined by the class
@@ -1664,6 +1926,7 @@
void set type(InterfaceType type2) {
this._type = type2;
}
+
/**
* Set whether this class is defined by a typedef construct to correspond to the given value.
* @param isTypedef {@code true} if the class is defined by a typedef construct
@@ -1671,6 +1934,7 @@
void set typedef(bool isTypedef) {
setModifier(Modifier.TYPEDEF, isTypedef);
}
+
/**
* Set the type variables defined for this class to the given type variables.
* @param typeVariables the type variables defined for this class
@@ -1681,6 +1945,7 @@
}
this._typeVariables = typeVariables2;
}
+
/**
* Set whether this class is a valid mixin to correspond to the given value.
* @param isValidMixin {@code true} if this class can be used as a mixin
@@ -1697,11 +1962,11 @@
safelyVisitChildren(_typeVariables, visitor);
}
void appendTo(JavaStringBuilder builder) {
- String name2 = name;
- if (name2 == null) {
+ String name = displayName;
+ if (name == null) {
builder.append("{unnamed class}");
} else {
- builder.append(name2);
+ builder.append(name);
}
int variableCount = _typeVariables.length;
if (variableCount > 0) {
@@ -1715,59 +1980,84 @@
builder.append(">");
}
}
- void collectAllSupertypes(Set<InterfaceType> list) {
- if (_supertype == null || list.contains(_supertype)) {
- return;
- }
- javaSetAdd(list, _supertype);
- ((_supertype.element as ClassElementImpl)).collectAllSupertypes(list);
- for (InterfaceType type in interfaces) {
- if (!list.contains(type)) {
- javaSetAdd(list, type);
- ((type.element as ClassElementImpl)).collectAllSupertypes(list);
+ void collectAllSupertypes(List<InterfaceType> supertypes) {
+ List<InterfaceType> typesToVisit = new List<InterfaceType>();
+ List<ClassElement> visitedClasses = new List<ClassElement>();
+ typesToVisit.add(this.type);
+ while (!typesToVisit.isEmpty) {
+ InterfaceType currentType = typesToVisit.removeAt(0);
+ ClassElement currentElement = currentType.element;
+ if (!visitedClasses.contains(currentElement)) {
+ visitedClasses.add(currentElement);
+ if (currentType != this.type) {
+ supertypes.add(currentType);
+ }
+ InterfaceType supertype = currentType.superclass;
+ if (supertype != null) {
+ typesToVisit.add(supertype);
+ }
+ for (InterfaceType type in currentElement.interfaces) {
+ typesToVisit.add(type);
+ }
+ for (InterfaceType type in currentElement.mixins) {
+ ClassElement element2 = type.element;
+ if (!visitedClasses.contains(element2)) {
+ supertypes.add(type);
+ }
+ }
}
}
- for (InterfaceType type in mixins) {
- if (!list.contains(type)) {
- javaSetAdd(list, type);
- }
- }
}
}
+
/**
* Instances of the class {@code CompilationUnitElementImpl} implement a{@link CompilationUnitElement}.
* @coverage dart.engine.element
*/
class CompilationUnitElementImpl extends ElementImpl implements CompilationUnitElement {
+
/**
+ * An empty array of compilation unit elements.
+ */
+ static List<CompilationUnitElement> EMPTY_ARRAY = new List<CompilationUnitElement>(0);
+
+ /**
* An array containing all of the top-level accessors (getters and setters) contained in this
* compilation unit.
*/
List<PropertyAccessorElement> _accessors = PropertyAccessorElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the top-level functions contained in this compilation unit.
*/
List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the variables contained in this compilation unit.
*/
List<TopLevelVariableElement> _variables = TopLevelVariableElementImpl.EMPTY_ARRAY;
+
/**
* The source that corresponds to this compilation unit.
*/
Source _source;
+
/**
* An array containing all of the function type aliases contained in this compilation unit.
*/
List<FunctionTypeAliasElement> _typeAliases = FunctionTypeAliasElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the types contained in this compilation unit.
*/
List<ClassElement> _types = ClassElementImpl.EMPTY_ARRAY;
+
/**
- * An empty array of compilation unit elements.
+ * The URI that is specified by the "part" directive in the enclosing library, or {@code null} if
+ * this is the defining compilation unit of a library.
*/
- static List<CompilationUnitElement> EMPTY_ARRAY = new List<CompilationUnitElement>(0);
+ String _uri;
+
/**
* Initialize a newly created compilation unit element to have the given name.
* @param name the name of this element
@@ -1821,7 +2111,9 @@
return null;
}
List<ClassElement> get types => _types;
+ String get uri => _uri;
int get hashCode => _source.hashCode;
+
/**
* Set the top-level accessors (getters and setters) contained in this compilation unit to the
* given accessors.
@@ -1833,6 +2125,7 @@
}
this._accessors = accessors2;
}
+
/**
* Set the top-level functions contained in this compilation unit to the given functions.
* @param functions the top-level functions contained in this compilation unit
@@ -1843,6 +2136,7 @@
}
this._functions = functions2;
}
+
/**
* Set the source that corresponds to this compilation unit to the given source.
* @param source the source that corresponds to this compilation unit
@@ -1850,6 +2144,7 @@
void set source(Source source2) {
this._source = source2;
}
+
/**
* Set the top-level variables contained in this compilation unit to the given variables.
* @param variables the top-level variables contained in this compilation unit
@@ -1860,6 +2155,7 @@
}
this._variables = variables2;
}
+
/**
* Set the function type aliases contained in this compilation unit to the given type aliases.
* @param typeAliases the function type aliases contained in this compilation unit
@@ -1870,6 +2166,7 @@
}
this._typeAliases = typeAliases2;
}
+
/**
* Set the types contained in this compilation unit to the given types.
* @param types types contained in this compilation unit
@@ -1880,6 +2177,14 @@
}
this._types = types2;
}
+
+ /**
+ * Set the URI that is specified by the "part" directive in the enclosing library.
+ * @param uri the URI that is specified by the "part" directive in the enclosing library.
+ */
+ void set uri(String uri2) {
+ this._uri = uri2;
+ }
void visitChildren(ElementVisitor<Object> visitor) {
super.visitChildren(visitor);
safelyVisitChildren(_accessors, visitor);
@@ -1896,15 +2201,18 @@
}
}
}
+
/**
* Instances of the class {@code ConstFieldElementImpl} implement a {@code FieldElement} for a
* 'const' field that has an initializer.
*/
class ConstFieldElementImpl extends FieldElementImpl {
+
/**
* The result of evaluating this variable's initializer.
*/
EvaluationResultImpl _result;
+
/**
* Initialize a newly created field element to have the given name.
* @param name the name of this element
@@ -1916,15 +2224,18 @@
this._result = result2;
}
}
+
/**
* Instances of the class {@code ConstLocalVariableElementImpl} implement a{@code LocalVariableElement} for a local 'const' variable that has an initializer.
* @coverage dart.engine.element
*/
class ConstLocalVariableElementImpl extends LocalVariableElementImpl {
+
/**
* The result of evaluating this variable's initializer.
*/
EvaluationResultImpl _result;
+
/**
* Initialize a newly created local variable element to have the given name.
* @param name the name of this element
@@ -1936,16 +2247,19 @@
this._result = result2;
}
}
+
/**
* Instances of the class {@code ConstParameterElementImpl} implement a {@code ParameterElement} for
* a 'const' parameter that has an initializer.
* @coverage dart.engine.element
*/
class ConstParameterElementImpl extends ParameterElementImpl {
+
/**
* The result of evaluating this variable's initializer.
*/
EvaluationResultImpl _result;
+
/**
* Initialize a newly created parameter element to have the given name.
* @param name the name of this element
@@ -1957,14 +2271,17 @@
this._result = result2;
}
}
+
/**
* Instances of the class {@code ConstTopLevelVariableElementImpl} implement a{@code TopLevelVariableElement} for a top-level 'const' variable that has an initializer.
*/
class ConstTopLevelVariableElementImpl extends TopLevelVariableElementImpl {
+
/**
* The result of evaluating this variable's initializer.
*/
EvaluationResultImpl _result;
+
/**
* Initialize a newly created top-level variable element to have the given name.
* @param name the name of this element
@@ -1976,16 +2293,24 @@
this._result = result2;
}
}
+
/**
* Instances of the class {@code ConstructorElementImpl} implement a {@code ConstructorElement}.
* @coverage dart.engine.element
*/
class ConstructorElementImpl extends ExecutableElementImpl implements ConstructorElement {
+
/**
* An empty array of constructor elements.
*/
static List<ConstructorElement> EMPTY_ARRAY = new List<ConstructorElement>(0);
+
/**
+ * The constructor to which this constructor is redirecting.
+ */
+ ConstructorElement _redirectedConstructor;
+
+ /**
* Initialize a newly created constructor element to have the given name.
* @param name the name of this element
*/
@@ -1994,9 +2319,11 @@
accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
ClassElement get enclosingElement => super.enclosingElement as ClassElement;
ElementKind get kind => ElementKind.CONSTRUCTOR;
+ ConstructorElement get redirectedConstructor => _redirectedConstructor;
bool isConst() => hasModifier(Modifier.CONST);
bool isFactory() => hasModifier(Modifier.FACTORY);
bool isStatic() => false;
+
/**
* Set whether this constructor represents a 'const' constructor to the given value.
* @param isConst {@code true} if this constructor represents a 'const' constructor
@@ -2004,6 +2331,7 @@
void set const2(bool isConst) {
setModifier(Modifier.CONST, isConst);
}
+
/**
* Set whether this constructor represents a factory method to the given value.
* @param isFactory {@code true} if this constructor represents a factory method
@@ -2011,31 +2339,43 @@
void set factory(bool isFactory) {
setModifier(Modifier.FACTORY, isFactory);
}
+
+ /**
+ * Sets the constructor to which this constructor is redirecting.
+ * @param redirectedConstructor the constructor to which this constructor is redirecting
+ */
+ void set redirectedConstructor(ConstructorElement redirectedConstructor2) {
+ this._redirectedConstructor = redirectedConstructor2;
+ }
void appendTo(JavaStringBuilder builder) {
- builder.append(enclosingElement.name);
- String name2 = name;
- if (name2 != null && !name2.isEmpty) {
+ builder.append(enclosingElement.displayName);
+ String name = displayName;
+ if (name != null && !name.isEmpty) {
builder.append(".");
- builder.append(name2);
+ builder.append(name);
}
super.appendTo(builder);
}
}
+
/**
* Instances of the class {@code DynamicElementImpl} represent the synthetic element representing
* the declaration of the type {@code dynamic}.
* @coverage dart.engine.element
*/
class DynamicElementImpl extends ElementImpl {
+
/**
* Return the unique instance of this class.
* @return the unique instance of this class
*/
static DynamicElementImpl get instance => DynamicTypeImpl.instance.element as DynamicElementImpl;
+
/**
* The type defined by this element.
*/
DynamicTypeImpl _type;
+
/**
* Initialize a newly created instance of this class. Instances of this class should <b>not</b> be
* created except as part of creating the type associated with this element. The single instance
@@ -2046,11 +2386,13 @@
}
accept(ElementVisitor visitor) => null;
ElementKind get kind => ElementKind.DYNAMIC;
+
/**
* Return the type defined by this element.
* @return the type defined by this element
*/
DynamicTypeImpl get type => _type;
+
/**
* Set the type defined by this element to the given type.
* @param type the type defined by this element
@@ -2059,48 +2401,57 @@
this._type = type2;
}
}
+
/**
* The abstract class {@code ElementImpl} implements the behavior common to objects that implement
* an {@link Element}.
* @coverage dart.engine.element
*/
abstract class ElementImpl implements Element {
+
/**
* The enclosing element of this element, or {@code null} if this element is at the root of the
* element structure.
*/
ElementImpl _enclosingElement;
+
/**
* The name of this element.
*/
String _name;
+
/**
* The offset of the name of this element in the file that contains the declaration of this
* element.
*/
int _nameOffset = 0;
+
/**
* A bit-encoded form of the modifiers associated with this element.
*/
Set<Modifier> _modifiers;
+
/**
* An array containing all of the metadata associated with this element.
*/
List<Annotation> _metadata = AnnotationImpl.EMPTY_ARRAY;
+
/**
* A cached copy of the calculated hashCode for this element.
*/
int _cachedHashCode = 0;
+
/**
* Initialize a newly created element to have the given name.
* @param name the name of this element
*/
ElementImpl.con1(Identifier name2) {
- _jtd_constructor_189_impl(name2);
+ _jtd_constructor_193_impl(name2);
}
- _jtd_constructor_189_impl(Identifier name2) {
- _jtd_constructor_190_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
+ _jtd_constructor_193_impl(Identifier name2) {
+ _jtd_constructor_194_impl(name2 == null ? "" : name2.name, name2 == null ? -1 : name2.offset);
}
+
/**
* Initialize a newly created element to have the given name.
* @param name the name of this element
@@ -2108,9 +2459,9 @@
* declaration of this element
*/
ElementImpl.con2(String name2, int nameOffset2) {
- _jtd_constructor_190_impl(name2, nameOffset2);
+ _jtd_constructor_194_impl(name2, nameOffset2);
}
- _jtd_constructor_190_impl(String name2, int nameOffset2) {
+ _jtd_constructor_194_impl(String name2, int nameOffset2) {
this._name = StringUtilities.intern(name2);
this._nameOffset = nameOffset2;
}
@@ -2129,6 +2480,7 @@
}
return ancestor as Element;
}
+
/**
* Return the child of this element that is uniquely identified by the given identifier, or{@code null} if there is no such child.
* @param identifier the identifier used to select a child
@@ -2141,6 +2493,7 @@
}
return _enclosingElement.context;
}
+ String get displayName => _name;
Element get enclosingElement => _enclosingElement;
LibraryElement get library => getAncestor(LibraryElement);
ElementLocation get location => new ElementLocationImpl.con1(this);
@@ -2166,6 +2519,7 @@
return true;
}
bool isSynthetic() => hasModifier(Modifier.SYNTHETIC);
+
/**
* Set the metadata associate with this element to the given array of annotations.
* @param metadata the metadata to be associated with this element
@@ -2173,6 +2527,7 @@
void set metadata(List<Annotation> metadata2) {
this._metadata = metadata2;
}
+
/**
* Set the offset of the name of this element in the file that contains the declaration of this
* element to the given value. This is normally done via the constructor, but this method is
@@ -2182,6 +2537,7 @@
void set nameOffset(int nameOffset2) {
this._nameOffset = nameOffset2;
}
+
/**
* Set whether this element is synthetic to correspond to the given value.
* @param isSynthetic {@code true} if the element is synthetic
@@ -2196,6 +2552,7 @@
}
void visitChildren(ElementVisitor<Object> visitor) {
}
+
/**
* Append a textual representation of this type to the given builder.
* @param builder the builder to which the text is to be appended
@@ -2209,18 +2566,21 @@
builder.append(_name);
}
}
+
/**
* Return an identifier that uniquely identifies this element among the children of this element's
* parent.
* @return an identifier that uniquely identifies this element relative to its parent
*/
String get identifier => name;
+
/**
* Return {@code true} if this element has the given modifier associated with it.
* @param modifier the modifier being tested for
* @return {@code true} if this element has the given modifier associated with it
*/
bool hasModifier(Modifier modifier) => _modifiers != null && _modifiers.contains(modifier);
+
/**
* If the given child is not {@code null}, use the given visitor to visit it.
* @param child the child to be visited
@@ -2231,6 +2591,7 @@
child.accept(visitor);
}
}
+
/**
* Use the given visitor to visit all of the children in the given array.
* @param children the children to be visited
@@ -2243,6 +2604,7 @@
}
}
}
+
/**
* Set the enclosing element of this element to the given element.
* @param element the enclosing element of this element
@@ -2250,6 +2612,7 @@
void set enclosingElement(ElementImpl element) {
_enclosingElement = element;
}
+
/**
* Set whether the given modifier is associated with this element to correspond to the given
* value.
@@ -2272,27 +2635,31 @@
}
}
}
+
/**
* Instances of the class {@code ElementLocationImpl} implement an {@link ElementLocation}.
* @coverage dart.engine.element
*/
class ElementLocationImpl implements ElementLocation {
+
/**
* The path to the element whose location is represented by this object.
*/
List<String> _components;
+
/**
* The character used to separate components in the encoded form.
*/
static int _SEPARATOR_CHAR = 0x3B;
+
/**
* Initialize a newly created location to represent the given element.
* @param element the element whose location is being represented
*/
ElementLocationImpl.con1(Element element) {
- _jtd_constructor_191_impl(element);
+ _jtd_constructor_195_impl(element);
}
- _jtd_constructor_191_impl(Element element) {
+ _jtd_constructor_195_impl(Element element) {
List<String> components = new List<String>();
Element ancestor = element;
while (ancestor != null) {
@@ -2301,14 +2668,15 @@
}
this._components = new List.from(components);
}
+
/**
* Initialize a newly created location from the given encoded form.
* @param encoding the encoded form of a location
*/
ElementLocationImpl.con2(String encoding) {
- _jtd_constructor_192_impl(encoding);
+ _jtd_constructor_196_impl(encoding);
}
- _jtd_constructor_192_impl(String encoding) {
+ _jtd_constructor_196_impl(String encoding) {
this._components = decode(encoding);
}
bool operator ==(Object object) {
@@ -2318,6 +2686,7 @@
ElementLocationImpl location = object as ElementLocationImpl;
return JavaArrays.equals(_components, location._components);
}
+
/**
* Return the path to the element whose location is represented by this object.
* @return the path to the element whose location is represented by this object
@@ -2336,6 +2705,7 @@
}
int get hashCode => JavaArrays.makeHashCode(_components);
String toString() => encoding;
+
/**
* Decode the encoded form of a location into an array of components.
* @param encoding the encoded form of a location
@@ -2367,6 +2737,7 @@
}
return new List.from(components);
}
+
/**
* Append an encoded form of the given component to the given builder.
* @param builder the builder to which the encoded component is to be appended
@@ -2383,15 +2754,18 @@
}
}
}
+
/**
* Instances of the class {@code EmbeddedHtmlScriptElementImpl} implement an{@link EmbeddedHtmlScriptElement}.
* @coverage dart.engine.element
*/
class EmbeddedHtmlScriptElementImpl extends HtmlScriptElementImpl implements EmbeddedHtmlScriptElement {
+
/**
* The library defined by the script tag's content.
*/
LibraryElement _scriptLibrary;
+
/**
* Initialize a newly created script element to have the specified tag name and offset.
* @param node the XML node from which this element is derived (not {@code null})
@@ -2401,6 +2775,7 @@
accept(ElementVisitor visitor) => visitor.visitEmbeddedHtmlScriptElement(this);
ElementKind get kind => ElementKind.EMBEDDED_HTML_SCRIPT;
LibraryElement get scriptLibrary => _scriptLibrary;
+
/**
* Set the script library defined by the script tag's content.
* @param scriptLibrary the library or {@code null} if none
@@ -2413,44 +2788,53 @@
safelyVisitChild(_scriptLibrary, visitor);
}
}
+
/**
* The abstract class {@code ExecutableElementImpl} implements the behavior common to{@code ExecutableElement}s.
* @coverage dart.engine.element
*/
abstract class ExecutableElementImpl extends ElementImpl implements ExecutableElement {
+
/**
* An array containing all of the functions defined within this executable element.
*/
List<FunctionElement> _functions = FunctionElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the labels defined within this executable element.
*/
List<LabelElement> _labels = LabelElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the local variables defined within this executable element.
*/
List<LocalVariableElement> _localVariables = LocalVariableElementImpl.EMPTY_ARRAY;
+
/**
* An array containing all of the parameters defined by this executable element.
*/
List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
+
/**
* The type of function defined by this executable element.
*/
FunctionType _type;
+
/**
* An empty array of executable elements.
*/
static List<ExecutableElement> EMPTY_ARRAY = new List<ExecutableElement>(0);
+
/**
* Initialize a newly created executable element to have the given name.
* @param name the name of this element
*/
ExecutableElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_194_impl(name);
+ _jtd_constructor_198_impl(name);
}
- _jtd_constructor_194_impl(Identifier name) {
+ _jtd_constructor_198_impl(Identifier name) {
}
+
/**
* Initialize a newly created executable element to have the given name.
* @param name the name of this element
@@ -2458,9 +2842,9 @@
* declaration of this element
*/
ExecutableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
- _jtd_constructor_195_impl(name, nameOffset);
+ _jtd_constructor_199_impl(name, nameOffset);
}
- _jtd_constructor_195_impl(String name, int nameOffset) {
+ _jtd_constructor_199_impl(String name, int nameOffset) {
}
ElementImpl getChild(String identifier2) {
for (ExecutableElement function in _functions) {
@@ -2491,6 +2875,7 @@
List<ParameterElement> get parameters => _parameters;
FunctionType get type => _type;
bool isOperator() => false;
+
/**
* Set the functions defined within this executable element to the given functions.
* @param functions the functions defined within this executable element
@@ -2501,6 +2886,7 @@
}
this._functions = functions2;
}
+
/**
* Set the labels defined within this executable element to the given labels.
* @param labels the labels defined within this executable element
@@ -2511,6 +2897,7 @@
}
this._labels = labels2;
}
+
/**
* Set the local variables defined within this executable element to the given variables.
* @param localVariables the local variables defined within this executable element
@@ -2521,6 +2908,7 @@
}
this._localVariables = localVariables2;
}
+
/**
* Set the parameters defined by this executable element to the given parameters.
* @param parameters the parameters defined by this executable element
@@ -2531,6 +2919,7 @@
}
this._parameters = parameters2;
}
+
/**
* Set the type of function defined by this executable element to the given type.
* @param type the type of function defined by this executable element
@@ -2561,20 +2950,29 @@
}
}
}
+
/**
* Instances of the class {@code ExportElementImpl} implement an {@link ExportElement}.
* @coverage dart.engine.element
*/
class ExportElementImpl extends ElementImpl implements ExportElement {
+
/**
+ * The URI that is specified by this directive.
+ */
+ String _uri;
+
+ /**
* The library that is exported from this library by this export directive.
*/
LibraryElement _exportedLibrary;
+
/**
* The combinators that were specified as part of the export directive in the order in which they
* were specified.
*/
List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY;
+
/**
* Initialize a newly created export element.
*/
@@ -2584,6 +2982,8 @@
List<NamespaceCombinator> get combinators => _combinators;
LibraryElement get exportedLibrary => _exportedLibrary;
ElementKind get kind => ElementKind.EXPORT;
+ String get uri => _uri;
+
/**
* Set the combinators that were specified as part of the export directive to the given array of
* combinators.
@@ -2592,6 +2992,7 @@
void set combinators(List<NamespaceCombinator> combinators2) {
this._combinators = combinators2;
}
+
/**
* Set the library that is exported from this library by this import directive to the given
* library.
@@ -2600,21 +3001,32 @@
void set exportedLibrary(LibraryElement exportedLibrary2) {
this._exportedLibrary = exportedLibrary2;
}
+
+ /**
+ * Set the URI that is specified by this directive.
+ * @param uri the URI that is specified by this directive.
+ */
+ void set uri(String uri2) {
+ this._uri = uri2;
+ }
void appendTo(JavaStringBuilder builder) {
builder.append("export ");
((_exportedLibrary as LibraryElementImpl)).appendTo(builder);
}
String get identifier => _exportedLibrary.name;
}
+
/**
* Instances of the class {@code ExternalHtmlScriptElementImpl} implement an{@link ExternalHtmlScriptElement}.
* @coverage dart.engine.element
*/
class ExternalHtmlScriptElementImpl extends HtmlScriptElementImpl implements ExternalHtmlScriptElement {
+
/**
* The source specified in the {@code source} attribute or {@code null} if unspecified.
*/
Source _scriptSource;
+
/**
* Initialize a newly created script element to have the specified tag name and offset.
* @param node the XML node from which this element is derived (not {@code null})
@@ -2624,6 +3036,7 @@
accept(ElementVisitor visitor) => visitor.visitExternalHtmlScriptElement(this);
ElementKind get kind => ElementKind.EXTERNAL_HTML_SCRIPT;
Source get scriptSource => _scriptSource;
+
/**
* Set the source specified in the {@code source} attribute.
* @param scriptSource the script source or {@code null} if unspecified
@@ -2632,37 +3045,42 @@
this._scriptSource = scriptSource2;
}
}
+
/**
* Instances of the class {@code FieldElementImpl} implement a {@code FieldElement}.
* @coverage dart.engine.element
*/
class FieldElementImpl extends PropertyInducingElementImpl implements FieldElement {
+
/**
* An empty array of field elements.
*/
static List<FieldElement> EMPTY_ARRAY = new List<FieldElement>(0);
+
/**
* Initialize a newly created field element to have the given name.
* @param name the name of this element
*/
FieldElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_198_impl(name);
+ _jtd_constructor_202_impl(name);
}
- _jtd_constructor_198_impl(Identifier name) {
+ _jtd_constructor_202_impl(Identifier name) {
}
+
/**
* Initialize a newly created synthetic field element to have the given name.
* @param name the name of this element
*/
FieldElementImpl.con2(String name) : super.con2(name) {
- _jtd_constructor_199_impl(name);
+ _jtd_constructor_203_impl(name);
}
- _jtd_constructor_199_impl(String name) {
+ _jtd_constructor_203_impl(String name) {
}
accept(ElementVisitor visitor) => visitor.visitFieldElement(this);
ClassElement get enclosingElement => super.enclosingElement as ClassElement;
ElementKind get kind => ElementKind.FIELD;
bool isStatic() => hasModifier(Modifier.STATIC);
+
/**
* Set whether this field is static to correspond to the given value.
* @param isStatic {@code true} if the field is static
@@ -2671,15 +3089,18 @@
setModifier(Modifier.STATIC, isStatic);
}
}
+
/**
* Instances of the class {@code FieldFormalParameterElementImpl} extend{@link ParameterElementImpl} to provide the additional information of the {@link FieldElement}associated with the parameter.
* @coverage dart.engine.element
*/
class FieldFormalParameterElementImpl extends ParameterElementImpl implements FieldFormalParameterElement {
+
/**
* The field associated with this field formal parameter.
*/
FieldElement _field;
+
/**
* Initialize a newly created parameter element to have the given name.
* @param name the name of this element
@@ -2688,6 +3109,8 @@
}
accept(ElementVisitor visitor) => visitor.visitFieldFormalParameterElement(this);
FieldElement get field => _field;
+ bool isInitializingFormal() => true;
+
/**
* Set the field element associated with this field formal parameter to the given element.
* @param field the new field element
@@ -2696,42 +3119,49 @@
this._field = field2;
}
}
+
/**
* Instances of the class {@code FunctionElementImpl} implement a {@code FunctionElement}.
* @coverage dart.engine.element
*/
class FunctionElementImpl extends ExecutableElementImpl implements FunctionElement {
+
/**
* The offset to the beginning of the visible range for this element.
*/
int _visibleRangeOffset = 0;
+
/**
* The length of the visible range for this element, or {@code -1} if this element does not have a
* visible range.
*/
int _visibleRangeLength = -1;
+
/**
* An empty array of function elements.
*/
static List<FunctionElement> EMPTY_ARRAY = new List<FunctionElement>(0);
+
/**
* Initialize a newly created synthetic function element.
*/
FunctionElementImpl() : super.con2("", -1) {
- _jtd_constructor_201_impl();
+ _jtd_constructor_205_impl();
}
- _jtd_constructor_201_impl() {
+ _jtd_constructor_205_impl() {
synthetic = true;
}
+
/**
* Initialize a newly created function element to have the given name.
* @param name the name of this element
*/
FunctionElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_202_impl(name);
+ _jtd_constructor_206_impl(name);
}
- _jtd_constructor_202_impl(Identifier name) {
+ _jtd_constructor_206_impl(Identifier name) {
}
+
/**
* Initialize a newly created function element to have no name and the given offset. This is used
* for function expressions, which have no name.
@@ -2739,9 +3169,9 @@
* declaration of this element
*/
FunctionElementImpl.con2(int nameOffset) : super.con2("", nameOffset) {
- _jtd_constructor_203_impl(nameOffset);
+ _jtd_constructor_207_impl(nameOffset);
}
- _jtd_constructor_203_impl(int nameOffset) {
+ _jtd_constructor_207_impl(int nameOffset) {
}
accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
String get identifier => name;
@@ -2753,6 +3183,7 @@
return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
}
bool isStatic() => enclosingElement is CompilationUnitElement;
+
/**
* Set the visible range for this element to the range starting at the given offset with the given
* length.
@@ -2765,34 +3196,40 @@
_visibleRangeLength = length;
}
void appendTo(JavaStringBuilder builder) {
- String name2 = name;
- if (name2 != null) {
- builder.append(name2);
+ String name = displayName;
+ if (name != null) {
+ builder.append(name);
}
super.appendTo(builder);
}
}
+
/**
* Instances of the class {@code FunctionTypeAliasElementImpl} implement a{@code FunctionTypeAliasElement}.
* @coverage dart.engine.element
*/
class FunctionTypeAliasElementImpl extends ElementImpl implements FunctionTypeAliasElement {
+
/**
* An array containing all of the parameters defined by this type alias.
*/
List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
+
/**
* The type of function defined by this type alias.
*/
FunctionType _type;
+
/**
* An array containing all of the type variables defined for this type.
*/
List<TypeVariableElement> _typeVariables = TypeVariableElementImpl.EMPTY_ARRAY;
+
/**
* An empty array of type alias elements.
*/
static List<FunctionTypeAliasElement> EMPTY_ARRAY = new List<FunctionTypeAliasElement>(0);
+
/**
* Initialize a newly created type alias element to have the given name.
* @param name the name of this element
@@ -2818,6 +3255,7 @@
List<ParameterElement> get parameters => _parameters;
FunctionType get type => _type;
List<TypeVariableElement> get typeVariables => _typeVariables;
+
/**
* Set the parameters defined by this type alias to the given parameters.
* @param parameters the parameters defined by this type alias
@@ -2830,6 +3268,7 @@
}
this._parameters = parameters2;
}
+
/**
* Set the type of function defined by this type alias to the given type.
* @param type the type of function defined by this type alias
@@ -2837,6 +3276,7 @@
void set type(FunctionType type2) {
this._type = type2;
}
+
/**
* Set the type variables defined for this type to the given variables.
* @param typeVariables the type variables defined for this type
@@ -2854,7 +3294,7 @@
}
void appendTo(JavaStringBuilder builder) {
builder.append("typedef ");
- builder.append(name);
+ builder.append(displayName);
int variableCount = _typeVariables.length;
if (variableCount > 0) {
builder.append("<");
@@ -2881,22 +3321,20 @@
}
}
}
+
/**
* Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
* @coverage dart.engine.element
*/
class HideCombinatorImpl implements HideCombinator {
+
/**
* The names that are not to be made visible in the importing library even if they are defined in
* the imported library.
*/
List<String> _hiddenNames = StringUtilities.EMPTY_ARRAY;
- /**
- * Initialize a newly created combinator.
- */
- HideCombinatorImpl() : super() {
- }
List<String> get hiddenNames => _hiddenNames;
+
/**
* Set the names that are not to be made visible in the importing library even if they are defined
* in the imported library to the given names.
@@ -2918,27 +3356,33 @@
return builder.toString();
}
}
+
/**
* Instances of the class {@code HtmlElementImpl} implement an {@link HtmlElement}.
* @coverage dart.engine.element
*/
class HtmlElementImpl extends ElementImpl implements HtmlElement {
+
/**
* An empty array of HTML file elements.
*/
static List<HtmlElement> EMPTY_ARRAY = new List<HtmlElement>(0);
+
/**
* The analysis context in which this library is defined.
*/
AnalysisContext _context;
+
/**
* The scripts contained in or referenced from script tags in the HTML file.
*/
List<HtmlScriptElement> _scripts = HtmlScriptElementImpl.EMPTY_ARRAY;
+
/**
* The source that corresponds to this HTML file.
*/
Source _source;
+
/**
* Initialize a newly created HTML element to have the given name.
* @param context the analysis context in which the HTML file is defined
@@ -2954,6 +3398,7 @@
List<HtmlScriptElement> get scripts => _scripts;
Source get source => _source;
int get hashCode => _source.hashCode;
+
/**
* Set the scripts contained in the HTML file to the given scripts.
* @param scripts the scripts
@@ -2967,6 +3412,7 @@
}
this._scripts = scripts2;
}
+
/**
* Set the source that corresponds to this HTML file to the given source.
* @param source the source that corresponds to this HTML file
@@ -2986,15 +3432,18 @@
}
}
}
+
/**
* Instances of the class {@code HtmlScriptElementImpl} implement an {@link HtmlScriptElement}.
* @coverage dart.engine.element
*/
abstract class HtmlScriptElementImpl extends ElementImpl implements HtmlScriptElement {
+
/**
* An empty array of HTML script elements.
*/
static List<HtmlScriptElement> EMPTY_ARRAY = new List<HtmlScriptElement>(0);
+
/**
* Initialize a newly created script element to have the specified tag name and offset.
* @param node the XML node from which this element is derived (not {@code null})
@@ -3002,25 +3451,35 @@
HtmlScriptElementImpl(XmlTagNode node) : super.con2(node.tag.lexeme, node.tag.offset) {
}
}
+
/**
* Instances of the class {@code ImportElementImpl} implement an {@link ImportElement}.
* @coverage dart.engine.element
*/
class ImportElementImpl extends ElementImpl implements ImportElement {
+
/**
+ * The URI that is specified by this directive.
+ */
+ String _uri;
+
+ /**
* The library that is imported into this library by this import directive.
*/
LibraryElement _importedLibrary;
+
/**
* The combinators that were specified as part of the import directive in the order in which they
* were specified.
*/
List<NamespaceCombinator> _combinators = NamespaceCombinator.EMPTY_ARRAY;
+
/**
* The prefix that was specified as part of the import directive, or {@code null} if there was no
* prefix specified.
*/
PrefixElement _prefix;
+
/**
* Initialize a newly created import element.
*/
@@ -3031,6 +3490,8 @@
LibraryElement get importedLibrary => _importedLibrary;
ElementKind get kind => ElementKind.IMPORT;
PrefixElement get prefix => _prefix;
+ String get uri => _uri;
+
/**
* Set the combinators that were specified as part of the import directive to the given array of
* combinators.
@@ -3039,6 +3500,7 @@
void set combinators(List<NamespaceCombinator> combinators2) {
this._combinators = combinators2;
}
+
/**
* Set the library that is imported into this library by this import directive to the given
* library.
@@ -3047,6 +3509,7 @@
void set importedLibrary(LibraryElement importedLibrary2) {
this._importedLibrary = importedLibrary2;
}
+
/**
* Set the prefix that was specified as part of the import directive to the given prefix.
* @param prefix the prefix that was specified as part of the import directive
@@ -3054,6 +3517,14 @@
void set prefix(PrefixElement prefix2) {
this._prefix = prefix2;
}
+
+ /**
+ * Set the URI that is specified by this directive.
+ * @param uri the URI that is specified by this directive.
+ */
+ void set uri(String uri2) {
+ this._uri = uri2;
+ }
void visitChildren(ElementVisitor<Object> visitor) {
super.visitChildren(visitor);
safelyVisitChild(_prefix, visitor);
@@ -3062,25 +3533,30 @@
builder.append("import ");
((_importedLibrary as LibraryElementImpl)).appendTo(builder);
}
- String get identifier => "${_importedLibrary.name}:${(_prefix == null ? "" : _prefix.name)}";
+ String get identifier => ((_importedLibrary as LibraryElementImpl)).identifier;
}
+
/**
* Instances of the class {@code LabelElementImpl} implement a {@code LabelElement}.
* @coverage dart.engine.element
*/
class LabelElementImpl extends ElementImpl implements LabelElement {
+
/**
* A flag indicating whether this label is associated with a {@code switch} statement.
*/
bool _onSwitchStatement = false;
+
/**
* A flag indicating whether this label is associated with a {@code switch} member ({@code case}or {@code default}).
*/
bool _onSwitchMember = false;
+
/**
* An empty array of label elements.
*/
static List<LabelElement> EMPTY_ARRAY = new List<LabelElement>(0);
+
/**
* Initialize a newly created label element to have the given name.
* @param name the name of this element
@@ -3094,26 +3570,31 @@
accept(ElementVisitor visitor) => visitor.visitLabelElement(this);
ExecutableElement get enclosingElement => super.enclosingElement as ExecutableElement;
ElementKind get kind => ElementKind.LABEL;
+
/**
* Return {@code true} if this label is associated with a {@code switch} member ({@code case} or{@code default}).
* @return {@code true} if this label is associated with a {@code switch} member
*/
bool isOnSwitchMember() => _onSwitchMember;
+
/**
* Return {@code true} if this label is associated with a {@code switch} statement.
* @return {@code true} if this label is associated with a {@code switch} statement
*/
bool isOnSwitchStatement() => _onSwitchStatement;
}
+
/**
* Instances of the class {@code LibraryElementImpl} implement a {@code LibraryElement}.
* @coverage dart.engine.element
*/
class LibraryElementImpl extends ElementImpl implements LibraryElement {
+
/**
* An empty array of library elements.
*/
static List<LibraryElement> EMPTY_ARRAY = new List<LibraryElement>(0);
+
/**
* Determine if the given library is up to date with respect to the given time stamp.
* @param library the library to process
@@ -3144,30 +3625,37 @@
}
return true;
}
+
/**
* The analysis context in which this library is defined.
*/
AnalysisContext _context;
+
/**
* The compilation unit that defines this library.
*/
CompilationUnitElement _definingCompilationUnit;
+
/**
* The entry point for this library, or {@code null} if this library does not have an entry point.
*/
FunctionElement _entryPoint;
+
/**
* An array containing specifications of all of the imports defined in this library.
*/
List<ImportElement> _imports = ImportElement.EMPTY_ARRAY;
+
/**
* An array containing specifications of all of the exports defined in this library.
*/
List<ExportElement> _exports = ExportElement.EMPTY_ARRAY;
+
/**
* An array containing all of the compilation units that are included in this library using a{@code part} directive.
*/
List<CompilationUnitElement> _parts = CompilationUnitElementImpl.EMPTY_ARRAY;
+
/**
* Initialize a newly created library element to have the given name.
* @param context the analysis context in which the library is defined
@@ -3264,6 +3752,7 @@
Set<LibraryElement> visitedLibraries = new Set();
return isUpToDate(this, timeStamp, visitedLibraries);
}
+
/**
* Set the compilation unit that defines this library to the given compilation unit.
* @param definingCompilationUnit the compilation unit that defines this library
@@ -3272,6 +3761,7 @@
((definingCompilationUnit2 as CompilationUnitElementImpl)).enclosingElement = this;
this._definingCompilationUnit = definingCompilationUnit2;
}
+
/**
* Set the entry point for this library to the given function.
* @param entryPoint the entry point for this library
@@ -3279,6 +3769,7 @@
void set entryPoint(FunctionElement entryPoint2) {
this._entryPoint = entryPoint2;
}
+
/**
* Set the specifications of all of the exports defined in this library to the given array.
* @param exports the specifications of all of the exports defined in this library
@@ -3289,6 +3780,7 @@
}
this._exports = exports2;
}
+
/**
* Set the specifications of all of the imports defined in this library to the given array.
* @param imports the specifications of all of the imports defined in this library
@@ -3303,6 +3795,7 @@
}
this._imports = imports2;
}
+
/**
* Set the compilation units that are included in this library using a {@code part} directive.
* @param parts the compilation units that are included in this library using a {@code part}directive
@@ -3320,6 +3813,7 @@
safelyVisitChildren(_imports, visitor);
safelyVisitChildren(_parts, visitor);
}
+
/**
* Answer {@code true} if the receiver directly or indirectly imports the dart:html libraries.
* @return {@code true} if the receiver directly or indirectly imports the dart:html libraries
@@ -3348,24 +3842,29 @@
return false;
}
}
+
/**
* Instances of the class {@code LocalVariableElementImpl} implement a {@code LocalVariableElement}.
* @coverage dart.engine.element
*/
class LocalVariableElementImpl extends VariableElementImpl implements LocalVariableElement {
+
/**
* The offset to the beginning of the visible range for this element.
*/
int _visibleRangeOffset = 0;
+
/**
* The length of the visible range for this element, or {@code -1} if this element does not have a
* visible range.
*/
int _visibleRangeLength = -1;
+
/**
* An empty array of field elements.
*/
static List<LocalVariableElement> EMPTY_ARRAY = new List<LocalVariableElement>(0);
+
/**
* Initialize a newly created local variable element to have the given name.
* @param name the name of this element
@@ -3380,6 +3879,7 @@
}
return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
}
+
/**
* Set the visible range for this element to the range starting at the given offset with the given
* length.
@@ -3394,27 +3894,31 @@
void appendTo(JavaStringBuilder builder) {
builder.append(type);
builder.append(" ");
- builder.append(name);
+ builder.append(displayName);
}
}
+
/**
* Instances of the class {@code MethodElementImpl} implement a {@code MethodElement}.
* @coverage dart.engine.element
*/
class MethodElementImpl extends ExecutableElementImpl implements MethodElement {
+
/**
* An empty array of method elements.
*/
static List<MethodElement> EMPTY_ARRAY = new List<MethodElement>(0);
+
/**
* Initialize a newly created method element to have the given name.
* @param name the name of this element
*/
MethodElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_212_impl(name);
+ _jtd_constructor_216_impl(name);
}
- _jtd_constructor_212_impl(Identifier name) {
+ _jtd_constructor_216_impl(Identifier name) {
}
+
/**
* Initialize a newly created method element to have the given name.
* @param name the name of this element
@@ -3422,23 +3926,33 @@
* declaration of this element
*/
MethodElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
- _jtd_constructor_213_impl(name, nameOffset);
+ _jtd_constructor_217_impl(name, nameOffset);
}
- _jtd_constructor_213_impl(String name, int nameOffset) {
+ _jtd_constructor_217_impl(String name, int nameOffset) {
}
accept(ElementVisitor visitor) => visitor.visitMethodElement(this);
ClassElement get enclosingElement => super.enclosingElement as ClassElement;
ElementKind get kind => ElementKind.METHOD;
+ String get name {
+ String name2 = super.name;
+ if (isOperator() && name2 == "-") {
+ if (parameters.length == 0) {
+ return "unary-";
+ }
+ }
+ return super.name;
+ }
bool isAbstract() => hasModifier(Modifier.ABSTRACT);
bool isOperator() {
- String name2 = name;
- if (name2.isEmpty) {
+ String name = displayName;
+ if (name.isEmpty) {
return false;
}
- int first = name2.codeUnitAt(0);
+ int first = name.codeUnitAt(0);
return !((0x61 <= first && first <= 0x7A) || (0x41 <= first && first <= 0x5A) || first == 0x5F || first == 0x24);
}
bool isStatic() => hasModifier(Modifier.STATIC);
+
/**
* Set whether this method is abstract to correspond to the given value.
* @param isAbstract {@code true} if the method is abstract
@@ -3446,6 +3960,7 @@
void set abstract(bool isAbstract) {
setModifier(Modifier.ABSTRACT, isAbstract);
}
+
/**
* Set whether this method is static to correspond to the given value.
* @param isStatic {@code true} if the method is static
@@ -3454,12 +3969,13 @@
setModifier(Modifier.STATIC, isStatic);
}
void appendTo(JavaStringBuilder builder) {
- builder.append(enclosingElement.name);
+ builder.append(enclosingElement.displayName);
builder.append(".");
- builder.append(name);
+ builder.append(displayName);
super.appendTo(builder);
}
}
+
/**
* The enumeration {@code Modifier} defines constants for all of the modifiers defined by the Dart
* language and for a few additional flags that are useful.
@@ -3471,39 +3987,47 @@
static final Modifier FACTORY = new Modifier('FACTORY', 2);
static final Modifier FINAL = new Modifier('FINAL', 3);
static final Modifier GETTER = new Modifier('GETTER', 4);
- static final Modifier INITIALIZING_FORMAL = new Modifier('INITIALIZING_FORMAL', 5);
- static final Modifier MIXIN = new Modifier('MIXIN', 6);
+ static final Modifier MIXIN = new Modifier('MIXIN', 5);
+ static final Modifier REFERENCES_SUPER = new Modifier('REFERENCES_SUPER', 6);
static final Modifier SETTER = new Modifier('SETTER', 7);
static final Modifier STATIC = new Modifier('STATIC', 8);
static final Modifier SYNTHETIC = new Modifier('SYNTHETIC', 9);
static final Modifier TYPEDEF = new Modifier('TYPEDEF', 10);
- static final List<Modifier> values = [ABSTRACT, CONST, FACTORY, FINAL, GETTER, INITIALIZING_FORMAL, MIXIN, SETTER, STATIC, SYNTHETIC, TYPEDEF];
- final String __name;
- final int __ordinal;
- int get ordinal => __ordinal;
- Modifier(this.__name, this.__ordinal) {
+ static final List<Modifier> values = [ABSTRACT, CONST, FACTORY, FINAL, GETTER, MIXIN, REFERENCES_SUPER, SETTER, STATIC, SYNTHETIC, TYPEDEF];
+
+ /// The name of this enum constant, as declared in the enum declaration.
+ final String name;
+
+ /// The position in the enum declaration.
+ final int ordinal;
+ Modifier(this.name, this.ordinal) {
}
- int compareTo(Modifier other) => __ordinal - other.__ordinal;
- String toString() => __name;
+ int compareTo(Modifier other) => ordinal - other.ordinal;
+ String toString() => name;
}
+
/**
* Instances of the class {@code MultiplyDefinedElementImpl} represent a collection of elements that
* have the same name within the same scope.
* @coverage dart.engine.element
*/
class MultiplyDefinedElementImpl implements MultiplyDefinedElement {
+
/**
* The analysis context in which the multiply defined elements are defined.
*/
AnalysisContext _context;
+
/**
* The name of the conflicting elements.
*/
String _name;
+
/**
* A list containing all of the elements that conflict.
*/
List<Element> _conflictingElements;
+
/**
* Initialize a newly created element to represent a list of conflicting elements.
* @param context the analysis context in which the multiply defined elements are defined
@@ -3519,6 +4043,7 @@
Element getAncestor(Type elementClass) => null;
List<Element> get conflictingElements => _conflictingElements;
AnalysisContext get context => _context;
+ String get displayName => _name;
Element get enclosingElement => null;
ElementKind get kind => ElementKind.ERROR;
LibraryElement get library => null;
@@ -3551,6 +4076,7 @@
}
void visitChildren(ElementVisitor<Object> visitor) {
}
+
/**
* Add the given element to the list of elements. If the element is a multiply-defined element,
* add all of the conflicting elements that it represents.
@@ -3566,6 +4092,7 @@
elements.add(element);
}
}
+
/**
* Use the given elements to construct an array of conflicting elements. If either of the given
* elements are multiply-defined elements then the conflicting elements they represent will be
@@ -3581,33 +4108,40 @@
return new List.from(elements);
}
}
+
/**
* Instances of the class {@code ParameterElementImpl} implement a {@code ParameterElement}.
* @coverage dart.engine.element
*/
class ParameterElementImpl extends VariableElementImpl implements ParameterElement {
+
/**
* An array containing all of the parameters defined by this parameter element. There will only be
* parameters if this parameter is a function typed parameter.
*/
List<ParameterElement> _parameters = ParameterElementImpl.EMPTY_ARRAY;
+
/**
* The kind of this parameter.
*/
ParameterKind _parameterKind;
+
/**
* The offset to the beginning of the visible range for this element.
*/
int _visibleRangeOffset = 0;
+
/**
* The length of the visible range for this element, or {@code -1} if this element does not have a
* visible range.
*/
int _visibleRangeLength = -1;
+
/**
* An empty array of field elements.
*/
static List<ParameterElement> EMPTY_ARRAY = new List<ParameterElement>(0);
+
/**
* Initialize a newly created parameter element to have the given name.
* @param name the name of this element
@@ -3624,21 +4158,16 @@
}
return new SourceRange(_visibleRangeOffset, _visibleRangeLength);
}
- bool isInitializingFormal() => hasModifier(Modifier.INITIALIZING_FORMAL);
+ bool isInitializingFormal() => false;
+
/**
- * Set whether this parameter is an initializing formal parameter to match the given value.
- * @param isInitializingFormal {@code true} if this parameter is an initializing formal parameter
- */
- void set initializingFormal(bool isInitializingFormal) {
- setModifier(Modifier.INITIALIZING_FORMAL, isInitializingFormal);
- }
- /**
* Set the kind of this parameter to the given kind.
* @param parameterKind the new kind of this parameter
*/
void set parameterKind(ParameterKind parameterKind2) {
this._parameterKind = parameterKind2;
}
+
/**
* Set the parameters defined by this executable element to the given parameters.
* @param parameters the parameters defined by this executable element
@@ -3649,6 +4178,7 @@
}
this._parameters = parameters2;
}
+
/**
* Set the visible range for this element to the range starting at the given offset with the given
* length.
@@ -3680,23 +4210,27 @@
builder.append(left);
builder.append(type);
builder.append(" ");
- builder.append(name);
+ builder.append(displayName);
builder.append(right);
}
}
+
/**
* Instances of the class {@code PrefixElementImpl} implement a {@code PrefixElement}.
* @coverage dart.engine.element
*/
class PrefixElementImpl extends ElementImpl implements PrefixElement {
+
/**
* An array containing all of the libraries that are imported using this prefix.
*/
List<LibraryElement> _importedLibraries = LibraryElementImpl.EMPTY_ARRAY;
+
/**
* An empty array of prefix elements.
*/
static List<PrefixElement> EMPTY_ARRAY = new List<PrefixElement>(0);
+
/**
* Initialize a newly created prefix element to have the given name.
* @param name the name of this element
@@ -3707,6 +4241,7 @@
LibraryElement get enclosingElement => super.enclosingElement as LibraryElement;
List<LibraryElement> get importedLibraries => _importedLibraries;
ElementKind get kind => ElementKind.PREFIX;
+
/**
* Set the libraries that are imported using this prefix to the given libraries.
* @param importedLibraries the libraries that are imported using this prefix
@@ -3722,59 +4257,93 @@
super.appendTo(builder);
}
}
+
/**
* Instances of the class {@code PropertyAccessorElementImpl} implement a{@code PropertyAccessorElement}.
* @coverage dart.engine.element
*/
class PropertyAccessorElementImpl extends ExecutableElementImpl implements PropertyAccessorElement {
+
/**
* The variable associated with this accessor.
*/
PropertyInducingElement _variable;
+
/**
* An empty array of property accessor elements.
*/
static List<PropertyAccessorElement> EMPTY_ARRAY = new List<PropertyAccessorElement>(0);
+
/**
* Initialize a newly created property accessor element to have the given name.
* @param name the name of this element
*/
PropertyAccessorElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_218_impl(name);
+ _jtd_constructor_222_impl(name);
}
- _jtd_constructor_218_impl(Identifier name) {
+ _jtd_constructor_222_impl(Identifier name) {
}
+
/**
* Initialize a newly created synthetic property accessor element to be associated with the given
* variable.
* @param variable the variable with which this access is associated
*/
- PropertyAccessorElementImpl.con2(PropertyInducingElementImpl variable2) : super.con2(variable2.name, -1) {
- _jtd_constructor_219_impl(variable2);
+ PropertyAccessorElementImpl.con2(PropertyInducingElementImpl variable2) : super.con2(variable2.name, variable2.nameOffset) {
+ _jtd_constructor_223_impl(variable2);
}
- _jtd_constructor_219_impl(PropertyInducingElementImpl variable2) {
+ _jtd_constructor_223_impl(PropertyInducingElementImpl variable2) {
this._variable = variable2;
synthetic = true;
}
accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
bool operator ==(Object object) => super == object && identical(isGetter(), ((object as PropertyAccessorElement)).isGetter());
+ PropertyAccessorElement get correspondingGetter {
+ if (isGetter() || _variable == null) {
+ return null;
+ }
+ return _variable.getter;
+ }
+ PropertyAccessorElement get correspondingSetter {
+ if (isSetter() || _variable == null) {
+ return null;
+ }
+ return _variable.setter;
+ }
ElementKind get kind {
if (isGetter()) {
return ElementKind.GETTER;
}
return ElementKind.SETTER;
}
+ String get name {
+ if (isSetter()) {
+ return "${super.name}=";
+ }
+ return super.name;
+ }
PropertyInducingElement get variable => _variable;
+ bool isAbstract() => hasModifier(Modifier.ABSTRACT);
bool isGetter() => hasModifier(Modifier.GETTER);
bool isSetter() => hasModifier(Modifier.SETTER);
- bool isStatic() => variable.isStatic();
+ bool isStatic() => hasModifier(Modifier.STATIC);
+
/**
+ * Set whether this accessor is abstract to correspond to the given value.
+ * @param isAbstract {@code true} if the accessor is abstract
+ */
+ void set abstract(bool isAbstract) {
+ setModifier(Modifier.ABSTRACT, isAbstract);
+ }
+
+ /**
* Set whether this accessor is a getter to correspond to the given value.
* @param isGetter {@code true} if the accessor is a getter
*/
void set getter(bool isGetter) {
setModifier(Modifier.GETTER, isGetter);
}
+
/**
* Set whether this accessor is a setter to correspond to the given value.
* @param isSetter {@code true} if the accessor is a setter
@@ -3782,7 +4351,16 @@
void set setter(bool isSetter) {
setModifier(Modifier.SETTER, isSetter);
}
+
/**
+ * Set whether this accessor is static to correspond to the given value.
+ * @param isStatic {@code true} if the accessor is static
+ */
+ void set static(bool isStatic) {
+ setModifier(Modifier.STATIC, isStatic);
+ }
+
+ /**
* Set the variable associated with this accessor to the given variable.
* @param variable the variable associated with this accessor
*/
@@ -3791,48 +4369,55 @@
}
void appendTo(JavaStringBuilder builder) {
builder.append(isGetter() ? "get " : "set ");
- builder.append(variable.name);
+ builder.append(variable.displayName);
super.appendTo(builder);
}
}
+
/**
* Instances of the class {@code PropertyInducingElementImpl} implement a{@code PropertyInducingElement}.
* @coverage dart.engine.element
*/
abstract class PropertyInducingElementImpl extends VariableElementImpl implements PropertyInducingElement {
+
/**
* The getter associated with this element.
*/
PropertyAccessorElement _getter;
+
/**
* The setter associated with this element, or {@code null} if the element is effectively{@code final} and therefore does not have a setter associated with it.
*/
PropertyAccessorElement _setter;
+
/**
* An empty array of elements.
*/
static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingElement>(0);
+
/**
* Initialize a newly created element to have the given name.
* @param name the name of this element
*/
PropertyInducingElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_220_impl(name);
+ _jtd_constructor_224_impl(name);
}
- _jtd_constructor_220_impl(Identifier name) {
+ _jtd_constructor_224_impl(Identifier name) {
}
+
/**
* Initialize a newly created synthetic element to have the given name.
* @param name the name of this element
*/
PropertyInducingElementImpl.con2(String name) : super.con2(name, -1) {
- _jtd_constructor_221_impl(name);
+ _jtd_constructor_225_impl(name);
}
- _jtd_constructor_221_impl(String name) {
+ _jtd_constructor_225_impl(String name) {
synthetic = true;
}
PropertyAccessorElement get getter => _getter;
PropertyAccessorElement get setter => _setter;
+
/**
* Set the getter associated with this element to the given accessor.
* @param getter the getter associated with this element
@@ -3840,6 +4425,7 @@
void set getter(PropertyAccessorElement getter2) {
this._getter = getter2;
}
+
/**
* Set the setter associated with this element to the given accessor.
* @param setter the setter associated with this element
@@ -3848,22 +4434,20 @@
this._setter = setter2;
}
}
+
/**
* Instances of the class {@code ShowCombinatorImpl} implement a {@link ShowCombinator}.
* @coverage dart.engine.element
*/
class ShowCombinatorImpl implements ShowCombinator {
+
/**
* The names that are to be made visible in the importing library if they are defined in the
* imported library.
*/
List<String> _shownNames = StringUtilities.EMPTY_ARRAY;
- /**
- * Initialize a newly created combinator.
- */
- ShowCombinatorImpl() : super() {
- }
List<String> get shownNames => _shownNames;
+
/**
* Set the names that are to be made visible in the importing library if they are defined in the
* imported library to the given names.
@@ -3885,55 +4469,64 @@
return builder.toString();
}
}
+
/**
* Instances of the class {@code TopLevelVariableElementImpl} implement a{@code TopLevelVariableElement}.
* @coverage dart.engine.element
*/
class TopLevelVariableElementImpl extends PropertyInducingElementImpl implements TopLevelVariableElement {
+
/**
* An empty array of top-level variable elements.
*/
static List<TopLevelVariableElement> EMPTY_ARRAY = new List<TopLevelVariableElement>(0);
+
/**
* Initialize a newly created top-level variable element to have the given name.
* @param name the name of this element
*/
TopLevelVariableElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_223_impl(name);
+ _jtd_constructor_227_impl(name);
}
- _jtd_constructor_223_impl(Identifier name) {
+ _jtd_constructor_227_impl(Identifier name) {
}
+
/**
* Initialize a newly created synthetic top-level variable element to have the given name.
* @param name the name of this element
*/
TopLevelVariableElementImpl.con2(String name) : super.con2(name) {
- _jtd_constructor_224_impl(name);
+ _jtd_constructor_228_impl(name);
}
- _jtd_constructor_224_impl(String name) {
+ _jtd_constructor_228_impl(String name) {
}
accept(ElementVisitor visitor) => visitor.visitTopLevelVariableElement(this);
ElementKind get kind => ElementKind.TOP_LEVEL_VARIABLE;
bool isStatic() => true;
}
+
/**
* Instances of the class {@code TypeVariableElementImpl} implement a {@code TypeVariableElement}.
* @coverage dart.engine.element
*/
class TypeVariableElementImpl extends ElementImpl implements TypeVariableElement {
+
/**
* The type defined by this type variable.
*/
TypeVariableType _type;
+
/**
* The type representing the bound associated with this variable, or {@code null} if this variable
* does not have an explicit bound.
*/
Type2 _bound;
+
/**
* An empty array of type variable elements.
*/
static List<TypeVariableElement> EMPTY_ARRAY = new List<TypeVariableElement>(0);
+
/**
* Initialize a newly created type variable element to have the given name.
* @param name the name of this element
@@ -3944,6 +4537,7 @@
Type2 get bound => _bound;
ElementKind get kind => ElementKind.TYPE_VARIABLE;
TypeVariableType get type => _type;
+
/**
* Set the type representing the bound associated with this variable to the given type.
* @param bound the type representing the bound associated with this variable
@@ -3951,6 +4545,7 @@
void set bound(Type2 bound2) {
this._bound = bound2;
}
+
/**
* Set the type defined by this type variable to the given type
* @param type the type defined by this type variable
@@ -3959,40 +4554,46 @@
this._type = type2;
}
void appendTo(JavaStringBuilder builder) {
- builder.append(name);
+ builder.append(displayName);
if (_bound != null) {
builder.append(" extends ");
builder.append(_bound);
}
}
}
+
/**
* Instances of the class {@code VariableElementImpl} implement a {@code VariableElement}.
* @coverage dart.engine.element
*/
abstract class VariableElementImpl extends ElementImpl implements VariableElement {
+
/**
* The declared type of this variable.
*/
Type2 _type;
+
/**
* A synthetic function representing this variable's initializer, or {@code null} if this variable
* does not have an initializer.
*/
FunctionElement _initializer;
+
/**
* An empty array of variable elements.
*/
static List<VariableElement> EMPTY_ARRAY = new List<VariableElement>(0);
+
/**
* Initialize a newly created variable element to have the given name.
* @param name the name of this element
*/
VariableElementImpl.con1(Identifier name) : super.con1(name) {
- _jtd_constructor_226_impl(name);
+ _jtd_constructor_230_impl(name);
}
- _jtd_constructor_226_impl(Identifier name) {
+ _jtd_constructor_230_impl(Identifier name) {
}
+
/**
* Initialize a newly created variable element to have the given name.
* @param name the name of this element
@@ -4000,10 +4601,11 @@
* declaration of this element
*/
VariableElementImpl.con2(String name, int nameOffset) : super.con2(name, nameOffset) {
- _jtd_constructor_227_impl(name, nameOffset);
+ _jtd_constructor_231_impl(name, nameOffset);
}
- _jtd_constructor_227_impl(String name, int nameOffset) {
+ _jtd_constructor_231_impl(String name, int nameOffset) {
}
+
/**
* Return the result of evaluating this variable's initializer as a compile-time constant
* expression, or {@code null} if this variable is not a 'const' variable or does not have an
@@ -4015,6 +4617,7 @@
Type2 get type => _type;
bool isConst() => hasModifier(Modifier.CONST);
bool isFinal() => hasModifier(Modifier.FINAL);
+
/**
* Set whether this variable is const to correspond to the given value.
* @param isConst {@code true} if the variable is const
@@ -4022,6 +4625,7 @@
void set const3(bool isConst) {
setModifier(Modifier.CONST, isConst);
}
+
/**
* Set the result of evaluating this variable's initializer as a compile-time constant expression
* to the given result.
@@ -4030,6 +4634,7 @@
void set evaluationResult(EvaluationResultImpl result) {
throw new IllegalStateException("Invalid attempt to set a compile-time constant result");
}
+
/**
* Set whether this variable is final to correspond to the given value.
* @param isFinal {@code true} if the variable is final
@@ -4037,6 +4642,7 @@
void set final2(bool isFinal) {
setModifier(Modifier.FINAL, isFinal);
}
+
/**
* Set the function representing this variable's initializer to the given function.
* @param initializer the function representing this variable's initializer
@@ -4047,6 +4653,7 @@
}
this._initializer = initializer2;
}
+
/**
* Set the declared type of this variable to the given type.
* @param type the declared type of this variable
@@ -4061,15 +4668,89 @@
void appendTo(JavaStringBuilder builder) {
builder.append(type);
builder.append(" ");
- builder.append(name);
+ builder.append(displayName);
}
}
+
/**
+ * Instances of the class {@code ConstructorMember} represent a constructor element defined in a
+ * parameterized type where the values of the type parameters are known.
+ */
+class ConstructorMember extends ExecutableMember implements ConstructorElement {
+
+ /**
+ * If the given constructor's type is different when any type parameters from the defining type's
+ * declaration are replaced with the actual type arguments from the defining type, create a
+ * constructor member representing the given constructor. Return the member that was created, or
+ * the base constructor if no member was created.
+ * @param baseConstructor the base constructor for which a member might be created
+ * @param definingType the type defining the parameters and arguments to be used in the
+ * substitution
+ * @return the constructor element that will return the correctly substituted types
+ */
+ static ConstructorElement from(ConstructorElement baseConstructor, InterfaceType definingType) {
+ if (baseConstructor == null || definingType.typeArguments.length == 0) {
+ return baseConstructor;
+ }
+ FunctionType baseType = baseConstructor.type;
+ List<Type2> argumentTypes = definingType.typeArguments;
+ List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
+ FunctionType substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
+ if (baseType == substitutedType) {
+ return baseConstructor;
+ }
+ return new ConstructorMember(baseConstructor, definingType);
+ }
+
+ /**
+ * Initialize a newly created element to represent a constructor of the given parameterized type.
+ * @param baseElement the element on which the parameterized element was created
+ * @param definingType the type in which the element is defined
+ */
+ ConstructorMember(ConstructorElement baseElement, InterfaceType definingType) : super(baseElement, definingType) {
+ }
+ accept(ElementVisitor visitor) => visitor.visitConstructorElement(this);
+ ConstructorElement get baseElement => super.baseElement as ConstructorElement;
+ ClassElement get enclosingElement => baseElement.enclosingElement;
+ ConstructorElement get redirectedConstructor => from(baseElement.redirectedConstructor, definingType);
+ bool isConst() => baseElement.isConst();
+ bool isFactory() => baseElement.isFactory();
+ String toString() {
+ ConstructorElement baseElement2 = baseElement;
+ List<ParameterElement> parameters2 = parameters;
+ FunctionType type2 = type;
+ JavaStringBuilder builder = new JavaStringBuilder();
+ builder.append(baseElement2.enclosingElement.displayName);
+ String name = displayName;
+ if (name != null && !name.isEmpty) {
+ builder.append(".");
+ builder.append(name);
+ }
+ builder.append("(");
+ int parameterCount = parameters2.length;
+ for (int i = 0; i < parameterCount; i++) {
+ if (i > 0) {
+ builder.append(", ");
+ }
+ builder.append(parameters2[i]).toString();
+ }
+ builder.append(")");
+ if (type2 != null) {
+ builder.append(" -> ");
+ builder.append(type2.returnType);
+ }
+ return builder.toString();
+ }
+ InterfaceType get definingType => super.definingType as InterfaceType;
+}
+
+/**
* The abstract class {@code ExecutableMember} defines the behavior common to members that represent
* an executable element defined in a parameterized type where the values of the type parameters are
* known.
*/
abstract class ExecutableMember extends Member implements ExecutableElement {
+
/**
* Initialize a newly created element to represent an executable element of the given
* parameterized type.
@@ -4109,11 +4790,13 @@
safelyVisitChildren(parameters, visitor);
}
}
+
/**
* Instances of the class {@code FieldMember} represent a field element defined in a parameterized
* type where the values of the type parameters are known.
*/
class FieldMember extends VariableMember implements FieldElement {
+
/**
* If the given field's type is different when any type parameters from the defining type's
* declaration are replaced with the actual type arguments from the defining type, create a field
@@ -4140,6 +4823,7 @@
}
return new FieldMember(baseField, definingType);
}
+
/**
* Initialize a newly created element to represent a field of the given parameterized type.
* @param baseElement the element on which the parameterized element was created
@@ -4153,43 +4837,48 @@
PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
bool isStatic() => baseElement.isStatic();
+ InterfaceType get definingType => super.definingType as InterfaceType;
}
+
/**
* The abstract class {@code Member} defines the behavior common to elements that represent members
* of parameterized types.
*/
abstract class Member implements Element {
+
/**
* The element on which the parameterized element was created.
*/
Element _baseElement;
+
/**
* The type in which the element is defined.
*/
- InterfaceType _definingType;
+ ParameterizedType _definingType;
+
/**
* Initialize a newly created element to represent the member of the given parameterized type.
* @param baseElement the element on which the parameterized element was created
* @param definingType the type in which the element is defined
*/
- Member(Element baseElement, InterfaceType definingType) {
+ Member(Element baseElement, ParameterizedType definingType) {
this._baseElement = baseElement;
this._definingType = definingType;
}
String computeDocumentationComment() => _baseElement.computeDocumentationComment();
Element getAncestor(Type elementClass) => baseElement.getAncestor(elementClass);
+
/**
* Return the element on which the parameterized element was created.
* @return the element on which the parameterized element was created
*/
Element get baseElement => _baseElement;
AnalysisContext get context => _baseElement.context;
+ String get displayName => _baseElement.displayName;
ElementKind get kind => _baseElement.kind;
LibraryElement get library => _baseElement.library;
ElementLocation get location => _baseElement.location;
- List<Annotation> get metadata {
- throw new UnsupportedOperationException();
- }
+ List<Annotation> get metadata => _baseElement.metadata;
String get name => _baseElement.name;
int get nameOffset => _baseElement.nameOffset;
Source get source => _baseElement.source;
@@ -4197,11 +4886,13 @@
bool isSynthetic() => _baseElement.isSynthetic();
void visitChildren(ElementVisitor<Object> visitor) {
}
+
/**
* Return the type in which the element is defined.
* @return the type in which the element is defined
*/
- InterfaceType get definingType => _definingType;
+ ParameterizedType get definingType => _definingType;
+
/**
* If the given child is not {@code null}, use the given visitor to visit it.
* @param child the child to be visited
@@ -4212,6 +4903,7 @@
child.accept(visitor);
}
}
+
/**
* Use the given visitor to visit all of the children in the given array.
* @param children the children to be visited
@@ -4224,6 +4916,7 @@
}
}
}
+
/**
* Return the type that results from replacing the type parameters in the given type with the type
* arguments.
@@ -4232,9 +4925,10 @@
*/
Type2 substituteFor(Type2 type) {
List<Type2> argumentTypes = _definingType.typeArguments;
- List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(_definingType.element.typeVariables);
+ List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(_definingType.typeVariables);
return type.substitute2(argumentTypes, parameterTypes) as Type2;
}
+
/**
* Return the array of types that results from replacing the type parameters in the given types
* with the type arguments.
@@ -4250,11 +4944,13 @@
return substitutedTypes;
}
}
+
/**
* Instances of the class {@code MethodMember} represent a method element defined in a parameterized
* type where the values of the type parameters are known.
*/
class MethodMember extends ExecutableMember implements MethodElement {
+
/**
* If the given method's type is different when any type parameters from the defining type's
* declaration are replaced with the actual type arguments from the defining type, create a method
@@ -4278,6 +4974,7 @@
}
return new MethodMember(baseMethod, definingType);
}
+
/**
* Initialize a newly created element to represent a method of the given parameterized type.
* @param baseElement the element on which the parameterized element was created
@@ -4294,9 +4991,9 @@
List<ParameterElement> parameters2 = parameters;
FunctionType type2 = type;
JavaStringBuilder builder = new JavaStringBuilder();
- builder.append(baseElement2.enclosingElement.name);
+ builder.append(baseElement2.enclosingElement.displayName);
builder.append(".");
- builder.append(baseElement2.name);
+ builder.append(baseElement2.displayName);
builder.append("(");
int parameterCount = parameters2.length;
for (int i = 0; i < parameterCount; i++) {
@@ -4313,11 +5010,13 @@
return builder.toString();
}
}
+
/**
* Instances of the class {@code ParameterMember} represent a parameter element defined in a
* parameterized type where the values of the type parameters are known.
*/
class ParameterMember extends VariableMember implements ParameterElement {
+
/**
* If the given parameter's type is different when any type parameters from the defining type's
* declaration are replaced with the actual type arguments from the defining type, create a
@@ -4328,33 +5027,40 @@
* substitution
* @return the parameter element that will return the correctly substituted types
*/
- static ParameterElement from(ParameterElement baseParameter, InterfaceType definingType) {
+ static ParameterElement from(ParameterElement baseParameter, ParameterizedType definingType) {
if (baseParameter == null || definingType.typeArguments.length == 0) {
return baseParameter;
}
Type2 baseType = baseParameter.type;
List<Type2> argumentTypes = definingType.typeArguments;
- List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.element.typeVariables);
+ List<Type2> parameterTypes = TypeVariableTypeImpl.getTypes(definingType.typeVariables);
Type2 substitutedType = baseType.substitute2(argumentTypes, parameterTypes);
if (baseType == substitutedType) {
return baseParameter;
}
return new ParameterMember(baseParameter, definingType);
}
+
/**
* Initialize a newly created element to represent a parameter of the given parameterized type.
* @param baseElement the element on which the parameterized element was created
* @param definingType the type in which the element is defined
*/
- ParameterMember(ParameterElement baseElement, InterfaceType definingType) : super(baseElement, definingType) {
+ ParameterMember(ParameterElement baseElement, ParameterizedType definingType) : super(baseElement, definingType) {
}
accept(ElementVisitor visitor) => visitor.visitParameterElement(this);
Element getAncestor(Type elementClass) {
Element element = baseElement.getAncestor(elementClass);
- if (element is MethodElement) {
- return MethodMember.from((element as MethodElement), definingType) as Element;
- } else if (element is PropertyAccessorElement) {
- return PropertyAccessorMember.from((element as PropertyAccessorElement), definingType) as Element;
+ ParameterizedType definingType2 = definingType;
+ if (definingType2 is InterfaceType) {
+ InterfaceType definingInterfaceType = definingType2 as InterfaceType;
+ if (element is ConstructorElement) {
+ return ConstructorMember.from((element as ConstructorElement), definingInterfaceType) as Element;
+ } else if (element is MethodElement) {
+ return MethodMember.from((element as MethodElement), definingInterfaceType) as Element;
+ } else if (element is PropertyAccessorElement) {
+ return PropertyAccessorMember.from((element as PropertyAccessorElement), definingInterfaceType) as Element;
+ }
}
return element;
}
@@ -4393,7 +5099,7 @@
builder.append(left);
builder.append(type);
builder.append(" ");
- builder.append(baseElement2.name);
+ builder.append(baseElement2.displayName);
builder.append(right);
return builder.toString();
}
@@ -4402,11 +5108,13 @@
safelyVisitChildren(parameters, visitor);
}
}
+
/**
* Instances of the class {@code PropertyAccessorMember} represent a property accessor element
* defined in a parameterized type where the values of the type parameters are known.
*/
class PropertyAccessorMember extends ExecutableMember implements PropertyAccessorElement {
+
/**
* If the given property accessor's type is different when any type parameters from the defining
* type's declaration are replaced with the actual type arguments from the defining type, create a
@@ -4430,6 +5138,7 @@
}
return new PropertyAccessorMember(baseAccessor, definingType);
}
+
/**
* Initialize a newly created element to represent a property accessor of the given parameterized
* type.
@@ -4440,6 +5149,8 @@
}
accept(ElementVisitor visitor) => visitor.visitPropertyAccessorElement(this);
PropertyAccessorElement get baseElement => super.baseElement as PropertyAccessorElement;
+ PropertyAccessorElement get correspondingGetter => from(baseElement.correspondingGetter, definingType);
+ PropertyAccessorElement get correspondingSetter => from(baseElement.correspondingSetter, definingType);
Element get enclosingElement => baseElement.enclosingElement;
PropertyInducingElement get variable {
PropertyInducingElement variable2 = baseElement.variable;
@@ -4448,22 +5159,26 @@
}
return variable2;
}
+ bool isAbstract() => baseElement.isAbstract();
bool isGetter() => baseElement.isGetter();
bool isSetter() => baseElement.isSetter();
+ InterfaceType get definingType => super.definingType as InterfaceType;
}
+
/**
* The abstract class {@code VariableMember} defines the behavior common to members that represent a
* variable element defined in a parameterized type where the values of the type parameters are
* known.
*/
abstract class VariableMember extends Member implements VariableElement {
+
/**
* Initialize a newly created element to represent an executable element of the given
* parameterized type.
* @param baseElement the element on which the parameterized element was created
* @param definingType the type in which the element is defined
*/
- VariableMember(VariableElement baseElement, InterfaceType definingType) : super(baseElement, definingType) {
+ VariableMember(VariableElement baseElement, ParameterizedType definingType) : super(baseElement, definingType) {
}
VariableElement get baseElement => super.baseElement as VariableElement;
FunctionElement get initializer {
@@ -4477,20 +5192,48 @@
safelyVisitChild(baseElement.initializer, visitor);
}
}
+
/**
+ * Instances of the class {@code AnonymousFunctionTypeImpl} extend the behavior of{@link FunctionTypeImpl} to support anonymous function types created for function typed
+ * parameters.
+ * @coverage dart.engine.type
+ */
+class AnonymousFunctionTypeImpl extends FunctionTypeImpl {
+
+ /**
+ * An array of parameters elements of this type of function.
+ */
+ List<ParameterElement> _baseParameters = ParameterElementImpl.EMPTY_ARRAY;
+ AnonymousFunctionTypeImpl() : super.con2((null as FunctionTypeAliasElement)) {
+ }
+
+ /**
+ * Sets the parameters elements of this type of function.
+ * @param parameters the parameters elements of this type of function
+ */
+ void set baseParameters(List<ParameterElement> parameters) {
+ this._baseParameters = parameters;
+ }
+ List<ParameterElement> get baseParameters => _baseParameters;
+}
+
+/**
* The unique instance of the class {@code BottomTypeImpl} implements the type {@code bottom}.
* @coverage dart.engine.type
*/
class BottomTypeImpl extends TypeImpl {
+
/**
* The unique instance of this class.
*/
static BottomTypeImpl _INSTANCE = new BottomTypeImpl();
+
/**
* Return the unique instance of this class.
* @return the unique instance of this class
*/
static BottomTypeImpl get instance => _INSTANCE;
+
/**
* Prevent the creation of instances of this class.
*/
@@ -4502,20 +5245,24 @@
bool isSupertypeOf(Type2 type) => false;
BottomTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
}
+
/**
* The unique instance of the class {@code DynamicTypeImpl} implements the type {@code dynamic}.
* @coverage dart.engine.type
*/
class DynamicTypeImpl extends TypeImpl {
+
/**
* The unique instance of this class.
*/
static DynamicTypeImpl _INSTANCE = new DynamicTypeImpl();
+
/**
* Return the unique instance of this class.
* @return the unique instance of this class
*/
static DynamicTypeImpl get instance => _INSTANCE;
+
/**
* Prevent the creation of instances of this class.
*/
@@ -4529,12 +5276,14 @@
bool isSupertypeOf(Type2 type) => true;
DynamicTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
}
+
/**
* Instances of the class {@code FunctionTypeImpl} defines the behavior common to objects
* representing the type of a function, method, constructor, getter, or setter.
* @coverage dart.engine.type
*/
class FunctionTypeImpl extends TypeImpl implements FunctionType {
+
/**
* Return {@code true} if all of the name/type pairs in the first map are equal to the
* corresponding name/type pairs in the second map. The maps are expected to iterate over their
@@ -4559,6 +5308,7 @@
}
return true;
}
+
/**
* Return a map containing the results of using the given argument types and parameter types to
* perform a substitution on all of the values in the given map. The order of the entries will be
@@ -4578,49 +5328,56 @@
}
return newTypes;
}
+
/**
* An array containing the actual types of the type arguments.
*/
List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY;
+
/**
* An array containing the types of the normal parameters of this type of function. The parameter
* types are in the same order as they appear in the declaration of the function.
* @return the types of the normal parameters of this type of function
*/
List<Type2> _normalParameterTypes = TypeImpl.EMPTY_ARRAY;
+
/**
* A table mapping the names of optional (positional) parameters to the types of the optional
* parameters of this type of function.
*/
List<Type2> _optionalParameterTypes = TypeImpl.EMPTY_ARRAY;
+
/**
* A table mapping the names of named parameters to the types of the named parameters of this type
* of function.
*/
Map<String, Type2> _namedParameterTypes = new Map();
+
/**
* The type of object returned by this type of function.
*/
Type2 _returnType = VoidTypeImpl.instance;
+
/**
* Initialize a newly created function type to be declared by the given element and to have the
* given name.
* @param element the element representing the declaration of the function type
*/
FunctionTypeImpl.con1(ExecutableElement element) : super(element, element == null ? null : element.name) {
- _jtd_constructor_291_impl(element);
+ _jtd_constructor_298_impl(element);
}
- _jtd_constructor_291_impl(ExecutableElement element) {
+ _jtd_constructor_298_impl(ExecutableElement element) {
}
+
/**
* Initialize a newly created function type to be declared by the given element and to have the
* given name.
* @param element the element representing the declaration of the function type
*/
FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name) {
- _jtd_constructor_292_impl(element);
+ _jtd_constructor_299_impl(element);
}
- _jtd_constructor_292_impl(FunctionTypeAliasElement element) {
+ _jtd_constructor_299_impl(FunctionTypeAliasElement element) {
}
bool operator ==(Object object) {
if (object is! FunctionTypeImpl) {
@@ -4629,11 +5386,92 @@
FunctionTypeImpl otherType = object as FunctionTypeImpl;
return element == otherType.element && JavaArrays.equals(_normalParameterTypes, otherType._normalParameterTypes) && JavaArrays.equals(_optionalParameterTypes, otherType._optionalParameterTypes) && equals2(_namedParameterTypes, otherType._namedParameterTypes) && _returnType == otherType._returnType;
}
+ String get displayName {
+ String name2 = name;
+ if (name2 == null) {
+ JavaStringBuilder builder = new JavaStringBuilder();
+ builder.append("(");
+ bool needsComma = false;
+ if (_normalParameterTypes.length > 0) {
+ for (Type2 type in _normalParameterTypes) {
+ if (needsComma) {
+ builder.append(", ");
+ } else {
+ needsComma = true;
+ }
+ builder.append(type.displayName);
+ }
+ }
+ if (_optionalParameterTypes.length > 0) {
+ if (needsComma) {
+ builder.append(", ");
+ needsComma = false;
+ }
+ builder.append("[");
+ for (Type2 type in _optionalParameterTypes) {
+ if (needsComma) {
+ builder.append(", ");
+ } else {
+ needsComma = true;
+ }
+ builder.append(type.displayName);
+ }
+ builder.append("]");
+ needsComma = true;
+ }
+ if (_namedParameterTypes.length > 0) {
+ if (needsComma) {
+ builder.append(", ");
+ needsComma = false;
+ }
+ builder.append("{");
+ for (MapEntry<String, Type2> entry in getMapEntrySet(_namedParameterTypes)) {
+ if (needsComma) {
+ builder.append(", ");
+ } else {
+ needsComma = true;
+ }
+ builder.append(entry.getKey());
+ builder.append(": ");
+ builder.append(entry.getValue().displayName);
+ }
+ builder.append("}");
+ needsComma = true;
+ }
+ builder.append(") -> ");
+ if (_returnType == null) {
+ builder.append("null");
+ } else {
+ builder.append(_returnType.displayName);
+ }
+ name2 = builder.toString();
+ }
+ return name2;
+ }
Map<String, Type2> get namedParameterTypes => _namedParameterTypes;
List<Type2> get normalParameterTypes => _normalParameterTypes;
List<Type2> get optionalParameterTypes => _optionalParameterTypes;
+ List<ParameterElement> get parameters {
+ List<ParameterElement> baseParameters2 = baseParameters;
+ int parameterCount = baseParameters2.length;
+ if (parameterCount == 0) {
+ return baseParameters2;
+ }
+ List<ParameterElement> specializedParameters = new List<ParameterElement>(parameterCount);
+ for (int i = 0; i < parameterCount; i++) {
+ specializedParameters[i] = ParameterMember.from(baseParameters2[i], this);
+ }
+ return specializedParameters;
+ }
Type2 get returnType => _returnType;
List<Type2> get typeArguments => _typeArguments;
+ List<TypeVariableElement> get typeVariables {
+ Element element2 = element;
+ if (element2 is FunctionTypeAliasElement) {
+ return ((element2 as FunctionTypeAliasElement)).typeVariables;
+ }
+ return TypeVariableElementImpl.EMPTY_ARRAY;
+ }
int get hashCode {
Element element2 = element;
if (element2 == null) {
@@ -4644,7 +5482,7 @@
bool isSubtypeOf(Type2 type) {
if (type == null) {
return false;
- } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunction()) {
+ } else if (identical(this, type) || type.isDynamic() || type.isDartCoreFunction() || type.isObject()) {
return true;
} else if (type is! FunctionType) {
return false;
@@ -4703,6 +5541,7 @@
}
return s.returnType == VoidTypeImpl.instance || t.returnType.isAssignableTo(s.returnType);
}
+
/**
* Set the mapping of the names of named parameters to the types of the named parameters of this
* type of function to the given mapping.
@@ -4712,6 +5551,7 @@
void set namedParameterTypes(LinkedHashMap<String, Type2> namedParameterTypes2) {
this._namedParameterTypes = namedParameterTypes2;
}
+
/**
* Set the types of the normal parameters of this type of function to the types in the given
* array.
@@ -4720,6 +5560,7 @@
void set normalParameterTypes(List<Type2> normalParameterTypes2) {
this._normalParameterTypes = normalParameterTypes2;
}
+
/**
* Set the types of the optional parameters of this type of function to the types in the given
* array.
@@ -4728,6 +5569,7 @@
void set optionalParameterTypes(List<Type2> optionalParameterTypes2) {
this._optionalParameterTypes = optionalParameterTypes2;
}
+
/**
* Set the type of object returned by this type of function to the given type.
* @param returnType the type of object returned by this type of function
@@ -4735,6 +5577,7 @@
void set returnType(Type2 returnType2) {
this._returnType = returnType2;
}
+
/**
* Set the actual types of the type arguments to the given types.
* @param typeArguments the actual types of the type arguments
@@ -4756,6 +5599,7 @@
newType.normalParameterTypes = TypeImpl.substitute(_normalParameterTypes, argumentTypes, parameterTypes);
newType.optionalParameterTypes = TypeImpl.substitute(_optionalParameterTypes, argumentTypes, parameterTypes);
newType._namedParameterTypes = substitute3(_namedParameterTypes, argumentTypes, parameterTypes);
+ newType.typeArguments = argumentTypes;
return newType;
}
void appendTo(JavaStringBuilder builder) {
@@ -4814,7 +5658,20 @@
((_returnType as TypeImpl)).appendTo(builder);
}
}
+
+ /**
+ * @return the base parameter elements of this function element, not {@code null}.
+ */
+ List<ParameterElement> get baseParameters {
+ Element element2 = element;
+ if (element2 is ExecutableElement) {
+ return ((element2 as ExecutableElement)).parameters;
+ } else {
+ return ((element2 as FunctionTypeAliasElement)).parameters;
+ }
+ }
}
+
/**
* Instances of the class {@code InterfaceTypeImpl} defines the behavior common to objects
* representing the type introduced by either a class or an interface, or a reference to such a
@@ -4822,58 +5679,68 @@
* @coverage dart.engine.type
*/
class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
+
/**
* An empty array of types.
*/
static List<InterfaceType> EMPTY_ARRAY = new List<InterfaceType>(0);
+
/**
* This method computes the longest inheritance path from some passed {@link Type} to Object.
* @param type the {@link Type} to compute the longest inheritance path of from the passed{@link Type} to Object
* @return the computed longest inheritance path to Object
- * @see #computeLongestInheritancePathToObject(Type,int)
* @see InterfaceType#getLeastUpperBound(Type)
*/
- static int computeLongestInheritancePathToObject(InterfaceType type) => computeLongestInheritancePathToObject2(type, 0);
+ static int computeLongestInheritancePathToObject(InterfaceType type) => computeLongestInheritancePathToObject2(type, 0, new Set<ClassElement>());
+
/**
* Returns the set of all superinterfaces of the passed {@link Type}.
* @param type the {@link Type} to compute the set of superinterfaces of
* @return the {@link Set} of superinterfaces of the passed {@link Type}
- * @see #computeSuperinterfaceSet(Type,HashSet)
* @see #getLeastUpperBound(Type)
*/
static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => computeSuperinterfaceSet2(type, new Set<InterfaceType>());
+ List<TypeVariableElement> get typeVariables => element.typeVariables;
+
/**
* This method computes the longest inheritance path from some passed {@link Type} to Object. This
* method calls itself recursively, callers should use the public method{@link #computeLongestInheritancePathToObject(Type)}.
* @param type the {@link Type} to compute the longest inheritance path of from the passed{@link Type} to Object
* @param depth a field used recursively
+ * @param visitedClasses the classes that have already been visited
* @return the computed longest inheritance path to Object
* @see #computeLongestInheritancePathToObject(Type)
* @see #getLeastUpperBound(Type)
*/
- static int computeLongestInheritancePathToObject2(InterfaceType type, int depth) {
+ static int computeLongestInheritancePathToObject2(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
ClassElement classElement = type.element;
- if (classElement.supertype == null) {
+ if (classElement.supertype == null || visitedClasses.contains(classElement)) {
return depth;
}
- List<InterfaceType> superinterfaces = classElement.interfaces;
int longestPath = 1;
- int pathLength;
- if (superinterfaces.length > 0) {
- for (InterfaceType superinterface in superinterfaces) {
- pathLength = computeLongestInheritancePathToObject2(superinterface, depth + 1);
- if (pathLength > longestPath) {
- longestPath = pathLength;
+ try {
+ javaSetAdd(visitedClasses, classElement);
+ List<InterfaceType> superinterfaces = classElement.interfaces;
+ int pathLength;
+ if (superinterfaces.length > 0) {
+ for (InterfaceType superinterface in superinterfaces) {
+ pathLength = computeLongestInheritancePathToObject2(superinterface, depth + 1, visitedClasses);
+ if (pathLength > longestPath) {
+ longestPath = pathLength;
+ }
}
}
+ InterfaceType supertype2 = classElement.supertype;
+ pathLength = computeLongestInheritancePathToObject2(supertype2, depth + 1, visitedClasses);
+ if (pathLength > longestPath) {
+ longestPath = pathLength;
+ }
+ } finally {
+ visitedClasses.remove(classElement);
}
- InterfaceType supertype2 = classElement.supertype;
- pathLength = computeLongestInheritancePathToObject2(supertype2, depth + 1);
- if (pathLength > longestPath) {
- longestPath = pathLength;
- }
return longestPath;
}
+
/**
* Returns the set of all superinterfaces of the passed {@link Type}. This is a recursive method,
* callers should call the public {@link #computeSuperinterfaceSet(Type)}.
@@ -4889,17 +5756,20 @@
ClassElement classElement = element2 as ClassElement;
List<InterfaceType> superinterfaces = classElement.interfaces;
for (InterfaceType superinterface in superinterfaces) {
- javaSetAdd(set, superinterface);
- computeSuperinterfaceSet2(superinterface, set);
+ if (javaSetAdd(set, superinterface)) {
+ computeSuperinterfaceSet2(superinterface, set);
+ }
}
InterfaceType supertype2 = classElement.supertype;
if (supertype2 != null) {
- javaSetAdd(set, supertype2);
- computeSuperinterfaceSet2(supertype2, set);
+ if (javaSetAdd(set, supertype2)) {
+ computeSuperinterfaceSet2(supertype2, set);
+ }
}
}
return set;
}
+
/**
* Return the intersection of the given sets of types, where intersection is based on the equality
* of the elements of the types rather than on the equality of the types themselves. In cases
@@ -4924,10 +5794,12 @@
}
return new List.from(result);
}
+
/**
* Return the "least upper bound" of the given types under the assumption that the types have the
* same element and differ only in terms of the type arguments. The resulting type is composed by
- * using the least upper bound of the corresponding type arguments.
+ * comparing the corresponding type arguments, keeping those that are the same, and using
+ * 'dynamic' for those that are different.
* @param firstType the first type
* @param secondType the second type
* @return the "least upper bound" of the given types
@@ -4944,7 +5816,9 @@
}
List<Type2> lubArguments = new List<Type2>(argumentCount);
for (int i = 0; i < argumentCount; i++) {
- lubArguments[i] = firstArguments[i].getLeastUpperBound(secondArguments[i]);
+ if (firstArguments[i] == secondArguments[i]) {
+ lubArguments[i] = firstArguments[i];
+ }
if (lubArguments[i] == null) {
lubArguments[i] = DynamicTypeImpl.instance;
}
@@ -4953,28 +5827,31 @@
lub.typeArguments = lubArguments;
return lub;
}
+
/**
* An array containing the actual types of the type arguments.
*/
List<Type2> _typeArguments = TypeImpl.EMPTY_ARRAY;
+
/**
* Initialize a newly created type to be declared by the given element.
* @param element the element representing the declaration of the type
*/
- InterfaceTypeImpl.con1(ClassElement element) : super(element, element.name) {
- _jtd_constructor_293_impl(element);
+ InterfaceTypeImpl.con1(ClassElement element) : super(element, element.displayName) {
+ _jtd_constructor_300_impl(element);
}
- _jtd_constructor_293_impl(ClassElement element) {
+ _jtd_constructor_300_impl(ClassElement element) {
}
+
/**
* Initialize a newly created type to have the given name. This constructor should only be used in
* cases where there is no declaration of the type.
* @param name the name of the type
*/
InterfaceTypeImpl.con2(String name) : super(null, name) {
- _jtd_constructor_294_impl(name);
+ _jtd_constructor_301_impl(name);
}
- _jtd_constructor_294_impl(String name) {
+ _jtd_constructor_301_impl(String name) {
}
bool operator ==(Object object) {
if (object is! InterfaceTypeImpl) {
@@ -5105,33 +5982,9 @@
} else if (type is! InterfaceType) {
return false;
}
- InterfaceType s = type as InterfaceType;
- if (this == s) {
- return true;
- }
- if (s.isDirectSupertypeOf(this)) {
- return true;
- }
- ClassElement tElement = element;
- ClassElement sElement = s.element;
- if (tElement == sElement) {
- List<Type2> tArguments = typeArguments;
- List<Type2> sArguments = s.typeArguments;
- if (tArguments.length != sArguments.length) {
- return false;
- }
- for (int i = 0; i < tArguments.length; i++) {
- if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
- return false;
- }
- }
- return true;
- }
- if (element.supertype == null) {
- return false;
- }
- return element.supertype.isMoreSpecificThan(type);
+ return isMoreSpecificThan2((type as InterfaceType), new Set<ClassElement>());
}
+ bool isObject() => element.supertype == null;
bool isSubtypeOf(Type2 type) {
if (identical(type, DynamicTypeImpl.instance)) {
return true;
@@ -5142,60 +5995,40 @@
} else if (this == type) {
return true;
}
- InterfaceType typeT = this;
- InterfaceType typeS = type as InterfaceType;
- ClassElement elementT = element;
- if (elementT == null) {
- return false;
+ return isSubtypeOf2((type as InterfaceType), new Set<ClassElement>());
+ }
+ ConstructorElement lookUpConstructor(String constructorName, LibraryElement library) {
+ ConstructorElement constructorElement;
+ if (constructorName == null) {
+ constructorElement = element.unnamedConstructor;
+ } else {
+ constructorElement = element.getNamedConstructor(constructorName);
}
- typeT = substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(elementT.typeVariables));
- if (typeT == typeS) {
- return true;
- } else if (elementT == typeS.element) {
- List<Type2> typeTArgs = typeT.typeArguments;
- List<Type2> typeSArgs = typeS.typeArguments;
- if (typeTArgs.length != typeSArgs.length) {
- return false;
- }
- for (int i = 0; i < typeTArgs.length; i++) {
- if (!typeTArgs[i].isSubtypeOf(typeSArgs[i])) {
- return false;
- }
- }
- return true;
+ if (constructorElement == null || !constructorElement.isAccessibleIn(library)) {
+ return null;
}
- Type2 supertype2 = elementT.supertype;
- if (supertype2 == null) {
- return false;
- }
- List<Type2> interfaceTypes = elementT.interfaces;
- for (Type2 interfaceType in interfaceTypes) {
- if (interfaceType.isSubtypeOf(typeS)) {
- return true;
- }
- }
- List<Type2> mixinTypes = elementT.mixins;
- for (Type2 mixinType in mixinTypes) {
- if (mixinType == typeS) {
- return true;
- }
- }
- return supertype2.isSubtypeOf(typeS);
+ return ConstructorMember.from(constructorElement, this);
}
PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
PropertyAccessorElement element = getGetter(getterName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
+ return lookUpGetterInSuperclass(getterName, library);
+ }
+ PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library) {
for (InterfaceType mixin in mixins) {
- element = mixin.getGetter(getterName);
+ PropertyAccessorElement element = mixin.getGetter(getterName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
}
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
InterfaceType supertype = superclass;
- while (supertype != null) {
- element = supertype.getGetter(getterName);
+ ClassElement supertypeElement = supertype == null ? null : supertype.element;
+ while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+ javaSetAdd(visitedClasses, supertypeElement);
+ PropertyAccessorElement element = supertype.getGetter(getterName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
@@ -5206,6 +6039,7 @@
}
}
supertype = supertype.superclass;
+ supertypeElement = supertype == null ? null : supertype.element;
}
return null;
}
@@ -5214,15 +6048,21 @@
if (element != null && element.isAccessibleIn(library)) {
return element;
}
+ return lookUpMethodInSuperclass(methodName, library);
+ }
+ MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library) {
for (InterfaceType mixin in mixins) {
- element = mixin.getMethod(methodName);
+ MethodElement element = mixin.getMethod(methodName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
}
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
InterfaceType supertype = superclass;
- while (supertype != null) {
- element = supertype.getMethod(methodName);
+ ClassElement supertypeElement = supertype == null ? null : supertype.element;
+ while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+ javaSetAdd(visitedClasses, supertypeElement);
+ MethodElement element = supertype.getMethod(methodName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
@@ -5233,6 +6073,7 @@
}
}
supertype = supertype.superclass;
+ supertypeElement = supertype == null ? null : supertype.element;
}
return null;
}
@@ -5241,15 +6082,21 @@
if (element != null && element.isAccessibleIn(library)) {
return element;
}
+ return lookUpSetterInSuperclass(setterName, library);
+ }
+ PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library) {
for (InterfaceType mixin in mixins) {
- element = mixin.getSetter(setterName);
+ PropertyAccessorElement element = mixin.getSetter(setterName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
}
+ Set<ClassElement> visitedClasses = new Set<ClassElement>();
InterfaceType supertype = superclass;
- while (supertype != null) {
- element = supertype.getSetter(setterName);
+ ClassElement supertypeElement = supertype == null ? null : supertype.element;
+ while (supertype != null && !visitedClasses.contains(supertypeElement)) {
+ javaSetAdd(visitedClasses, supertypeElement);
+ PropertyAccessorElement element = supertype.getSetter(setterName);
if (element != null && element.isAccessibleIn(library)) {
return element;
}
@@ -5260,9 +6107,11 @@
}
}
supertype = supertype.superclass;
+ supertypeElement = supertype == null ? null : supertype.element;
}
return null;
}
+
/**
* Set the actual types of the type arguments to those in the given array.
* @param typeArguments the actual types of the type arguments
@@ -5296,13 +6145,100 @@
builder.append(">");
}
}
+ bool isMoreSpecificThan2(InterfaceType s, Set<ClassElement> visitedClasses) {
+ if (this == s) {
+ return true;
+ }
+ if (s.isDirectSupertypeOf(this)) {
+ return true;
+ }
+ ClassElement tElement = element;
+ ClassElement sElement = s.element;
+ if (tElement == sElement) {
+ List<Type2> tArguments = typeArguments;
+ List<Type2> sArguments = s.typeArguments;
+ if (tArguments.length != sArguments.length) {
+ return false;
+ }
+ for (int i = 0; i < tArguments.length; i++) {
+ if (!tArguments[i].isMoreSpecificThan(sArguments[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ ClassElement element2 = element;
+ if (element2 == null || visitedClasses.contains(element2)) {
+ return false;
+ }
+ javaSetAdd(visitedClasses, element2);
+ InterfaceType supertype2 = element2.supertype;
+ if (supertype2 != null && ((supertype2 as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+ return true;
+ }
+ for (InterfaceType interfaceType in element2.interfaces) {
+ if (((interfaceType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+ return true;
+ }
+ }
+ for (InterfaceType mixinType in element2.mixins) {
+ if (((mixinType as InterfaceTypeImpl)).isMoreSpecificThan2(s, visitedClasses)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ bool isSubtypeOf2(InterfaceType type, Set<ClassElement> visitedClasses) {
+ InterfaceType typeT = this;
+ InterfaceType typeS = type;
+ ClassElement elementT = element;
+ if (elementT == null || visitedClasses.contains(elementT)) {
+ return false;
+ }
+ javaSetAdd(visitedClasses, elementT);
+ typeT = substitute2(_typeArguments, TypeVariableTypeImpl.getTypes(elementT.typeVariables));
+ if (typeT == typeS) {
+ return true;
+ } else if (elementT == typeS.element) {
+ List<Type2> typeTArgs = typeT.typeArguments;
+ List<Type2> typeSArgs = typeS.typeArguments;
+ if (typeTArgs.length != typeSArgs.length) {
+ return false;
+ }
+ for (int i = 0; i < typeTArgs.length; i++) {
+ if (!typeTArgs[i].isSubtypeOf(typeSArgs[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ InterfaceType supertype2 = elementT.supertype;
+ if (supertype2 != null && ((supertype2 as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+ return true;
+ }
+ List<InterfaceType> interfaceTypes = elementT.interfaces;
+ for (InterfaceType interfaceType in interfaceTypes) {
+ if (((interfaceType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+ return true;
+ }
+ }
+ List<InterfaceType> mixinTypes = elementT.mixins;
+ for (InterfaceType mixinType in mixinTypes) {
+ if (((mixinType as InterfaceTypeImpl)).isSubtypeOf2(typeS, visitedClasses)) {
+ return true;
+ }
+ }
+ return false;
+ }
}
+
/**
* The abstract class {@code TypeImpl} implements the behavior common to objects representing the
* declared type of elements in the element model.
* @coverage dart.engine.type
*/
abstract class TypeImpl implements Type2 {
+
/**
* Return an array containing the results of using the given argument types and parameter types to
* perform a substitution on all of the given types.
@@ -5322,19 +6258,23 @@
}
return newTypes;
}
+
/**
* The element representing the declaration of this type, or {@code null} if the type has not, or
* cannot, be associated with an element.
*/
Element _element;
+
/**
* The name of this type, or {@code null} if the type does not have a name.
*/
String _name;
+
/**
* An empty array of types.
*/
static List<Type2> EMPTY_ARRAY = new List<Type2>(0);
+
/**
* Initialize a newly created type to be declared by the given element and to have the given name.
* @param element the element representing the declaration of the type
@@ -5344,6 +6284,7 @@
this._element = element;
this._name = name;
}
+ String get displayName => name;
Element get element => _element;
Type2 getLeastUpperBound(Type2 type) => null;
String get name => _name;
@@ -5351,6 +6292,7 @@
bool isDartCoreFunction() => false;
bool isDynamic() => false;
bool isMoreSpecificThan(Type2 type) => false;
+ bool isObject() => false;
bool isSupertypeOf(Type2 type) => type.isSubtypeOf(this);
bool isVoid() => false;
String toString() {
@@ -5358,6 +6300,7 @@
appendTo(builder);
return builder.toString();
}
+
/**
* Append a textual representation of this type to the given builder.
* @param builder the builder to which the text is to be appended
@@ -5370,12 +6313,14 @@
}
}
}
+
/**
* Instances of the class {@code TypeVariableTypeImpl} defines the behavior of objects representing
* the type introduced by a type variable.
* @coverage dart.engine.type
*/
class TypeVariableTypeImpl extends TypeImpl implements TypeVariableType {
+
/**
* Return an array containing the type variable types defined by the given array of type variable
* elements.
@@ -5390,6 +6335,7 @@
}
return types;
}
+
/**
* Initialize a newly created type variable to be declared by the given element and to have the
* given name.
@@ -5415,20 +6361,24 @@
return this;
}
}
+
/**
* The unique instance of the class {@code VoidTypeImpl} implements the type {@code void}.
* @coverage dart.engine.type
*/
class VoidTypeImpl extends TypeImpl implements VoidType {
+
/**
* The unique instance of this class.
*/
static VoidTypeImpl _INSTANCE = new VoidTypeImpl();
+
/**
* Return the unique instance of this class.
* @return the unique instance of this class
*/
static VoidTypeImpl get instance => _INSTANCE;
+
/**
* Prevent the creation of instances of this class.
*/
@@ -5439,6 +6389,7 @@
bool isVoid() => true;
VoidTypeImpl substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes) => this;
}
+
/**
* The interface {@code FunctionType} defines the behavior common to objects representing the type
* of a function, method, constructor, getter, or setter. Function types come in three variations:
@@ -5448,13 +6399,13 @@
* <li>The types of functions with optional positional parameters. These have the general form
* <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, \[T<sub>n+1</sub>, &hellip;, T<sub>n+k</sub>\]) &rarr;
* T</i>.</li>
- * <li>The types of functions with named positional parameters. These have the general form
- * <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk})
- * &rarr; T</i>.</li>
+ * <li>The types of functions with named parameters. These have the general form <i>(T<sub>1</sub>,
+ * &hellip;, T<sub>n</sub>, {T<sub>x1</sub> x1, &hellip;, T<sub>xk</sub> xk}) &rarr; T</i>.</li>
* </ol>
* @coverage dart.engine.type
*/
-abstract class FunctionType implements Type2 {
+abstract class FunctionType implements ParameterizedType {
+
/**
* Return a map from the names of named parameters to the types of the named parameters of this
* type of function. The entries in the map will be iterated in the same order as the order in
@@ -5463,12 +6414,14 @@
* @return a map from the name to the types of the named parameters of this type of function
*/
Map<String, Type2> get namedParameterTypes;
+
/**
* Return an array containing the types of the normal parameters of this type of function. The
* parameter types are in the same order as they appear in the declaration of the function.
* @return the types of the normal parameters of this type of function
*/
List<Type2> get normalParameterTypes;
+
/**
* Return a map from the names of optional (positional) parameters to the types of the optional
* parameters of this type of function. The entries in the map will be iterated in the same order
@@ -5477,21 +6430,21 @@
* @return a map from the name to the types of the optional parameters of this type of function
*/
List<Type2> get optionalParameterTypes;
+
/**
+ * Return an array containing the parameters elements of this type of function. The parameter
+ * types are in the same order as they appear in the declaration of the function.
+ * @return the parameters elements of this type of function
+ */
+ List<ParameterElement> get parameters;
+
+ /**
* Return the type of object returned by this type of function.
* @return the type of object returned by this type of function
*/
Type2 get returnType;
+
/**
- * Return an array containing the actual types of the type arguments. If this type's element does
- * not have type parameters, then the array should be empty (although it is possible for type
- * arguments to be erroneously declared). If the element has type parameters and the actual type
- * does not explicitly include argument values, then the type "dynamic" will be automatically
- * provided.
- * @return the actual types of the type arguments
- */
- List<Type2> get typeArguments;
- /**
* Return {@code true} if this type is a subtype of the given type.
* <p>
* A function type <i>(T<sub>1</sub>, &hellip;, T<sub>n</sub>) &rarr; T</i> is a subtype of the
@@ -5555,6 +6508,7 @@
* @return {@code true} if this type is a subtype of the given type
*/
bool isSubtypeOf(Type2 type);
+
/**
* Return the type resulting from substituting the given arguments for this type's parameters.
* This is fully equivalent to {@code substitute(argumentTypes, getTypeArguments())}.
@@ -5564,13 +6518,15 @@
FunctionType substitute4(List<Type2> argumentTypes);
FunctionType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
}
+
/**
* The interface {@code InterfaceType} defines the behavior common to objects representing the type
* introduced by either a class or an interface, or a reference to such a type.
* @coverage dart.engine.type
*/
-abstract class InterfaceType implements Type2 {
+abstract class InterfaceType implements ParameterizedType {
ClassElement get element;
+
/**
* Return the element representing the getter with the given name that is declared in this class,
* or {@code null} if this class does not declare a getter with the given name.
@@ -5578,6 +6534,7 @@
* @return the getter declared in this class with the given name
*/
PropertyAccessorElement getGetter(String getterName);
+
/**
* Return an array containing all of the interfaces that are implemented by this interface. Note
* that this is <b>not</b>, in general, equivalent to getting the interfaces from this type's
@@ -5585,6 +6542,7 @@
* @return the interfaces that are implemented by this type
*/
List<InterfaceType> get interfaces;
+
/**
* Return the least upper bound of this type and the given type, or {@code null} if there is no
* least upper bound.
@@ -5601,6 +6559,7 @@
* @return the least upper bound of this type and the given type
*/
Type2 getLeastUpperBound(Type2 type);
+
/**
* Return the element representing the method with the given name that is declared in this class,
* or {@code null} if this class does not declare a method with the given name.
@@ -5608,6 +6567,7 @@
* @return the method declared in this class with the given name
*/
MethodElement getMethod(String methodName);
+
/**
* Return an array containing all of the mixins that are applied to the class being extended in
* order to derive the superclass of this class. Note that this is <b>not</b>, in general,
@@ -5616,6 +6576,7 @@
* @return the mixins that are applied to derive the superclass of this class
*/
List<InterfaceType> get mixins;
+
/**
* Return the element representing the setter with the given name that is declared in this class,
* or {@code null} if this class does not declare a setter with the given name.
@@ -5623,6 +6584,7 @@
* @return the setter declared in this class with the given name
*/
PropertyAccessorElement getSetter(String setterName);
+
/**
* Return the type representing the superclass of this type, or null if this type represents the
* class 'Object'. Note that this is <b>not</b>, in general, equivalent to getting the superclass
@@ -5631,16 +6593,8 @@
* @return the superclass of this type
*/
InterfaceType get superclass;
+
/**
- * Return an array containing the actual types of the type arguments. If this type's element does
- * not have type parameters, then the array should be empty (although it is possible for type
- * arguments to be erroneously declared). If the element has type parameters and the actual type
- * does not explicitly include argument values, then the type "dynamic" will be automatically
- * provided.
- * @return the actual types of the type arguments
- */
- List<Type2> get typeArguments;
- /**
* Return {@code true} if this type is a direct supertype of the given type. The implicit
* interface of class <i>I</i> is a direct supertype of the implicit interface of class <i>J</i>
* iff:
@@ -5655,6 +6609,7 @@
* @return {@code true} if this type is a direct supertype of the given type
*/
bool isDirectSupertypeOf(InterfaceType type);
+
/**
* Return {@code true} if this type is more specific than the given type. An interface type
* <i>T</i> is more specific than an interface type <i>S</i>, written <i>T &laquo; S</i>, if one
@@ -5674,6 +6629,7 @@
* @return {@code true} if this type is more specific than the given type
*/
bool isMoreSpecificThan(Type2 type);
+
/**
* Return {@code true} if this type is a subtype of the given type. An interface type <i>T</i> is
* a subtype of an interface type <i>S</i>, written <i>T</i> <: <i>S</i>, iff
@@ -5684,7 +6640,22 @@
* @return {@code true} if this type is a subtype of the given type
*/
bool isSubtypeOf(Type2 type);
+
/**
+ * Return the element representing the constructor that results from looking up the given
+ * constructor in this class with respect to the given library, or {@code null} if the look up
+ * fails. The behavior of this method is defined by the Dart Language Specification in section
+ * 12.11.1: <blockquote>If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be
+ * the constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>. Otherwise, if
+ * <i>q</i> is not defined or not accessible, a NoSuchMethodException is thrown. </blockquote>
+ * @param constructorName the name of the constructor being looked up
+ * @param library the library with respect to which the lookup is being performed
+ * @return the result of looking up the given constructor in this class with respect to the given
+ * library
+ */
+ ConstructorElement lookUpConstructor(String constructorName, LibraryElement library);
+
+ /**
* Return the element representing the getter that results from looking up the given getter in
* this class with respect to the given library, or {@code null} if the look up fails. The
* behavior of this method is defined by the Dart Language Specification in section 12.15.1:
@@ -5704,7 +6675,29 @@
* library
*/
PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library);
+
/**
+ * Return the element representing the getter that results from looking up the given getter in the
+ * superclass of this class with respect to the given library, or {@code null} if the look up
+ * fails. The behavior of this method is defined by the Dart Language Specification in section
+ * 12.15.1: <blockquote>The result of looking up getter (respectively setter) <i>m</i> in class
+ * <i>C</i> with respect to library <i>L</i> is:
+ * <ul>
+ * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+ * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+ * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+ * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+ * Otherwise, we say that the lookup has failed.</li>
+ * </ul>
+ * </blockquote>
+ * @param getterName the name of the getter being looked up
+ * @param library the library with respect to which the lookup is being performed
+ * @return the result of looking up the given getter in this class with respect to the given
+ * library
+ */
+ PropertyAccessorElement lookUpGetterInSuperclass(String getterName, LibraryElement library);
+
+ /**
* Return the element representing the method that results from looking up the given method in
* this class with respect to the given library, or {@code null} if the look up fails. The
* behavior of this method is defined by the Dart Language Specification in section 12.15.1:
@@ -5723,7 +6716,28 @@
* library
*/
MethodElement lookUpMethod(String methodName, LibraryElement library);
+
/**
+ * Return the element representing the method that results from looking up the given method in the
+ * superclass of this class with respect to the given library, or {@code null} if the look up
+ * fails. The behavior of this method is defined by the Dart Language Specification in section
+ * 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with respect
+ * to library <i>L</i> is:
+ * <ul>
+ * <li>If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+ * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+ * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+ * to <i>L</i>. Otherwise, we say that the lookup has failed.</li>
+ * </ul>
+ * </blockquote>
+ * @param methodName the name of the method being looked up
+ * @param library the library with respect to which the lookup is being performed
+ * @return the result of looking up the given method in this class with respect to the given
+ * library
+ */
+ MethodElement lookUpMethodInSuperclass(String methodName, LibraryElement library);
+
+ /**
* Return the element representing the setter that results from looking up the given setter in
* this class with respect to the given library, or {@code null} if the look up fails. The
* behavior of this method is defined by the Dart Language Specification in section 12.16:
@@ -5743,7 +6757,29 @@
* library
*/
PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library);
+
/**
+ * Return the element representing the setter that results from looking up the given setter in the
+ * superclass of this class with respect to the given library, or {@code null} if the look up
+ * fails. The behavior of this method is defined by the Dart Language Specification in section
+ * 12.16: <blockquote> The result of looking up getter (respectively setter) <i>m</i> in class
+ * <i>C</i> with respect to library <i>L</i> is:
+ * <ul>
+ * <li>If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+ * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+ * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+ * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+ * Otherwise, we say that the lookup has failed.</li>
+ * </ul>
+ * </blockquote>
+ * @param setterName the name of the setter being looked up
+ * @param library the library with respect to which the lookup is being performed
+ * @return the result of looking up the given setter in this class with respect to the given
+ * library
+ */
+ PropertyAccessorElement lookUpSetterInSuperclass(String setterName, LibraryElement library);
+
+ /**
* Return the type resulting from substituting the given arguments for this type's parameters.
* This is fully equivalent to {@code substitute(argumentTypes, getTypeArguments())}.
* @param argumentTypes the actual type arguments being substituted for the type parameters
@@ -5752,19 +6788,53 @@
InterfaceType substitute5(List<Type2> argumentTypes);
InterfaceType substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
}
+
/**
+ * The interface {@code ParameterizedType} defines the behavior common to objects representing the
+ * type with type parameters, such as class and function type alias.
+ * @coverage dart.engine.type
+ */
+abstract class ParameterizedType implements Type2 {
+
+ /**
+ * Return an array containing the actual types of the type arguments. If this type's element does
+ * not have type parameters, then the array should be empty (although it is possible for type
+ * arguments to be erroneously declared). If the element has type parameters and the actual type
+ * does not explicitly include argument values, then the type "dynamic" will be automatically
+ * provided.
+ * @return the actual types of the type arguments
+ */
+ List<Type2> get typeArguments;
+
+ /**
+ * Return an array containing all of the type variables declared for this type.
+ * @return the type variables declared for this type
+ */
+ List<TypeVariableElement> get typeVariables;
+}
+
+/**
* The interface {@code Type} defines the behavior of objects representing the declared type of
* elements in the element model.
* @coverage dart.engine.type
*/
abstract class Type2 {
+
/**
+ * Return the name of this type as it should appear when presented to users in contexts such as
+ * error messages.
+ * @return the name of this type
+ */
+ String get displayName;
+
+ /**
* Return the element representing the declaration of this type, or {@code null} if the type has
* not, or cannot, be associated with an element. The former case will occur if the element model
* is not yet complete; the latter case will occur if this object represents an undefined type.
* @return the element representing the declaration of this type
*/
Element get element;
+
/**
* Return the least upper bound of this type and the given type, or {@code null} if there is no
* least upper bound.
@@ -5772,12 +6842,14 @@
* @return the least upper bound of this type and the given type
*/
Type2 getLeastUpperBound(Type2 type);
+
/**
* Return the name of this type, or {@code null} if the type does not have a name, such as when
* the type represents the type of an unnamed function.
* @return the name of this type
*/
String get name;
+
/**
* Return {@code true} if this type is assignable to the given type. A type <i>T</i> may be
* assigned to a type <i>S</i>, written <i>T</i> &hArr; <i>S</i>, iff either <i>T</i> <: <i>S</i>
@@ -5786,6 +6858,7 @@
* @return {@code true} if this type is assignable to the given type
*/
bool isAssignableTo(Type2 type);
+
/**
* Return {@code true} if this type represents the type 'Function' defined in the dart:core
* library.
@@ -5793,23 +6866,33 @@
* library
*/
bool isDartCoreFunction();
+
/**
* Return {@code true} if this type represents the type 'dynamic'.
* @return {@code true} if this type represents the type 'dynamic'
*/
bool isDynamic();
+
/**
* Return {@code true} if this type is more specific than the given type.
* @param type the type being compared with this type
* @return {@code true} if this type is more specific than the given type
*/
bool isMoreSpecificThan(Type2 type);
+
/**
+ * Return {@code true} if this type represents the type 'Object'.
+ * @return {@code true} if this type represents the type 'Object'
+ */
+ bool isObject();
+
+ /**
* Return {@code true} if this type is a subtype of the given type.
* @param type the type being compared with this type
* @return {@code true} if this type is a subtype of the given type
*/
bool isSubtypeOf(Type2 type);
+
/**
* Return {@code true} if this type is a supertype of the given type. A type <i>S</i> is a
* supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff <i>T</i> is a subtype of <i>S</i>.
@@ -5817,11 +6900,13 @@
* @return {@code true} if this type is a supertype of the given type
*/
bool isSupertypeOf(Type2 type);
+
/**
* Return {@code true} if this type represents the type 'void'.
* @return {@code true} if this type represents the type 'void'
*/
bool isVoid();
+
/**
* Return the type resulting from substituting the given arguments for the given parameters in
* this type. The specification defines this operation in section 2: <blockquote> The notation
@@ -5836,6 +6921,7 @@
*/
Type2 substitute2(List<Type2> argumentTypes, List<Type2> parameterTypes);
}
+
/**
* The interface {@code TypeVariableType} defines the behavior of objects representing the type
* introduced by a type variable.
@@ -5844,6 +6930,7 @@
abstract class TypeVariableType implements Type2 {
TypeVariableElement get element;
}
+
/**
* The interface {@code VoidType} defines the behavior of the unique object representing the type{@code void}.
* @coverage dart.engine.type
« no previous file with comments | « pkg/analyzer_experimental/lib/src/generated/constant.dart ('k') | pkg/analyzer_experimental/lib/src/generated/engine.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698