8515d74332
R=brianwilkerson@google.com Change-Id: I58cadf0e3239ad4ae8584d79485f4d9ebda10eba Reviewed-on: https://dart-review.googlesource.com/54064 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
2204 lines
69 KiB
Dart
2204 lines
69 KiB
Dart
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
/**
|
|
* Defines the element model. The element model describes the semantic (as
|
|
* opposed to syntactic) structure of Dart code. The syntactic structure of the
|
|
* code is modeled by the [AST structure](../ast/ast.dart).
|
|
*
|
|
* The element model consists of two closely related kinds of objects: elements
|
|
* (instances of a subclass of [Element]) and types. This library defines the
|
|
* elements, the types are defined in [type.dart](type.dart).
|
|
*
|
|
* Generally speaking, an element represents something that is declared in the
|
|
* code, such as a class, method, or variable. Elements are organized in a tree
|
|
* structure in which the children of an element are the elements that are
|
|
* logically (and often syntactically) part of the declaration of the parent.
|
|
* For example, the elements representing the methods and fields in a class are
|
|
* children of the element representing the class.
|
|
*
|
|
* Every complete element structure is rooted by an instance of the class
|
|
* [LibraryElement]. A library element represents a single Dart library. Every
|
|
* library is defined by one or more compilation units (the library and all of
|
|
* its parts). The compilation units are represented by the class
|
|
* [CompilationUnitElement] and are children of the library that is defined by
|
|
* them. Each compilation unit can contain zero or more top-level declarations,
|
|
* such as classes, functions, and variables. Each of these is in turn
|
|
* represented as an element that is a child of the compilation unit. Classes
|
|
* contain methods and fields, methods can contain local variables, etc.
|
|
*
|
|
* The element model does not contain everything in the code, only those things
|
|
* that are declared by the code. For example, it does not include any
|
|
* representation of the statements in a method body, but if one of those
|
|
* statements declares a local variable then the local variable will be
|
|
* represented by an element.
|
|
*/
|
|
import 'package:analyzer/dart/ast/ast.dart';
|
|
import 'package:analyzer/dart/constant/value.dart';
|
|
import 'package:analyzer/dart/element/type.dart';
|
|
import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
|
|
import 'package:analyzer/src/generated/java_engine.dart';
|
|
import 'package:analyzer/src/generated/resolver.dart';
|
|
import 'package:analyzer/src/generated/source.dart';
|
|
import 'package:analyzer/src/generated/utilities_dart.dart';
|
|
import 'package:analyzer/src/task/api/model.dart' show AnalysisTarget;
|
|
import 'package:analyzer/src/task/dart.dart';
|
|
|
|
/**
|
|
* An element that represents a class.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ClassElement
|
|
implements TypeDefiningElement, TypeParameterizedElement {
|
|
/**
|
|
* An empty list of class elements.
|
|
*/
|
|
static const List<ClassElement> EMPTY_LIST = const <ClassElement>[];
|
|
|
|
/**
|
|
* Return a list containing all of the accessors (getters and setters)
|
|
* declared in this class.
|
|
*/
|
|
List<PropertyAccessorElement> get accessors;
|
|
|
|
/**
|
|
* Return a list containing all the supertypes defined for this class and its
|
|
* supertypes. This includes superclasses, mixins and interfaces.
|
|
*/
|
|
List<InterfaceType> get allSupertypes;
|
|
|
|
/**
|
|
* Return a list containing all of the constructors declared in this class.
|
|
*/
|
|
List<ConstructorElement> get constructors;
|
|
|
|
/**
|
|
* Return a list containing all of the fields declared in this class.
|
|
*/
|
|
List<FieldElement> get fields;
|
|
|
|
/**
|
|
* Return `true` if this class or its superclass declares a non-final instance
|
|
* field.
|
|
*/
|
|
bool get hasNonFinalField;
|
|
|
|
/**
|
|
* Return `true` if this class has reference to super (so, for example, cannot
|
|
* be used as a mixin).
|
|
*/
|
|
bool get hasReferenceToSuper;
|
|
|
|
/**
|
|
* Return `true` if this class declares a static member.
|
|
*/
|
|
bool get hasStaticMember;
|
|
|
|
/**
|
|
* Return a list containing all of the interfaces that are implemented by this
|
|
* class.
|
|
*
|
|
* <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.
|
|
*/
|
|
List<InterfaceType> get interfaces;
|
|
|
|
/**
|
|
* Return `true` if this class is abstract. A class is abstract if it has an
|
|
* explicit `abstract` modifier. Note, that this definition of <i>abstract</i>
|
|
* is different from <i>has unimplemented members</i>.
|
|
*/
|
|
bool get isAbstract;
|
|
|
|
/**
|
|
* Return `true` if this class is defined by an enum declaration.
|
|
*/
|
|
bool get isEnum;
|
|
|
|
/**
|
|
* Return `true` if this class is a mixin application. A class is a mixin
|
|
* application if it was declared using the syntax "class A = B with C;".
|
|
*/
|
|
bool get isMixinApplication;
|
|
|
|
/**
|
|
* Return `true` if this class [isProxy], or if it inherits the proxy
|
|
* annotation from a supertype.
|
|
*/
|
|
bool get isOrInheritsProxy;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@proxy'.
|
|
*/
|
|
bool get isProxy;
|
|
|
|
/**
|
|
* Return `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:
|
|
* <blockquote>
|
|
* It is a compile-time error if a declared or derived mixin refers to super.
|
|
* It is a compile-time error if a declared or derived mixin explicitly
|
|
* declares a constructor. It is a compile-time error if a mixin is derived
|
|
* from a class whose superclass is not Object.
|
|
* </blockquote>
|
|
*/
|
|
bool get isValidMixin;
|
|
|
|
/**
|
|
* Return a list containing all of the methods declared in this class.
|
|
*/
|
|
List<MethodElement> get methods;
|
|
|
|
/**
|
|
* Return a list containing all of the mixins that are applied to the class
|
|
* being extended in order to derive the superclass of this class.
|
|
*
|
|
* <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.
|
|
*/
|
|
List<InterfaceType> get mixins;
|
|
|
|
/**
|
|
* Return the superclass of this class, or `null` if the class represents the
|
|
* class 'Object'. All other classes will have a non-`null` superclass. If the
|
|
* superclass was not explicitly declared then the implicit superclass
|
|
* 'Object' will be returned.
|
|
*
|
|
* <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.
|
|
*/
|
|
InterfaceType get supertype;
|
|
|
|
@override
|
|
InterfaceType get type;
|
|
|
|
/**
|
|
* Return the unnamed constructor declared in this class, or `null` if this
|
|
* class does not declare an unnamed constructor but does declare named
|
|
* constructors. The returned constructor will be synthetic if this class does
|
|
* not declare any constructors, in which case it will represent the default
|
|
* constructor for the class.
|
|
*/
|
|
ConstructorElement get unnamedConstructor;
|
|
|
|
@override
|
|
NamedCompilationUnitMember computeNode();
|
|
|
|
/**
|
|
* Return the field (synthetic or explicit) defined in this class that has the
|
|
* given [name], or `null` if this class does not define a field with the
|
|
* given name.
|
|
*/
|
|
FieldElement getField(String name);
|
|
|
|
/**
|
|
* Return the element representing the getter with the given [name] that is
|
|
* declared in this class, or `null` if this class does not declare a getter
|
|
* with the given name.
|
|
*/
|
|
PropertyAccessorElement getGetter(String name);
|
|
|
|
/**
|
|
* Return the element representing the method with the given [name] that is
|
|
* declared in this class, or `null` if this class does not declare a method
|
|
* with the given name.
|
|
*/
|
|
MethodElement getMethod(String name);
|
|
|
|
/**
|
|
* Return the named constructor declared in this class with the given [name],
|
|
* or `null` if this class does not declare a named constructor with the given
|
|
* name.
|
|
*/
|
|
ConstructorElement getNamedConstructor(String name);
|
|
|
|
/**
|
|
* Return the element representing the setter with the given [name] that is
|
|
* declared in this class, or `null` if this class does not declare a setter
|
|
* with the given name.
|
|
*/
|
|
PropertyAccessorElement getSetter(String name);
|
|
|
|
/**
|
|
* Determine whether the given [constructor], which exists in the superclass
|
|
* of this class, is accessible to constructors in this class.
|
|
*/
|
|
bool isSuperConstructorAccessible(ConstructorElement constructor);
|
|
|
|
/**
|
|
* Return the element representing the method that results from looking up the
|
|
* given [methodName] in this class with respect to the given [library],
|
|
* ignoring abstract methods, or `null` if the look up fails. The behavior of
|
|
* this method is defined by the Dart Language Specification in section
|
|
* 16.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: 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.
|
|
* </blockquote>
|
|
*/
|
|
MethodElement lookUpConcreteMethod(String methodName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the getter that results from looking up the
|
|
* given [getterName] in this class with respect to the given [library], or
|
|
* `null` if the look up fails. The behavior of this method is defined by the
|
|
* Dart Language Specification in section 16.15.2:
|
|
* <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: 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.
|
|
* </blockquote>
|
|
*/
|
|
PropertyAccessorElement lookUpGetter(
|
|
String getterName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the getter that results from looking up the
|
|
* given [getterName] in the superclass of this class with respect to the
|
|
* given [library], ignoring abstract getters, or `null` if the look up fails.
|
|
* The behavior of this method is defined by the Dart Language Specification
|
|
* in section 16.15.2:
|
|
* <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: 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.
|
|
* </blockquote>
|
|
*/
|
|
PropertyAccessorElement lookUpInheritedConcreteGetter(
|
|
String getterName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the method that results from looking up the
|
|
* given [methodName] in the superclass of this class with respect to the
|
|
* given [library], ignoring abstract methods, or `null` if the look up fails.
|
|
* The behavior of this method is defined by the Dart Language Specification
|
|
* in section 16.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: 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.
|
|
* </blockquote>
|
|
*/
|
|
MethodElement lookUpInheritedConcreteMethod(
|
|
String methodName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the setter that results from looking up the
|
|
* given [setterName] in the superclass of this class with respect to the
|
|
* given [library], ignoring abstract setters, or `null` if the look up fails.
|
|
* The behavior of this method is defined by the Dart Language Specification
|
|
* in section 16.15.2:
|
|
* <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: 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.
|
|
* </blockquote>
|
|
*/
|
|
PropertyAccessorElement lookUpInheritedConcreteSetter(
|
|
String setterName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the method that results from looking up the
|
|
* given [methodName] in the superclass of this class with respect to the
|
|
* given [library], or `null` if the look up fails. The behavior of this
|
|
* method is defined by the Dart Language Specification in section 16.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: 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.
|
|
* </blockquote>
|
|
*/
|
|
MethodElement lookUpInheritedMethod(
|
|
String methodName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the method that results from looking up the
|
|
* given [methodName] in this class with respect to the given [library], or
|
|
* `null` if the look up fails. The behavior of this method is defined by the
|
|
* Dart Language Specification in section 16.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: 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.
|
|
* </blockquote>
|
|
*/
|
|
MethodElement lookUpMethod(String methodName, LibraryElement library);
|
|
|
|
/**
|
|
* Return the element representing the setter that results from looking up the
|
|
* given [setterName] in this class with respect to the given [library], or
|
|
* `null` if the look up fails. The behavior of this method is defined by the
|
|
* Dart Language Specification in section 16.15.2:
|
|
* <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: 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.
|
|
* </blockquote>
|
|
*/
|
|
PropertyAccessorElement lookUpSetter(
|
|
String setterName, LibraryElement library);
|
|
}
|
|
|
|
/**
|
|
* An element that is contained within a [ClassElement].
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ClassMemberElement implements Element {
|
|
@override
|
|
ClassElement get enclosingElement;
|
|
|
|
/**
|
|
* Return `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.
|
|
*/
|
|
bool get isStatic;
|
|
}
|
|
|
|
/**
|
|
* An element representing a compilation unit.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class CompilationUnitElement implements Element, UriReferencedElement {
|
|
/**
|
|
* An empty list of compilation unit elements.
|
|
*/
|
|
static const List<CompilationUnitElement> EMPTY_LIST =
|
|
const <CompilationUnitElement>[];
|
|
|
|
/**
|
|
* Return a list containing all of the top-level accessors (getters and
|
|
* setters) contained in this compilation unit.
|
|
*/
|
|
List<PropertyAccessorElement> get accessors;
|
|
|
|
@override
|
|
LibraryElement get enclosingElement;
|
|
|
|
/**
|
|
* Return a list containing all of the enums contained in this compilation
|
|
* unit.
|
|
*/
|
|
List<ClassElement> get enums;
|
|
|
|
/**
|
|
* Return a list containing all of the top-level functions contained in this
|
|
* compilation unit.
|
|
*/
|
|
List<FunctionElement> get functions;
|
|
|
|
/**
|
|
* Return a list containing all of the function type aliases contained in this
|
|
* compilation unit.
|
|
*/
|
|
List<FunctionTypeAliasElement> get functionTypeAliases;
|
|
|
|
/**
|
|
* Return `true` if this compilation unit defines a top-level function named
|
|
* `loadLibrary`.
|
|
*/
|
|
bool get hasLoadLibraryFunction;
|
|
|
|
/**
|
|
* Return the [LineInfo] for the [source], or `null` if not computed yet.
|
|
*/
|
|
LineInfo get lineInfo;
|
|
|
|
/**
|
|
* Return a list containing all of the top-level variables contained in this
|
|
* compilation unit.
|
|
*/
|
|
List<TopLevelVariableElement> get topLevelVariables;
|
|
|
|
/**
|
|
* Return a list containing all of the classes contained in this compilation
|
|
* unit.
|
|
*/
|
|
List<ClassElement> get types;
|
|
|
|
@override
|
|
CompilationUnit computeNode();
|
|
|
|
/**
|
|
* Return the enum defined in this compilation unit that has the given [name],
|
|
* or `null` if this compilation unit does not define an enum with the given
|
|
* name.
|
|
*/
|
|
ClassElement getEnum(String name);
|
|
|
|
/**
|
|
* Return the class defined in this compilation unit that has the given
|
|
* [name], or `null` if this compilation unit does not define a class with the
|
|
* given name.
|
|
*/
|
|
ClassElement getType(String name);
|
|
}
|
|
|
|
/**
|
|
* An element representing a constructor or a factory method defined within a
|
|
* class.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ConstructorElement
|
|
implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
|
|
/**
|
|
* An empty list of constructor elements.
|
|
*/
|
|
static const List<ConstructorElement> EMPTY_LIST =
|
|
const <ConstructorElement>[];
|
|
|
|
/**
|
|
* Return `true` if this constructor is a const constructor.
|
|
*/
|
|
bool get isConst;
|
|
|
|
/**
|
|
* Return `true` if this constructor can be used as a default constructor -
|
|
* unnamed and has no required parameters.
|
|
*/
|
|
bool get isDefaultConstructor;
|
|
|
|
/**
|
|
* Return `true` if this constructor represents a factory constructor.
|
|
*/
|
|
bool get isFactory;
|
|
|
|
/**
|
|
* Return the offset of the character immediately following the last character
|
|
* of this constructor's name, or `null` if not named.
|
|
*/
|
|
int get nameEnd;
|
|
|
|
/**
|
|
* Return the offset of the `.` before this constructor name, or `null` if
|
|
* not named.
|
|
*/
|
|
int get periodOffset;
|
|
|
|
/**
|
|
* Return the constructor to which this constructor is redirecting, or `null`
|
|
* if this constructor does not redirect to another constructor or if the
|
|
* library containing this constructor has not yet been resolved.
|
|
*/
|
|
ConstructorElement get redirectedConstructor;
|
|
|
|
@override
|
|
ConstructorDeclaration computeNode();
|
|
}
|
|
|
|
/**
|
|
* The base class for all of the elements in the element model. Generally
|
|
* speaking, the element model is a semantic model of the program that
|
|
* represents things that are declared with a name and hence can be referenced
|
|
* elsewhere in the code.
|
|
*
|
|
* There are two exceptions to the general case. First, there are elements in
|
|
* the element model that are created for the convenience of various kinds of
|
|
* analysis but that do not have any corresponding declaration within the source
|
|
* code. Such elements are marked as being <i>synthetic</i>. Examples of
|
|
* synthetic elements include
|
|
* * default constructors in classes that do not define any explicit
|
|
* constructors,
|
|
* * getters and setters that are induced by explicit field declarations,
|
|
* * fields that are induced by explicit declarations of getters and setters,
|
|
* and
|
|
* * functions representing the initialization expression for a variable.
|
|
*
|
|
* Second, there are elements in the element model that do not have a name.
|
|
* These correspond to unnamed functions and exist in order to more accurately
|
|
* represent the semantic structure of the program.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class Element implements AnalysisTarget {
|
|
/**
|
|
* 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 final Comparator<Element> SORT_BY_OFFSET =
|
|
(Element firstElement, Element secondElement) =>
|
|
firstElement.nameOffset - secondElement.nameOffset;
|
|
|
|
/**
|
|
* Return the analysis context in which this element is defined.
|
|
*/
|
|
AnalysisContext get context;
|
|
|
|
/**
|
|
* Return the display name of this element, or `null` if this element does not
|
|
* have a name.
|
|
*
|
|
* 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 `set f(x)`
|
|
* is `f=`, instead of `f`.
|
|
*/
|
|
String get displayName;
|
|
|
|
/**
|
|
* Return the content of the documentation comment (including delimiters) for
|
|
* this element, or `null` if this element does not or cannot have
|
|
* documentation.
|
|
*/
|
|
String get documentationComment;
|
|
|
|
/**
|
|
* Return the element that either physically or logically encloses this
|
|
* element. This will be `null` if this element is a library because libraries
|
|
* are the top-level elements in the model.
|
|
*/
|
|
Element get enclosingElement;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form
|
|
* `@alwaysThrows`.
|
|
*/
|
|
bool get hasAlwaysThrows;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@deprecated`
|
|
* or `@Deprecated('..')`.
|
|
*/
|
|
bool get hasDeprecated;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@factory`.
|
|
*/
|
|
bool get hasFactory;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@isTest`.
|
|
*/
|
|
bool get hasIsTest;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@isTestGroup`.
|
|
*/
|
|
bool get hasIsTestGroup;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@JS(..)`.
|
|
*/
|
|
bool get hasJS;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@override`.
|
|
*/
|
|
bool get hasOverride;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form `@protected`.
|
|
*/
|
|
bool get hasProtected;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@required'.
|
|
*/
|
|
bool get hasRequired;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form
|
|
* `@visibleForTesting`.
|
|
*/
|
|
bool get hasVisibleForTesting;
|
|
|
|
/**
|
|
* The unique integer identifier of this element.
|
|
*/
|
|
int get id;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form
|
|
* '@alwaysThrows'.
|
|
*/
|
|
@deprecated
|
|
bool get isAlwaysThrows;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@deprecated'
|
|
* or '@Deprecated('..')'.
|
|
*/
|
|
@deprecated
|
|
bool get isDeprecated;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@factory'.
|
|
*/
|
|
@deprecated
|
|
bool get isFactory;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@JS(..)'.
|
|
*/
|
|
@deprecated
|
|
bool get isJS;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@override'.
|
|
*/
|
|
@deprecated
|
|
bool get isOverride;
|
|
|
|
/**
|
|
* Return `true` if this element is private. Private elements are visible only
|
|
* within the library in which they are declared.
|
|
*/
|
|
bool get isPrivate;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@protected'.
|
|
*/
|
|
@deprecated
|
|
bool get isProtected;
|
|
|
|
/**
|
|
* Return `true` if this element is public. Public elements are visible within
|
|
* any library that imports the library in which they are declared.
|
|
*/
|
|
bool get isPublic;
|
|
|
|
/**
|
|
* Return `true` if this element has an annotation of the form '@required'.
|
|
*/
|
|
@deprecated
|
|
bool get isRequired;
|
|
|
|
/**
|
|
* Return `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 default constructor for a class
|
|
* that does not explicitly define any constructors.
|
|
*/
|
|
bool get isSynthetic;
|
|
|
|
/// Return `true` if this element has an annotation of the form
|
|
/// '@visibleForTesting'.
|
|
@deprecated
|
|
bool get isVisibleForTesting;
|
|
|
|
/**
|
|
* Return the kind of element that this is.
|
|
*/
|
|
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 `null` if this element is
|
|
* an HTML file because HTML files are not contained in libraries.
|
|
*/
|
|
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.
|
|
*/
|
|
ElementLocation get location;
|
|
|
|
/**
|
|
* Return a list containing all of the metadata associated with this element.
|
|
* The array will be empty if the element does not have any metadata or if the
|
|
* library containing this element has not yet been resolved.
|
|
*/
|
|
List<ElementAnnotation> get metadata;
|
|
|
|
/**
|
|
* Return the name of this element, or `null` if this element does not have a
|
|
* name.
|
|
*/
|
|
String get name;
|
|
|
|
/**
|
|
* Return the length of the name of this element in the file that contains the
|
|
* declaration of this element, or `0` if this element does not have a name.
|
|
*/
|
|
int get nameLength;
|
|
|
|
/**
|
|
* Return the offset of the name of this element in the file that contains the
|
|
* declaration of this element, or `-1` if this element is synthetic, does not
|
|
* have a name, or otherwise does not have an offset.
|
|
*/
|
|
int get nameOffset;
|
|
|
|
@override
|
|
Source get source;
|
|
|
|
/**
|
|
* Return the resolved [CompilationUnit] that declares this element, or `null`
|
|
* if this element is synthetic.
|
|
*
|
|
* This method is expensive, because resolved AST might have been already
|
|
* evicted from cache, so parsing and resolving will be performed.
|
|
*/
|
|
CompilationUnit get unit;
|
|
|
|
/**
|
|
* Use the given [visitor] to visit this element. Return the value returned by
|
|
* the visitor as a result of visiting this element.
|
|
*/
|
|
T accept<T>(ElementVisitor<T> visitor);
|
|
|
|
/**
|
|
* Return the documentation comment for this element as it appears in the
|
|
* original source (complete with the beginning and ending delimiters), or
|
|
* `null` if this element does not have a documentation comment associated
|
|
* with it. This can be a long-running operation if the information needed to
|
|
* access the comment is not cached.
|
|
*
|
|
* Throws [AnalysisException] if the documentation comment could not be
|
|
* determined because the analysis could not be performed
|
|
*
|
|
* Deprecated. Use [documentationComment] instead.
|
|
*/
|
|
@deprecated
|
|
String computeDocumentationComment();
|
|
|
|
/**
|
|
* Return the resolved [AstNode] node that declares this element, or `null` if
|
|
* this element is synthetic or isn't contained in a compilation unit, such as
|
|
* a [LibraryElement].
|
|
*
|
|
* This method is expensive, because resolved AST might be evicted from cache,
|
|
* so parsing and resolving will be performed.
|
|
*
|
|
* <b>Note:</b> This method cannot be used in an async environment.
|
|
*/
|
|
AstNode computeNode();
|
|
|
|
/**
|
|
* Return the most immediate ancestor of this element for which the
|
|
* [predicate] returns `true`, or `null` if there is no such ancestor. Note
|
|
* that this element will never be returned.
|
|
*/
|
|
E getAncestor<E extends Element>(Predicate<Element> predicate);
|
|
|
|
/**
|
|
* Return a display name for the given element that includes the path to the
|
|
* compilation unit in which the type is defined. If [shortName] is `null`
|
|
* then [displayName] will be used as the name of this element. Otherwise
|
|
* the provided name will be used.
|
|
*/
|
|
// TODO(brianwilkerson) Make the parameter optional.
|
|
String getExtendedDisplayName(String shortName);
|
|
|
|
/**
|
|
* Return `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:
|
|
* <blockquote>
|
|
* A declaration <i>m</i> is accessible to library <i>L</i> if <i>m</i> is
|
|
* declared in <i>L</i> or if <i>m</i> is public.
|
|
* </blockquote>
|
|
*/
|
|
bool isAccessibleIn(LibraryElement library);
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
void visitChildren(ElementVisitor visitor);
|
|
}
|
|
|
|
/**
|
|
* A single annotation associated with an element.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ElementAnnotation implements ConstantEvaluationTarget {
|
|
/**
|
|
* An empty list of annotations.
|
|
*/
|
|
static const List<ElementAnnotation> EMPTY_LIST = const <ElementAnnotation>[];
|
|
|
|
/**
|
|
* Return a representation of the value of this annotation.
|
|
*
|
|
* Return `null` if the value of this annotation could not be computed because
|
|
* of errors.
|
|
*/
|
|
DartObject get constantValue;
|
|
|
|
/**
|
|
* Return the element representing the field, variable, or const constructor
|
|
* being used as an annotation.
|
|
*/
|
|
Element get element;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated function as always
|
|
* throwing.
|
|
*/
|
|
bool get isAlwaysThrows;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated element as being
|
|
* deprecated.
|
|
*/
|
|
bool get isDeprecated;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as a factory.
|
|
*/
|
|
bool get isFactory;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated class and its
|
|
* subclasses as being immutable.
|
|
*/
|
|
bool get isImmutable;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as running
|
|
* a single test.
|
|
*/
|
|
bool get isIsTest;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as running
|
|
* a test group.
|
|
*/
|
|
bool get isIsTestGroup;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated element with the `JS`
|
|
* annotation.
|
|
*/
|
|
bool get isJS;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as requiring
|
|
* overriding methods to call super.
|
|
*/
|
|
bool get isMustCallSuper;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated method as being
|
|
* expected to override an inherited method.
|
|
*/
|
|
bool get isOverride;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as being
|
|
* protected.
|
|
*/
|
|
bool get isProtected;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated class as implementing
|
|
* a proxy object.
|
|
*/
|
|
bool get isProxy;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as being
|
|
* required.
|
|
*/
|
|
bool get isRequired;
|
|
|
|
/**
|
|
* Return `true` if this annotation marks the associated member as being
|
|
* visible for testing.
|
|
*/
|
|
bool get isVisibleForTesting;
|
|
|
|
/**
|
|
* Return a representation of the value of this annotation, forcing the value
|
|
* to be computed if it had not previously been computed, or `null` if the
|
|
* value of this annotation could not be computed because of errors.
|
|
*/
|
|
DartObject computeConstantValue();
|
|
|
|
/**
|
|
* Return a textual description of this annotation in a form approximating
|
|
* valid source. The returned string will not be valid source primarily in the
|
|
* case where the annotation itself is not well-formed.
|
|
*/
|
|
String toSource();
|
|
}
|
|
|
|
/**
|
|
* The kind of elements in the element model.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
class ElementKind implements Comparable<ElementKind> {
|
|
static const ElementKind CLASS = const ElementKind('CLASS', 0, "class");
|
|
|
|
static const ElementKind COMPILATION_UNIT =
|
|
const ElementKind('COMPILATION_UNIT', 1, "compilation unit");
|
|
|
|
static const ElementKind CONSTRUCTOR =
|
|
const ElementKind('CONSTRUCTOR', 2, "constructor");
|
|
|
|
static const ElementKind DYNAMIC =
|
|
const ElementKind('DYNAMIC', 3, "<dynamic>");
|
|
|
|
static const ElementKind ERROR = const ElementKind('ERROR', 4, "<error>");
|
|
|
|
static const ElementKind EXPORT =
|
|
const ElementKind('EXPORT', 5, "export directive");
|
|
|
|
static const ElementKind FIELD = const ElementKind('FIELD', 6, "field");
|
|
|
|
static const ElementKind FUNCTION =
|
|
const ElementKind('FUNCTION', 7, "function");
|
|
|
|
static const ElementKind GENERIC_FUNCTION_TYPE =
|
|
const ElementKind('GENERIC_FUNCTION_TYPE', 8, 'generic function type');
|
|
|
|
static const ElementKind GETTER = const ElementKind('GETTER', 9, "getter");
|
|
|
|
static const ElementKind IMPORT =
|
|
const ElementKind('IMPORT', 10, "import directive");
|
|
|
|
static const ElementKind LABEL = const ElementKind('LABEL', 11, "label");
|
|
|
|
static const ElementKind LIBRARY =
|
|
const ElementKind('LIBRARY', 12, "library");
|
|
|
|
static const ElementKind LOCAL_VARIABLE =
|
|
const ElementKind('LOCAL_VARIABLE', 13, "local variable");
|
|
|
|
static const ElementKind METHOD = const ElementKind('METHOD', 14, "method");
|
|
|
|
static const ElementKind NAME = const ElementKind('NAME', 15, "<name>");
|
|
|
|
static const ElementKind PARAMETER =
|
|
const ElementKind('PARAMETER', 16, "parameter");
|
|
|
|
static const ElementKind PREFIX =
|
|
const ElementKind('PREFIX', 17, "import prefix");
|
|
|
|
static const ElementKind SETTER = const ElementKind('SETTER', 18, "setter");
|
|
|
|
static const ElementKind TOP_LEVEL_VARIABLE =
|
|
const ElementKind('TOP_LEVEL_VARIABLE', 19, "top level variable");
|
|
|
|
static const ElementKind FUNCTION_TYPE_ALIAS =
|
|
const ElementKind('FUNCTION_TYPE_ALIAS', 20, "function type alias");
|
|
|
|
static const ElementKind TYPE_PARAMETER =
|
|
const ElementKind('TYPE_PARAMETER', 21, "type parameter");
|
|
|
|
static const ElementKind UNIVERSE =
|
|
const ElementKind('UNIVERSE', 22, "<universe>");
|
|
|
|
static const List<ElementKind> values = const [
|
|
CLASS,
|
|
COMPILATION_UNIT,
|
|
CONSTRUCTOR,
|
|
DYNAMIC,
|
|
ERROR,
|
|
EXPORT,
|
|
FIELD,
|
|
FUNCTION,
|
|
GENERIC_FUNCTION_TYPE,
|
|
GETTER,
|
|
IMPORT,
|
|
LABEL,
|
|
LIBRARY,
|
|
LOCAL_VARIABLE,
|
|
METHOD,
|
|
NAME,
|
|
PARAMETER,
|
|
PREFIX,
|
|
SETTER,
|
|
TOP_LEVEL_VARIABLE,
|
|
FUNCTION_TYPE_ALIAS,
|
|
TYPE_PARAMETER,
|
|
UNIVERSE
|
|
];
|
|
|
|
/**
|
|
* The name of this element kind.
|
|
*/
|
|
final String name;
|
|
|
|
/**
|
|
* The ordinal value of the element kind.
|
|
*/
|
|
final int ordinal;
|
|
|
|
/**
|
|
* The name displayed in the UI for this kind of element.
|
|
*/
|
|
final String displayName;
|
|
|
|
/**
|
|
* Initialize a newly created element kind to have the given [displayName].
|
|
*/
|
|
const ElementKind(this.name, this.ordinal, this.displayName);
|
|
|
|
@override
|
|
int get hashCode => ordinal;
|
|
|
|
@override
|
|
int compareTo(ElementKind other) => ordinal - other.ordinal;
|
|
|
|
@override
|
|
String toString() => name;
|
|
|
|
/**
|
|
* Return the kind of the given [element], or [ERROR] if the element is
|
|
* `null`. This is a utility method that can reduce the need for null checks
|
|
* in other places.
|
|
*/
|
|
static ElementKind of(Element element) {
|
|
if (element == null) {
|
|
return ERROR;
|
|
}
|
|
return element.kind;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* The location of an element within the element model.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ElementLocation {
|
|
/**
|
|
* Return the path to the element whose location is represented by this
|
|
* object. Clients must not modify the returned array.
|
|
*/
|
|
List<String> get components;
|
|
|
|
/**
|
|
* Return an encoded representation of this location that can be used to
|
|
* create a location that is equal to this location.
|
|
*/
|
|
String get encoding;
|
|
}
|
|
|
|
/**
|
|
* An object that can be used to visit an element structure.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class. There are classes
|
|
* that implement this interface that provide useful default behaviors in
|
|
* `package:analyzer/dart/ast/visitor.dart`. A couple of the most useful include
|
|
* * SimpleElementVisitor which implements every visit method by doing nothing,
|
|
* * RecursiveElementVisitor which will cause every node in a structure to be
|
|
* visited, and
|
|
* * ThrowingElementVisitor which implements every visit method by throwing an
|
|
* exception.
|
|
*/
|
|
abstract class ElementVisitor<R> {
|
|
R visitClassElement(ClassElement element);
|
|
|
|
R visitCompilationUnitElement(CompilationUnitElement element);
|
|
|
|
R visitConstructorElement(ConstructorElement element);
|
|
|
|
R visitExportElement(ExportElement element);
|
|
|
|
R visitFieldElement(FieldElement element);
|
|
|
|
R visitFieldFormalParameterElement(FieldFormalParameterElement element);
|
|
|
|
R visitFunctionElement(FunctionElement element);
|
|
|
|
R visitFunctionTypeAliasElement(FunctionTypeAliasElement element);
|
|
|
|
R visitGenericFunctionTypeElement(GenericFunctionTypeElement element);
|
|
|
|
R visitImportElement(ImportElement element);
|
|
|
|
R visitLabelElement(LabelElement element);
|
|
|
|
R visitLibraryElement(LibraryElement element);
|
|
|
|
R visitLocalVariableElement(LocalVariableElement element);
|
|
|
|
R visitMethodElement(MethodElement element);
|
|
|
|
R visitMultiplyDefinedElement(MultiplyDefinedElement element);
|
|
|
|
R visitParameterElement(ParameterElement element);
|
|
|
|
R visitPrefixElement(PrefixElement element);
|
|
|
|
R visitPropertyAccessorElement(PropertyAccessorElement element);
|
|
|
|
R visitTopLevelVariableElement(TopLevelVariableElement element);
|
|
|
|
R visitTypeParameterElement(TypeParameterElement element);
|
|
}
|
|
|
|
/**
|
|
* An element representing an executable object, including functions, methods,
|
|
* constructors, getters, and setters.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ExecutableElement implements FunctionTypedElement {
|
|
/**
|
|
* An empty list of executable elements.
|
|
*/
|
|
static const List<ExecutableElement> EMPTY_LIST = const <ExecutableElement>[];
|
|
|
|
/**
|
|
* Return `true` if this executable element did not have an explicit return
|
|
* type specified for it in the original source. Note that if there was no
|
|
* explicit return type, and if the element model is fully populated, then
|
|
* the [returnType] will not be `null`.
|
|
*/
|
|
bool get hasImplicitReturnType;
|
|
|
|
/**
|
|
* Return `true` if this executable element is abstract. Executable elements
|
|
* are abstract if they are not external and have no body.
|
|
*/
|
|
bool get isAbstract;
|
|
|
|
/**
|
|
* Return `true` if this executable element has body marked as being
|
|
* asynchronous.
|
|
*/
|
|
bool get isAsynchronous;
|
|
|
|
/**
|
|
* Return `true` if this executable element is external. Executable elements
|
|
* are external if they are explicitly marked as such using the 'external'
|
|
* keyword.
|
|
*/
|
|
bool get isExternal;
|
|
|
|
/**
|
|
* Return `true` if this executable element has a body marked as being a
|
|
* generator.
|
|
*/
|
|
bool get isGenerator;
|
|
|
|
/**
|
|
* Return `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 legal.
|
|
*/
|
|
bool get isOperator;
|
|
|
|
/**
|
|
* Return `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.
|
|
*/
|
|
bool get isStatic;
|
|
|
|
/**
|
|
* Return `true` if this executable element has a body marked as being
|
|
* synchronous.
|
|
*/
|
|
bool get isSynchronous;
|
|
}
|
|
|
|
/**
|
|
* An export directive within a library.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ExportElement implements Element, UriReferencedElement {
|
|
/**
|
|
* An empty list of export elements.
|
|
*/
|
|
static const List<ExportElement> EMPTY_LIST = const <ExportElement>[];
|
|
|
|
/**
|
|
* Return a list containing the combinators that were specified as part of the
|
|
* export directive in the order in which they were specified.
|
|
*/
|
|
List<NamespaceCombinator> get combinators;
|
|
|
|
/**
|
|
* Return the library that is exported from this library by this export
|
|
* directive.
|
|
*/
|
|
LibraryElement get exportedLibrary;
|
|
}
|
|
|
|
/**
|
|
* A field defined within a type.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class FieldElement
|
|
implements ClassMemberElement, PropertyInducingElement {
|
|
/**
|
|
* An empty list of field elements.
|
|
*/
|
|
static const List<FieldElement> EMPTY_LIST = const <FieldElement>[];
|
|
|
|
/**
|
|
* Return {@code true} if this element is an enum constant.
|
|
*/
|
|
bool get isEnumConstant;
|
|
|
|
/**
|
|
* Returns `true` if this field can be overridden in strong mode.
|
|
*/
|
|
bool get isVirtual;
|
|
|
|
@override
|
|
AstNode computeNode();
|
|
}
|
|
|
|
/**
|
|
* A field formal parameter defined within a constructor element.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class FieldFormalParameterElement implements ParameterElement {
|
|
/**
|
|
* Return the field element associated with this field formal parameter, or
|
|
* `null` if the parameter references a field that doesn't exist.
|
|
*/
|
|
FieldElement get field;
|
|
}
|
|
|
|
/**
|
|
* A (non-method) function. This can be either a top-level function, a local
|
|
* function, a closure, or the initialization expression for a field or
|
|
* variable.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class FunctionElement implements ExecutableElement, LocalElement {
|
|
/**
|
|
* An empty list of function elements.
|
|
*/
|
|
static const List<FunctionElement> EMPTY_LIST = const <FunctionElement>[];
|
|
|
|
/**
|
|
* The name of the method that can be implemented by a class to allow its
|
|
* instances to be invoked as if they were a function.
|
|
*/
|
|
static final String CALL_METHOD_NAME = "call";
|
|
|
|
/**
|
|
* The name of the synthetic function defined for libraries that are deferred.
|
|
*/
|
|
static final String LOAD_LIBRARY_NAME = "loadLibrary";
|
|
|
|
/**
|
|
* The name of the function used as an entry point.
|
|
*/
|
|
static const String MAIN_FUNCTION_NAME = "main";
|
|
|
|
/**
|
|
* The name of the method that will be invoked if an attempt is made to invoke
|
|
* an undefined method on an object.
|
|
*/
|
|
static final String NO_SUCH_METHOD_METHOD_NAME = "noSuchMethod";
|
|
|
|
/**
|
|
* Return `true` if the function is an entry point, i.e. a top-level function
|
|
* and has the name `main`.
|
|
*/
|
|
bool get isEntryPoint;
|
|
|
|
@override
|
|
FunctionDeclaration computeNode();
|
|
}
|
|
|
|
/**
|
|
* A function type alias (`typedef`).
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class FunctionTypeAliasElement
|
|
implements FunctionTypedElement, TypeDefiningElement {
|
|
/**
|
|
* An empty array of type alias elements.
|
|
*/
|
|
static List<FunctionTypeAliasElement> EMPTY_LIST =
|
|
new List<FunctionTypeAliasElement>(0);
|
|
|
|
@override
|
|
CompilationUnitElement get enclosingElement;
|
|
|
|
@override
|
|
TypeAlias computeNode();
|
|
}
|
|
|
|
/**
|
|
* An element that has a [FunctionType] as its [type].
|
|
*
|
|
* This also provides convenient access to the parameters and return type.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class FunctionTypedElement implements TypeParameterizedElement {
|
|
/**
|
|
* Return a list containing all of the parameters defined by this executable
|
|
* element.
|
|
*/
|
|
List<ParameterElement> get parameters;
|
|
|
|
/**
|
|
* Return the return type defined by this element. If the element model is
|
|
* fully populated, then the [returnType] will not be `null`, even if no
|
|
* return type was explicitly specified.
|
|
*/
|
|
DartType get returnType;
|
|
|
|
@override
|
|
FunctionType get type;
|
|
}
|
|
|
|
/**
|
|
* The pseudo-declaration that defines a generic function type.
|
|
*
|
|
* Clients may not extend, implement, or mix-in this class.
|
|
*/
|
|
abstract class GenericFunctionTypeElement implements FunctionTypedElement {}
|
|
|
|
/**
|
|
* A [FunctionTypeAliasElement] whose returned function type has a [type]
|
|
* parameter.
|
|
*
|
|
* Clients may not extend, implement, or mix-in this class.
|
|
*/
|
|
abstract class GenericTypeAliasElement implements FunctionTypeAliasElement {
|
|
/**
|
|
* Return the generic function type element representing the generic function
|
|
* type on the right side of the equals.
|
|
*/
|
|
GenericFunctionTypeElement get function;
|
|
}
|
|
|
|
/**
|
|
* A combinator that causes some of the names in a namespace to be hidden when
|
|
* being imported.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class HideElementCombinator implements NamespaceCombinator {
|
|
/**
|
|
* Return a list containing the names that are not to be made visible in the
|
|
* importing library even if they are defined in the imported library.
|
|
*/
|
|
List<String> get hiddenNames;
|
|
}
|
|
|
|
/**
|
|
* A single import directive within a library.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ImportElement implements Element, UriReferencedElement {
|
|
/**
|
|
* An empty list of import elements.
|
|
*/
|
|
static const List<ImportElement> EMPTY_LIST = const <ImportElement>[];
|
|
|
|
/**
|
|
* Return a list containing the combinators that were specified as part of the
|
|
* import directive in the order in which they were specified.
|
|
*/
|
|
List<NamespaceCombinator> get combinators;
|
|
|
|
/**
|
|
* Return the library that is imported into this library by this import
|
|
* directive.
|
|
*/
|
|
LibraryElement get importedLibrary;
|
|
|
|
/**
|
|
* Return `true` if this import is for a deferred library.
|
|
*/
|
|
bool get isDeferred;
|
|
|
|
/**
|
|
* The [Namespace] that this directive contributes to the containing library.
|
|
*/
|
|
Namespace get namespace;
|
|
|
|
/**
|
|
* Return the prefix that was specified as part of the import directive, or
|
|
* `null` if there was no prefix specified.
|
|
*/
|
|
PrefixElement get prefix;
|
|
|
|
/**
|
|
* Return the offset of the prefix of this import in the file that contains
|
|
* this import directive, or `-1` if this import is synthetic, does not have a
|
|
* prefix, or otherwise does not have an offset.
|
|
*/
|
|
int get prefixOffset;
|
|
}
|
|
|
|
/**
|
|
* A label associated with a statement.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class LabelElement implements Element {
|
|
/**
|
|
* An empty list of label elements.
|
|
*/
|
|
static const List<LabelElement> EMPTY_LIST = const <LabelElement>[];
|
|
|
|
@override
|
|
ExecutableElement get enclosingElement;
|
|
}
|
|
|
|
/**
|
|
* A library.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class LibraryElement implements Element {
|
|
/**
|
|
* An empty list of library elements.
|
|
*/
|
|
static const List<LibraryElement> EMPTY_LIST = const <LibraryElement>[];
|
|
|
|
/**
|
|
* Return the compilation unit that defines this library.
|
|
*/
|
|
CompilationUnitElement get definingCompilationUnit;
|
|
|
|
/**
|
|
* Return the entry point for this library, or `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 `main`.
|
|
*/
|
|
FunctionElement get entryPoint;
|
|
|
|
/**
|
|
* Return a list containing all of the libraries that are exported from this
|
|
* library.
|
|
*/
|
|
List<LibraryElement> get exportedLibraries;
|
|
|
|
/**
|
|
* The export [Namespace] of this library, `null` if it has not been
|
|
* computed yet.
|
|
*/
|
|
Namespace get exportNamespace;
|
|
|
|
/**
|
|
* Return a list containing all of the exports defined in this library.
|
|
*/
|
|
List<ExportElement> get exports;
|
|
|
|
/**
|
|
* Return `true` if the defining compilation unit of this library contains at
|
|
* least one import directive whose URI uses the "dart-ext" scheme.
|
|
*/
|
|
bool get hasExtUri;
|
|
|
|
/**
|
|
* Return `true` if this library defines a top-level function named
|
|
* `loadLibrary`.
|
|
*/
|
|
bool get hasLoadLibraryFunction;
|
|
|
|
/**
|
|
* Return an identifier that uniquely identifies this element among the
|
|
* children of this element's parent.
|
|
*/
|
|
String get identifier;
|
|
|
|
/**
|
|
* Return a list 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 prefixes returned by [getPrefixes]) and
|
|
* those that are imported without a prefix.
|
|
*/
|
|
List<LibraryElement> get importedLibraries;
|
|
|
|
/**
|
|
* Return a list containing all of the imports defined in this library.
|
|
*/
|
|
List<ImportElement> get imports;
|
|
|
|
/**
|
|
* Return `true` if this library is an application that can be run in the
|
|
* browser.
|
|
*/
|
|
bool get isBrowserApplication;
|
|
|
|
/**
|
|
* Return `true` if this library is the dart:async library.
|
|
*/
|
|
bool get isDartAsync;
|
|
|
|
/**
|
|
* Return `true` if this library is the dart:core library.
|
|
*/
|
|
bool get isDartCore;
|
|
|
|
/**
|
|
* Return `true` if this library is part of the SDK.
|
|
*/
|
|
bool get isInSdk;
|
|
|
|
/**
|
|
* Return a list containing the strongly connected component in the
|
|
* import/export graph in which the current library resides.
|
|
*/
|
|
List<LibraryElement> get libraryCycle;
|
|
|
|
/**
|
|
* Return the element representing the synthetic function `loadLibrary` that
|
|
* is implicitly defined for this library if the library is imported using a
|
|
* deferred import.
|
|
*/
|
|
FunctionElement get loadLibraryFunction;
|
|
|
|
/**
|
|
* Return a list containing all of the compilation units that are included in
|
|
* this library using a `part` directive. This does not include the defining
|
|
* compilation unit that contains the `part` directives.
|
|
*/
|
|
List<CompilationUnitElement> get parts;
|
|
|
|
/**
|
|
* Return a list containing elements for each of the prefixes used to `import`
|
|
* libraries into this library. Each prefix can be used in more than one
|
|
* `import` directive.
|
|
*/
|
|
List<PrefixElement> get prefixes;
|
|
|
|
/**
|
|
* The public [Namespace] of this library, `null` if it has not been
|
|
* computed yet.
|
|
*/
|
|
Namespace get publicNamespace;
|
|
|
|
/**
|
|
* Return a list containing all of the compilation units this library consists
|
|
* of. This includes the defining compilation unit and units included using
|
|
* the `part` directive.
|
|
*/
|
|
List<CompilationUnitElement> get units;
|
|
|
|
/**
|
|
* Return a list containing all of the imports that share the given [prefix],
|
|
* or an empty array if there are no such imports.
|
|
*/
|
|
List<ImportElement> getImportsWithPrefix(PrefixElement prefix);
|
|
|
|
/**
|
|
* Return the class defined in this library that has the given [name], or
|
|
* `null` if this library does not define a class with the given name.
|
|
*/
|
|
ClassElement getType(String className);
|
|
}
|
|
|
|
/**
|
|
* An element that can be (but is not required to be) defined within a method
|
|
* or function (an [ExecutableElement]).
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
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 `null` if there is no single
|
|
* range of characters within which the element name is visible.
|
|
*
|
|
* * For a local variable, this is the source range of the block that
|
|
* encloses the variable declaration.
|
|
* * For a parameter, this includes the body of the method or function that
|
|
* declares the parameter.
|
|
* * For a local function, this is the source range of the block that
|
|
* encloses the variable declaration.
|
|
* * For top-level functions, `null` will be returned because they are
|
|
* potentially visible in multiple sources.
|
|
*/
|
|
SourceRange get visibleRange;
|
|
}
|
|
|
|
/**
|
|
* A local variable.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class LocalVariableElement implements LocalElement, VariableElement {
|
|
/**
|
|
* An empty list of field elements.
|
|
*/
|
|
static const List<LocalVariableElement> EMPTY_LIST =
|
|
const <LocalVariableElement>[];
|
|
}
|
|
|
|
/**
|
|
* An element that represents a method defined within a type.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class MethodElement implements ClassMemberElement, ExecutableElement {
|
|
/**
|
|
* An empty list of method elements.
|
|
*/
|
|
static const List<MethodElement> EMPTY_LIST = const <MethodElement>[];
|
|
|
|
@override
|
|
MethodDeclaration computeNode();
|
|
|
|
/**
|
|
* Gets the reified type of a tear-off of this method.
|
|
*
|
|
* If any of the parameters in the method are covariant, they are replaced
|
|
* with Object in the returned type. If no covariant parameters are present,
|
|
* returns `this`.
|
|
*/
|
|
@deprecated
|
|
FunctionType getReifiedType(DartType objectType);
|
|
}
|
|
|
|
/**
|
|
* A pseudo-element that represents multiple elements defined within a single
|
|
* scope that have the same name. This situation is not allowed by the language,
|
|
* so objects implementing this interface always represent an error. As a
|
|
* result, most of the normal operations on elements do not make sense and will
|
|
* return useless results.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class MultiplyDefinedElement implements Element {
|
|
/**
|
|
* Return a list containing all of the elements that were defined within the
|
|
* scope to have the same name.
|
|
*/
|
|
List<Element> get conflictingElements;
|
|
|
|
/**
|
|
* Return the type of this element as the dynamic type.
|
|
*/
|
|
DartType get type;
|
|
}
|
|
|
|
/**
|
|
* An [ExecutableElement], with the additional information of a list of
|
|
* [ExecutableElement]s from which this element was composed.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class MultiplyInheritedExecutableElement implements ExecutableElement {
|
|
/**
|
|
* Return a list containing all of the executable elements defined within this
|
|
* executable element.
|
|
*/
|
|
List<ExecutableElement> get inheritedElements;
|
|
}
|
|
|
|
/**
|
|
* An object that controls how namespaces are combined.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class NamespaceCombinator {
|
|
/**
|
|
* An empty list of namespace combinators.
|
|
*/
|
|
static const List<NamespaceCombinator> EMPTY_LIST =
|
|
const <NamespaceCombinator>[];
|
|
}
|
|
|
|
/**
|
|
* A parameter defined within an executable element.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ParameterElement
|
|
implements LocalElement, VariableElement, ConstantEvaluationTarget {
|
|
/**
|
|
* An empty list of parameter elements.
|
|
*/
|
|
static const List<ParameterElement> EMPTY_LIST = const <ParameterElement>[];
|
|
|
|
/**
|
|
* Return the Dart code of the default value, or `null` if no default value.
|
|
*/
|
|
String get defaultValueCode;
|
|
|
|
/**
|
|
* Return `true` if this parameter is covariant, meaning it is allowed to have
|
|
* a narrower type in an override.
|
|
*/
|
|
bool get isCovariant;
|
|
|
|
/**
|
|
* Return `true` if this parameter is an initializing formal parameter.
|
|
*/
|
|
bool get isInitializingFormal;
|
|
|
|
/**
|
|
* Return `true` if this parameter is a named parameter. Named parameters are
|
|
* always optional, even when they are annotated with the `@required`
|
|
* annotation.
|
|
*/
|
|
bool get isNamed;
|
|
|
|
/**
|
|
* Return `true` if this parameter is a required parameter. Required
|
|
* parameters are always positional.
|
|
*
|
|
* Note: this will return `false` for a named parameter that is annotated with
|
|
* the `@required` annotation.
|
|
*/
|
|
// TODO(brianwilkerson) Rename this to `isRequired`.
|
|
bool get isNotOptional;
|
|
|
|
/**
|
|
* Return `true` if this parameter is an optional parameter. Optional
|
|
* parameters can either be positional or named.
|
|
*/
|
|
bool get isOptional;
|
|
|
|
/**
|
|
* Return `true` if this parameter is both an optional and positional
|
|
* parameter.
|
|
*/
|
|
bool get isOptionalPositional;
|
|
|
|
/**
|
|
* Return `true` if this parameter is a positional parameter. Positional
|
|
* parameters can either be required or optional.
|
|
*/
|
|
bool get isPositional;
|
|
|
|
/**
|
|
* Return the kind of this parameter.
|
|
*/
|
|
@deprecated
|
|
ParameterKind get parameterKind;
|
|
|
|
/**
|
|
* Return a list containing all of the parameters defined by this parameter.
|
|
* A parameter will only define other parameters if it is a function typed
|
|
* parameter.
|
|
*/
|
|
List<ParameterElement> get parameters;
|
|
|
|
/**
|
|
* Return a list containing all of the type parameters defined by this
|
|
* parameter. A parameter will only define other parameters if it is a
|
|
* function typed parameter.
|
|
*/
|
|
List<TypeParameterElement> get typeParameters;
|
|
|
|
/**
|
|
* Append the type, name and possibly the default value of this parameter to
|
|
* the given [buffer].
|
|
*/
|
|
void appendToWithoutDelimiters(StringBuffer buffer);
|
|
|
|
@override
|
|
FormalParameter computeNode();
|
|
}
|
|
|
|
/**
|
|
* A prefix used to import one or more libraries into another library.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class PrefixElement implements Element {
|
|
/**
|
|
* An empty list of prefix elements.
|
|
*/
|
|
static const List<PrefixElement> EMPTY_LIST = const <PrefixElement>[];
|
|
|
|
@override
|
|
LibraryElement get enclosingElement;
|
|
|
|
/**
|
|
* Return the empty list.
|
|
*
|
|
* Deprecated: this getter was intended to return a list containing all of
|
|
* the libraries that are imported using this prefix, but it was never
|
|
* implemented. Due to lack of demand, it is being removed.
|
|
*/
|
|
@deprecated
|
|
List<LibraryElement> get importedLibraries;
|
|
}
|
|
|
|
/**
|
|
* A getter or a setter. Note that explicitly defined property accessors
|
|
* implicitly define a synthetic field. Symmetrically, synthetic accessors are
|
|
* implicitly created for explicitly defined fields. The following rules apply:
|
|
*
|
|
* * Every explicit field is represented by a non-synthetic [FieldElement].
|
|
* * Every explicit field induces a getter and possibly a setter, both of which
|
|
* are represented by synthetic [PropertyAccessorElement]s.
|
|
* * Every explicit getter or setter is represented by a non-synthetic
|
|
* [PropertyAccessorElement].
|
|
* * Every explicit getter or setter (or pair thereof if they have the same
|
|
* name) induces a field that is represented by a synthetic [FieldElement].
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class PropertyAccessorElement implements ExecutableElement {
|
|
/**
|
|
* An empty list of property accessor elements.
|
|
*/
|
|
static const List<PropertyAccessorElement> EMPTY_LIST =
|
|
const <PropertyAccessorElement>[];
|
|
|
|
/**
|
|
* Return the accessor representing the getter that corresponds to (has the
|
|
* same name as) this setter, or `null` if this accessor is not a setter or if
|
|
* there is no corresponding getter.
|
|
*/
|
|
PropertyAccessorElement get correspondingGetter;
|
|
|
|
/**
|
|
* Return the accessor representing the setter that corresponds to (has the
|
|
* same name as) this getter, or `null` if this accessor is not a getter or if
|
|
* there is no corresponding setter.
|
|
*/
|
|
PropertyAccessorElement get correspondingSetter;
|
|
|
|
/**
|
|
* Return `true` if this accessor represents a getter.
|
|
*/
|
|
bool get isGetter;
|
|
|
|
/**
|
|
* Return `true` if this accessor represents a setter.
|
|
*/
|
|
bool get isSetter;
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
PropertyInducingElement get variable;
|
|
}
|
|
|
|
/**
|
|
* A variable that has an associated getter and possibly a setter. Note that
|
|
* explicitly defined variables implicitly define a synthetic getter and that
|
|
* non-`final` explicitly defined variables implicitly define a synthetic
|
|
* setter. Symmetrically, synthetic fields are implicitly created for explicitly
|
|
* defined getters and setters. The following rules apply:
|
|
*
|
|
* * Every explicit variable is represented by a non-synthetic
|
|
* [PropertyInducingElement].
|
|
* * Every explicit variable induces a getter and possibly a setter, both of
|
|
* which are represented by synthetic [PropertyAccessorElement]s.
|
|
* * Every explicit getter or setter is represented by a non-synthetic
|
|
* [PropertyAccessorElement].
|
|
* * Every explicit getter or setter (or pair thereof if they have the same
|
|
* name) induces a variable that is represented by a synthetic
|
|
* [PropertyInducingElement].
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class PropertyInducingElement implements VariableElement {
|
|
/**
|
|
* An empty list of elements.
|
|
*/
|
|
static const List<PropertyInducingElement> EMPTY_LIST =
|
|
const <PropertyInducingElement>[];
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
PropertyAccessorElement get getter;
|
|
|
|
/**
|
|
* Return the propagated type of this variable, or `null` if type propagation
|
|
* has not been performed, for example because the variable is not final.
|
|
*/
|
|
DartType get propagatedType;
|
|
|
|
/**
|
|
* Return the setter associated with this variable, or `null` if the variable
|
|
* is effectively `final` and therefore does not have a setter associated with
|
|
* it. (This can happen either because the variable is explicitly defined as
|
|
* being `final` or because the variable is induced by an explicit getter that
|
|
* does not have a corresponding setter.) If this variable was explicitly
|
|
* defined (is not synthetic) then the setter associated with it will be
|
|
* synthetic.
|
|
*/
|
|
PropertyAccessorElement get setter;
|
|
}
|
|
|
|
/**
|
|
* A combinator that cause some of the names in a namespace to be visible (and
|
|
* the rest hidden) when being imported.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class ShowElementCombinator implements NamespaceCombinator {
|
|
/**
|
|
* Return the offset of the character immediately following the last character
|
|
* of this node.
|
|
*/
|
|
int get end;
|
|
|
|
/**
|
|
* Return the offset of the 'show' keyword of this element.
|
|
*/
|
|
int get offset;
|
|
|
|
/**
|
|
* Return a list containing the names that are to be made visible in the
|
|
* importing library if they are defined in the imported library.
|
|
*/
|
|
List<String> get shownNames;
|
|
}
|
|
|
|
/**
|
|
* A top-level variable.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class TopLevelVariableElement implements PropertyInducingElement {
|
|
/**
|
|
* An empty list of top-level variable elements.
|
|
*/
|
|
static const List<TopLevelVariableElement> EMPTY_LIST =
|
|
const <TopLevelVariableElement>[];
|
|
|
|
@override
|
|
VariableDeclaration computeNode();
|
|
}
|
|
|
|
/**
|
|
* An element that defines a type.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class TypeDefiningElement implements Element {
|
|
/**
|
|
* Return the type defined by this element.
|
|
*/
|
|
DartType get type;
|
|
}
|
|
|
|
/**
|
|
* A type parameter.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class TypeParameterElement implements TypeDefiningElement {
|
|
/**
|
|
* An empty list of type parameter elements.
|
|
*/
|
|
static const List<TypeParameterElement> EMPTY_LIST =
|
|
const <TypeParameterElement>[];
|
|
|
|
/**
|
|
* Return the type representing the bound associated with this parameter, or
|
|
* `null` if this parameter does not have an explicit bound.
|
|
*/
|
|
DartType get bound;
|
|
|
|
@override
|
|
TypeParameterType get type;
|
|
}
|
|
|
|
/**
|
|
* An element that has type parameters, such as a class or a typedef. This also
|
|
* includes functions and methods if support for generic methods is enabled.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class TypeParameterizedElement implements Element {
|
|
/**
|
|
* The type of this element, which will be a parameterized type.
|
|
*/
|
|
ParameterizedType get type;
|
|
|
|
/**
|
|
* Return a list containing all of the type parameters declared by this
|
|
* element directly. This does not include type parameters that are declared
|
|
* by any enclosing elements.
|
|
*/
|
|
List<TypeParameterElement> get typeParameters;
|
|
}
|
|
|
|
/**
|
|
* A pseudo-elements that represents names that are undefined. This situation is
|
|
* not allowed by the language, so objects implementing this interface always
|
|
* represent an error. As a result, most of the normal operations on elements do
|
|
* not make sense and will return useless results.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class UndefinedElement implements Element {}
|
|
|
|
/**
|
|
* An element included into a library using some URI.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class UriReferencedElement implements Element {
|
|
/**
|
|
* Return the URI that is used to include this element into the enclosing
|
|
* library, or `null` if this is the defining compilation unit of a library.
|
|
*/
|
|
String get uri;
|
|
|
|
/**
|
|
* Return the offset of the character immediately following the last character
|
|
* of this node's URI, or `-1` for synthetic import.
|
|
*/
|
|
int get uriEnd;
|
|
|
|
/**
|
|
* Return the offset of the URI in the file, or `-1` if this element is
|
|
* synthetic.
|
|
*/
|
|
int get uriOffset;
|
|
}
|
|
|
|
/**
|
|
* A variable. There are more specific subclasses for more specific kinds of
|
|
* variables.
|
|
*
|
|
* Clients may not extend, implement or mix-in this class.
|
|
*/
|
|
abstract class VariableElement implements Element, ConstantEvaluationTarget {
|
|
/**
|
|
* An empty list of variable elements.
|
|
*/
|
|
static const List<VariableElement> EMPTY_LIST = const <VariableElement>[];
|
|
|
|
/**
|
|
* Return a representation of the value of this variable.
|
|
*
|
|
* Return `null` if either this variable was not declared with the 'const'
|
|
* modifier or if the value of this variable could not be computed because of
|
|
* errors.
|
|
*/
|
|
DartObject get constantValue;
|
|
|
|
/**
|
|
* Return `true` if this variable element did not have an explicit type
|
|
* specified for it.
|
|
*/
|
|
bool get hasImplicitType;
|
|
|
|
/**
|
|
* Return a synthetic function representing this variable's initializer, or
|
|
* `null` if this variable does not have an initializer. The function will
|
|
* have no parameters. The return type of the function will be the
|
|
* compile-time type of the initialization expression.
|
|
*/
|
|
FunctionElement get initializer;
|
|
|
|
/**
|
|
* Return `true` if this variable was declared with the 'const' modifier.
|
|
*/
|
|
bool get isConst;
|
|
|
|
/**
|
|
* Return `true` if this variable was declared with the 'final' modifier.
|
|
* Variables that are declared with the 'const' modifier will return `false`
|
|
* even though they are implicitly final.
|
|
*/
|
|
bool get isFinal;
|
|
|
|
/**
|
|
* Return `true` if this variable is potentially mutated somewhere in a
|
|
* closure. This information is only available for local variables (including
|
|
* parameters) and only after the compilation unit containing the variable has
|
|
* been resolved.
|
|
*
|
|
* This getter is deprecated--it now returns `true` for all local variables
|
|
* and parameters. Please use [FunctionBody.isPotentiallyMutatedInClosure]
|
|
* instead.
|
|
*/
|
|
@deprecated
|
|
bool get isPotentiallyMutatedInClosure;
|
|
|
|
/**
|
|
* Return `true` if this variable is potentially mutated somewhere in its
|
|
* scope. This information is only available for local variables (including
|
|
* parameters) and only after the compilation unit containing the variable has
|
|
* been resolved.
|
|
*
|
|
* This getter is deprecated--it now returns `true` for all local variables
|
|
* and parameters. Please use [FunctionBody.isPotentiallyMutatedInClosure]
|
|
* instead.
|
|
*/
|
|
@deprecated
|
|
bool get isPotentiallyMutatedInScope;
|
|
|
|
/**
|
|
* Return `true` if this element is a static variable, as per section 8 of the
|
|
* Dart Language Specification:
|
|
*
|
|
* > A static variable is a variable that is not associated with a particular
|
|
* > instance, but rather with an entire library or class. Static variables
|
|
* > include library variables and class variables. Class variables are
|
|
* > variables whose declaration is immediately nested inside a class
|
|
* > declaration and includes the modifier static. A library variable is
|
|
* > implicitly static.
|
|
*/
|
|
bool get isStatic;
|
|
|
|
/**
|
|
* Return the declared type of this variable, or `null` if the variable did
|
|
* not have a declared type (such as if it was declared using the keyword
|
|
* 'var').
|
|
*/
|
|
DartType get type;
|
|
|
|
/**
|
|
* Return a representation of the value of this variable, forcing the value
|
|
* to be computed if it had not previously been computed, or `null` if either
|
|
* this variable was not declared with the 'const' modifier or if the value of
|
|
* this variable could not be computed because of errors.
|
|
*/
|
|
DartObject computeConstantValue();
|
|
}
|