// 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 elements and fragments that are part of 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](../dart_ast_ast/dart_ast_ast-library.html). /// /// The element model consists of three closely related kinds of objects: /// elements (instances of a subclass of [Element]), fragments (instances of a /// subclass of [Fragment]) and types. This library defines the elements and /// fragments; the types are defined in /// [type.dart](../dart_element_type/dart_element_type-library.html). /// /// 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. /// /// Some elements, such as a [LocalVariableElement] are declared by a single /// declaration, but most elements can be declared by multiple declarations. A /// fragment represents a single declaration when the corresponding element /// can have multiple declarations. There is no fragment for an element that can /// only have one declaration. /// /// As with elements, fragments are organized in a tree structure. The two /// structures parallel each other. /// /// 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 /// [LibraryFragment]. /// /// 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. /// /// @docImport 'package:analyzer/src/dart/element/member.dart'; library; import 'package:analyzer/dart/analysis/features.dart'; import 'package:analyzer/dart/analysis/session.dart'; import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/dart/constant/value.dart'; import 'package:analyzer/dart/element/nullability_suffix.dart'; import 'package:analyzer/dart/element/scope.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/dart/element/type_provider.dart'; import 'package:analyzer/dart/element/type_system.dart'; import 'package:analyzer/diagnostic/diagnostic.dart'; import 'package:analyzer/source/line_info.dart'; import 'package:analyzer/source/source.dart'; import 'package:analyzer/src/dart/element/inheritance_manager3.dart' show Name; import 'package:analyzer/src/dart/resolver/scope.dart'; import 'package:meta/meta.dart'; import 'package:pub_semver/pub_semver.dart'; export 'package:analyzer/src/dart/element/inheritance_manager3.dart' show Name; /// A pattern variable that is explicitly declared. /// /// Clients may not extend, implement or mix-in this class. abstract class BindPatternVariableElement implements PatternVariableElement { @override BindPatternVariableFragment get firstFragment; @override List get fragments; } /// The portion of a [BindPatternVariableElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class BindPatternVariableFragment implements PatternVariableFragment { @override BindPatternVariableElement get element; @override BindPatternVariableFragment? get nextFragment; @override BindPatternVariableFragment? get previousFragment; } /// A class. /// /// The class can be defined by either a class declaration (with a class body), /// or a mixin application (without a class body). /// /// Clients may not extend, implement or mix-in this class. abstract class ClassElement implements InterfaceElement { @override ClassFragment get firstFragment; @override List get fragments; /// Whether the class or its superclass declares a non-final instance field. bool get hasNonFinalField; /// Whether the class is abstract. /// /// A class is abstract if it has an explicit `abstract` modifier. Note, that /// this definition of abstract is different from has unimplemented /// members. bool get isAbstract; /// Whether this class is a base class. /// /// A class is a base class if it has an explicit `base` modifier, or the /// class has a `base` induced modifier and [isSealed] is `true` as well. /// The base modifier allows the class to be extended but not implemented. bool get isBase; /// Whether the class can be instantiated. bool get isConstructable; /// Whether the class represents the class 'Enum' defined in `dart:core`. bool get isDartCoreEnum; /// Whether the class represents the class 'Object' defined in `dart:core`. bool get isDartCoreObject; /// Whether the class is exhaustive. /// /// A class is exhaustive if it has the property where, in a switch, if you /// cover all of the subtypes of this element, then the compiler knows that /// you have covered all possible instances of the type. bool get isExhaustive; /// Whether this class can be extended outside of its library. bool get isExtendableOutside; /// Whether the class is a final class. /// /// A class is a final class if it has an explicit `final` modifier, or the /// class has a `final` induced modifier and [isSealed] is `true` as well. /// The final modifier prohibits this class from being extended, implemented, /// or mixed in. bool get isFinal; /// Whether the class can be implemented outside of its library. bool get isImplementableOutside; /// Whether the class is an interface class. /// /// A class is an interface class if it has an explicit `interface` modifier, /// or the class has an `interface` induced modifier and [isSealed] is `true` /// as well. The interface modifier allows the class to be implemented, but /// not extended or mixed in. bool get isInterface; /// Whether the class can be mixed-in outside of its library. bool get isMixableOutside; /// Whether the 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; /// Whether the class is a mixin class. /// /// A class is a mixin class if it has an explicit `mixin` modifier. bool get isMixinClass; /// Whether the class is a sealed class. /// /// A class is a sealed class if it has an explicit `sealed` modifier. bool get isSealed; /// Whether the class can validly be used as a mixin when defining another /// class. /// /// For classes defined by a class declaration or a mixin application, the /// behavior of this method is defined by the Dart Language Specification /// in section 9: ///
/// 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. ///
bool get isValidMixin; } /// The portion of a [ClassElement] contributed by a single declaration. /// /// The fragment can be defined by either a class declaration (with a class /// body), or a mixin application (without a class body). /// /// Clients may not extend, implement or mix-in this class. abstract class ClassFragment implements InterfaceFragment { @override ClassElement get element; @override ClassFragment? get nextFragment; @override ClassFragment? get previousFragment; } /// An element representing a constructor defined by a class, enum, or extension /// type. /// /// Clients may not extend, implement or mix-in this class. abstract class ConstructorElement implements ExecutableElement { @override ConstructorElement get baseElement; @override InterfaceElement get enclosingElement; @override ConstructorFragment get firstFragment; @override List get fragments; /// Whether the constructor is a const constructor. bool get isConst; /// Whether this is a declaring constructor. @experimental bool get isDeclaring; /// Whether the constructor can be used as a default constructor - unnamed, /// and has no required parameters. bool get isDefaultConstructor; /// Whether the constructor represents a factory constructor. bool get isFactory; /// Whether the constructor represents a generative constructor. bool get isGenerative; /// Whether the constructor is from an explicit [ConstructorDeclaration] /// or [PrimaryConstructorDeclaration]. /// /// When this is `true`, [isOriginImplicitDefault] and /// [isOriginMixinApplication] are `false`. bool get isOriginDeclaration; /// Whether the constructor was created because there are no explicit /// constructors. /// /// When this is `true`, [isOriginDeclaration] and /// [isOriginMixinApplication] are `false`. bool get isOriginImplicitDefault; /// Whether the constructor was created for a mixin application. /// /// When this is `true`, [isOriginDeclaration] and /// [isOriginImplicitDefault] are `false`. bool get isOriginMixinApplication; /// Whether this is a primary constructor. /// When `true`, [isDeclaring] is also `true`. @experimental bool get isPrimary; @Deprecated( 'Use isOriginDeclaration / isOriginImplicitDefault / ' 'isOriginMixinApplication instead, depending on intent.', ) @override bool get isSynthetic; /// The name of this constructor. /// /// The name of the unnamed constructor is `new`. @override String? get name; /// The constructor to which this constructor is redirecting. /// /// Returns `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 InterfaceType get returnType; /// The constructor of the superclass that this constructor invokes, or /// `null` if this constructor redirects to another constructor, or if the /// library containing this constructor has not yet been resolved. ConstructorElement? get superConstructor; } /// The portion of a [ConstructorElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class ConstructorFragment implements ExecutableFragment { @override ConstructorElement get element; @override InstanceFragment? get enclosingFragment; /// The offset of the `factory` keyword. /// /// It is `null` if the fragment is synthetic, or does not have the keyword. int? get factoryKeywordOffset; @Deprecated( 'Use isOriginDeclaration / isOriginImplicitDefault / ' 'isOriginMixinApplication instead, depending on intent.', ) @override bool get isSynthetic; @override String get name; /// The offset of the `new` keyword. /// /// It is `null` if the fragment is synthetic, or does not have the keyword. int? get newKeywordOffset; @override ConstructorFragment? get nextFragment; /// The offset of the constructor name. /// /// For a named constructor (e.g., `ClassName.foo()``), this is the offset to /// the part of the constructor name that follows the `.`. For an unnamed /// constructor (e.g., `ClassName();`), this is the offset of the class name /// that appears in the constructor declaration. /// /// For an implicit constructor, this is the offset of the class name in the /// class declaration. @override int get offset; /// The offset of the `.` before the name. /// /// It is `null` if the fragment is synthetic, or does not specify an /// explicit name, even if [name] is `new` in this case. int? get periodOffset; @override ConstructorFragment? get previousFragment; /// The offset of the `this` keyword, if this fragment is based on /// [PrimaryConstructorDeclaration] and has [PrimaryConstructorBody]. int? get thisKeywordOffset; /// The specified name of the type (e.g. class). /// /// In valid code it is the name of the [enclosingFragment], however it /// could be anything in invalid code, e.g. `class A { A2.named(); }`. /// /// If the fragment is synthetic, the type name is the name of the /// enclosing type, which itself can be `null` if its name token is /// synthetic. String? get typeName; /// The offset of the type (e.g. class) name. /// /// It is `null` if the fragment is synthetic. int? get typeNameOffset; } /// Meaning of a URI referenced in a directive. /// /// Clients may not extend, implement or mix-in this class. abstract class DirectiveUri {} /// [DirectiveUriWithSource] that references a [LibraryElement]. /// /// Clients may not extend, implement or mix-in this class. abstract class DirectiveUriWithLibrary extends DirectiveUriWithSource { /// The library referenced by the [source]. LibraryElement get library; } /// [DirectiveUriWithRelativeUriString] that can be parsed into a relative URI. /// /// Clients may not extend, implement or mix-in this class. abstract class DirectiveUriWithRelativeUri extends DirectiveUriWithRelativeUriString { /// The relative URI, parsed from [relativeUriString]. Uri get relativeUri; } /// [DirectiveUri] for which we can get its relative URI string. /// /// Clients may not extend, implement or mix-in this class. abstract class DirectiveUriWithRelativeUriString extends DirectiveUri { /// The relative URI string specified in code. String get relativeUriString; } /// [DirectiveUriWithRelativeUri] that resolves to a [Source]. /// /// Clients may not extend, implement or mix-in this class. abstract class DirectiveUriWithSource extends DirectiveUriWithRelativeUri { /// The result of resolving [relativeUri] against the enclosing URI. Source get source; } /// [DirectiveUriWithSource] that references a [LibraryFragment]. /// /// Clients may not extend, implement or mix-in this class. abstract class DirectiveUriWithUnit extends DirectiveUriWithSource { /// The library fragment referenced by the [source]. LibraryFragment get libraryFragment; } /// 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 don't have any /// corresponding declaration within the source code. Such elements are marked /// as being synthetic. Examples of synthetic elements include /// - default constructors in classes that don't 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 don't have, or are not /// required to have a name. These correspond to things like unnamed functions /// or extensions. They 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 { /// The non-[SubstitutedElementImpl] version of this element. /// /// If the receiver is a view on an element, such as a method from an /// interface type with substituted type parameters, this getter will return /// the corresponding element from the class, without any substitutions. /// /// If the receiver is already a non-[SubstitutedElementImpl] element (or a /// synthetic element, such as a synthetic property accessor), this getter /// will return the receiver. Element get baseElement; /// The children of this element. /// /// There is no guarantee of the order in which the children will be returned. /// In particular, they are not guaranteed to be in lexical order. List get children; /// The display name of this element, or an empty string if the element does /// not have a name. /// /// In most cases the name and the display name are the same. They differ in /// cases such as setters where the `name` of some setter (`set s(x)`) is `s=` /// but the `displayName` is `s`. String get displayName; /// The content of the documentation comment (including delimiters) for this /// element. /// /// This is a concatenation of the comments from all of the fragments. /// /// Returns `null` if the element doesn't have documentation. String? get documentationComment; /// The element that either physically or logically encloses this element. /// /// Returns `null` if this element is a library because libraries are the /// top-level elements in the model. Element? get enclosingElement; /// The first fragment in the chain of fragments that are merged to make this /// element. /// /// The other fragments in the chain can be accessed using successive /// invocations of [Fragment.nextFragment]. Fragment get firstFragment; /// The fragments this element consists of. List get fragments; /// The unique integer identifier of this element. int get id; /// Whether this element is private. /// /// Private elements are visible only within the library in which they are /// declared. bool get isPrivate; /// Whether this element is public. /// /// Public elements are visible within any library that imports the library /// in which they are declared. bool get isPublic; /// Whether 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. @Deprecated('Use isOriginX instead') bool get isSynthetic; /// The kind of this element. ElementKind get kind; /// Library that contains this element. /// /// This will be the element itself if it's a library element. This will be /// `null` if this element is a [MultiplyDefinedElement] that isn't contained /// in a single library. LibraryElement? get library; /// The name to use for lookup in maps. /// /// It is usually the same as [name], with a few special cases. /// /// Just like [name], it can be `null` if the element does not have /// a name, for example an unnamed extension, or because of parser recovery. /// /// For a [SetterElement] the result has `=` at the end. /// /// For an unary operator `-` the result is `unary-`. /// For a binary operator `-` the result is just `-`. String? get lookupName; /// The metadata associated with the element. /// /// It includes all annotations from all of the fragments. /// /// The list will be empty if the element does not have any metadata. Metadata get metadata; /// The name of this element. /// /// Returns `null` if this element doesn't have a name. /// /// See [Fragment.name] for details. String? get name; /// The non-synthetic element that caused this element to be created. /// /// If this element is not synthetic, then the element itself is returned. /// /// If this element is synthetic, then the corresponding non-synthetic /// element is returned. For example, for a synthetic getter of a /// non-synthetic field the field is returned; for a synthetic constructor /// the enclosing class is returned. Element get nonSynthetic; /// The analysis session in which this element is defined. AnalysisSession? get session; /// The version where the associated SDK API was added. /// /// A `@Since()` annotation can be applied to a library declaration, /// any public declaration in a library, or in a class, or to an optional /// parameter, etc. /// /// The returned version is "effective", so that if a library is annotated /// then all elements of the library inherit it; or if a class is annotated /// then all members and constructors of the class inherit it. /// /// If multiple `@Since()` annotations apply to the same element, the latest /// version takes precedence. /// /// Returns `null` if the element is not declared in the SDK, or doesn't have /// a `@Since()` annotation applied to it. Version? get sinceSdkVersion; /// Uses the given [visitor] to visit this element. /// /// Returns the value returned by the visitor as a result of visiting this /// element. T? accept(ElementVisitor2 visitor); /// The presentation of this element as it should appear when presented to /// users. /// /// If [multiline] is `true`, then the string may be wrapped over multiple /// lines with newlines to improve formatting. For example, function /// signatures may be formatted as if they had trailing commas. /// /// If [preferTypeAlias] is `true` and the element represents a type defined /// by a type alias, then the name of the type alias will be used in the /// returned string rather than the name of the type being aliased. /// /// Clients should not depend on the content of the returned value as it will /// be changed if doing so would improve the UX. String displayString({bool multiline = false, bool preferTypeAlias = false}); /// Returns 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. String getExtendedDisplayName({String? shortName}); /// Whether the 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 6.2: ///
/// A declaration m is accessible to a library L if m is /// declared in L or if m is public. ///
bool isAccessibleIn(LibraryElement library); /// Whether this Element is annotated with a `Deprecated` annotation with a /// `_DeprecationKind` of [kind]. bool isDeprecatedWithKind(String kind); /// Returns either this element or the most immediate ancestor of this element /// for which the [predicate] returns `true`. /// /// Returns `null` if there is no such element. Element? thisOrAncestorMatching(bool Function(Element) predicate); /// Returns either this element or the most immediate ancestor of this element /// that has the given type. /// /// Returns `null` if there is no such element. E? thisOrAncestorOfType(); /// Uses 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(ElementVisitor2 visitor); } /// A single annotation associated with an element. /// /// Clients may not extend, implement or mix-in this class. abstract class ElementAnnotation { /// The errors that were produced while computing a value for this /// annotation, or `null` if no value has been computed. /// /// If a value has been produced but no errors were generated, then the /// list will be empty. List? get constantEvaluationErrors; /// The kind of deprecation, if this annotation is a `Deprecated` annotation. /// /// `null` is returned if this is not a `Deprecated` annotation. String? get deprecationKind; /// Returns the element referenced by this annotation. /// /// In valid code this element can be a [GetterElement] of a constant /// top-level variable, or a constant static field of a class; or a /// constant [ConstructorElement]. /// /// In invalid code this element can be `null`, or a reference to any /// other element. Element? get element; /// Whether the annotation marks the associated function as always throwing. bool get isAlwaysThrows; /// Whether the annotation marks the associated element as not needing to be /// awaited. bool get isAwaitNotRequired; /// Whether the annotation marks the associated element as being deprecated. bool get isDeprecated; /// Whether the annotation marks the associated element as not to be stored. bool get isDoNotStore; /// Whether the annotation marks the associated member as not to be used. bool get isDoNotSubmit; /// Whether the annotation marks the associated element as experimental. bool get isExperimental; /// Whether the annotation marks the associated member as a factory. bool get isFactory; /// Whether the annotation marks the associated class and its subclasses as /// being immutable. bool get isImmutable; /// Whether the annotation marks the associated element as being internal to /// its package. bool get isInternal; /// Whether the annotation marks the associated member as running a single /// test. bool get isIsTest; /// Whether the annotation marks the associated member as running a test /// group. bool get isIsTestGroup; /// Whether the annotation marks the associated element with the `JS` /// annotation. bool get isJS; /// Whether the annotation marks the associated constructor as being literal. bool get isLiteral; /// Whether the annotation marks the associated returned element as /// requiring a constant argument. bool get isMustBeConst; /// Whether the annotation marks the associated member as requiring /// subclasses to override this member. bool get isMustBeOverridden; /// Whether the annotation marks the associated member as requiring /// overriding methods to call super. bool get isMustCallSuper; /// Whether the annotation marks the associated member as being non-virtual. bool get isNonVirtual; /// Whether the annotation marks the associated type as having "optional" /// type arguments. bool get isOptionalTypeArgs; /// Whether the annotation marks the associated method as being expected to /// override an inherited method. bool get isOverride; /// Whether the annotation marks the associated member as being protected. bool get isProtected; /// Whether the annotation marks the associated class as implementing a proxy /// object. bool get isProxy; /// Whether the annotation marks the associated member as redeclaring. bool get isRedeclare; /// Whether the annotation marks the associated member as being reopened. bool get isReopen; /// Whether the annotation marks the associated member as being required. bool get isRequired; /// Whether the annotation marks the associated class as being sealed. bool get isSealed; /// Whether the annotation marks the associated class as being intended to /// be used as an annotation. bool get isTarget; /// Whether the annotation marks the associated returned element as /// requiring use. bool get isUseResult; /// Whether the annotation marks the associated member as being visible for /// overriding only. bool get isVisibleForOverriding; /// Whether the annotation marks the associated member as being visible for /// template files. bool get isVisibleForTemplate; /// Whether the annotation marks the associated member as being visible for /// testing. bool get isVisibleForTesting; /// Whether the annotation marks the associated member as being visible /// outside of template files. bool get isVisibleOutsideTemplate; /// Whether the annotation marks the associated member as being a widget /// factory. bool get isWidgetFactory; /// The library fragment that contains this annotation. LibraryFragment get libraryFragment; /// Returns 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(); /// Returns 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(); } /// A directive within a library fragment. /// /// Clients may not extend, implement or mix-in this class. abstract class ElementDirective { /// The library fragment that contains this object. LibraryFragment get libraryFragment; /// The metadata associated with the element or fragment. /// /// If the receiver is an element that has fragments, the list will include /// all of the metadata from all of the fragments. /// /// The list will be empty if the receiver does not have any metadata or if /// the library containing this element has not yet been fully resolved. Metadata get metadata; /// The interpretation of the URI specified in the directive. DirectiveUri get uri; } /// The kind of elements in the element model. /// /// Clients may not extend, implement or mix-in this class. class ElementKind implements Comparable { static const ElementKind AUGMENTATION_IMPORT = ElementKind( 'AUGMENTATION_IMPORT', 0, "augmentation import", ); static const ElementKind CLASS = ElementKind('CLASS', 1, "class"); static const ElementKind CLASS_AUGMENTATION = ElementKind( 'CLASS_AUGMENTATION', 2, "class augmentation", ); static const ElementKind COMPILATION_UNIT = ElementKind( 'COMPILATION_UNIT', 3, "compilation unit", ); static const ElementKind CONSTRUCTOR = ElementKind( 'CONSTRUCTOR', 4, "constructor", ); static const ElementKind DYNAMIC = ElementKind('DYNAMIC', 5, ""); static const ElementKind ENUM = ElementKind('ENUM', 6, "enum"); static const ElementKind ERROR = ElementKind('ERROR', 7, ""); static const ElementKind EXPORT = ElementKind( 'EXPORT', 8, "export directive", ); static const ElementKind EXTENSION = ElementKind('EXTENSION', 9, "extension"); static const ElementKind EXTENSION_TYPE = ElementKind( 'EXTENSION_TYPE', 10, "extension type", ); static const ElementKind FIELD = ElementKind('FIELD', 11, "field"); static const ElementKind FUNCTION = ElementKind('FUNCTION', 12, "function"); static const ElementKind GENERIC_FUNCTION_TYPE = ElementKind( 'GENERIC_FUNCTION_TYPE', 13, 'generic function type', ); static const ElementKind GETTER = ElementKind('GETTER', 14, "getter"); static const ElementKind IMPORT = ElementKind( 'IMPORT', 15, "import directive", ); static const ElementKind LABEL = ElementKind('LABEL', 16, "label"); static const ElementKind LIBRARY = ElementKind('LIBRARY', 17, "library"); static const ElementKind LIBRARY_AUGMENTATION = ElementKind( 'LIBRARY_AUGMENTATION', 18, "library augmentation", ); static const ElementKind LOCAL_VARIABLE = ElementKind( 'LOCAL_VARIABLE', 19, "local variable", ); static const ElementKind METHOD = ElementKind('METHOD', 20, "method"); static const ElementKind MIXIN = ElementKind('MIXIN', 21, "mixin"); static const ElementKind NAME = ElementKind('NAME', 22, ""); static const ElementKind NEVER = ElementKind('NEVER', 23, ""); static const ElementKind PARAMETER = ElementKind( 'PARAMETER', 24, "parameter", ); static const ElementKind PART = ElementKind('PART', 25, "part"); static const ElementKind PREFIX = ElementKind('PREFIX', 26, "import prefix"); static const ElementKind RECORD = ElementKind('RECORD', 27, "record"); static const ElementKind SETTER = ElementKind('SETTER', 28, "setter"); static const ElementKind TOP_LEVEL_VARIABLE = ElementKind( 'TOP_LEVEL_VARIABLE', 29, "top level variable", ); static const ElementKind FUNCTION_TYPE_ALIAS = ElementKind( 'FUNCTION_TYPE_ALIAS', 30, "function type alias", ); static const ElementKind TYPE_PARAMETER = ElementKind( 'TYPE_PARAMETER', 31, "type parameter", ); static const ElementKind TYPE_ALIAS = ElementKind( 'TYPE_ALIAS', 32, "type alias", ); static const ElementKind UNIVERSE = ElementKind('UNIVERSE', 33, ""); static const List values = [ CLASS, CLASS_AUGMENTATION, COMPILATION_UNIT, CONSTRUCTOR, DYNAMIC, ENUM, ERROR, EXPORT, EXTENSION, EXTENSION_TYPE, FIELD, FUNCTION, GENERIC_FUNCTION_TYPE, GETTER, IMPORT, LABEL, LIBRARY, LOCAL_VARIABLE, METHOD, MIXIN, NAME, NEVER, PARAMETER, PART, PREFIX, RECORD, 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 compareTo(ElementKind other) => ordinal - other.ordinal; @override String toString() => name; } /// 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/element/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 ElementVisitor2 { R? visitClassElement(ClassElement element); R? visitConstructorElement(ConstructorElement element); R? visitEnumElement(EnumElement element); R? visitExtensionElement(ExtensionElement element); R? visitExtensionTypeElement(ExtensionTypeElement element); R? visitFieldElement(FieldElement element); R? visitFieldFormalParameterElement(FieldFormalParameterElement element); R? visitFormalParameterElement(FormalParameterElement element); R? visitGenericFunctionTypeElement(GenericFunctionTypeElement element); R? visitGetterElement(GetterElement element); R? visitLabelElement(LabelElement element); R? visitLibraryElement(LibraryElement element); R? visitLocalFunctionElement(LocalFunctionElement element); R? visitLocalVariableElement(LocalVariableElement element); R? visitMethodElement(MethodElement element); R? visitMixinElement(MixinElement element); R? visitMultiplyDefinedElement(MultiplyDefinedElement element); R? visitPrefixElement(PrefixElement element); R? visitSetterElement(SetterElement element); R? visitSuperFormalParameterElement(SuperFormalParameterElement element); R? visitTopLevelFunctionElement(TopLevelFunctionElement element); R? visitTopLevelVariableElement(TopLevelVariableElement element); R? visitTypeAliasElement(TypeAliasElement element); R? visitTypeParameterElement(TypeParameterElement element); } /// An element that represents an enum. /// /// Clients may not extend, implement or mix-in this class. abstract class EnumElement implements InterfaceElement { /// The constants defined by the enum. List get constants; @override EnumFragment get firstFragment; @override List get fragments; } /// The portion of an [EnumElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class EnumFragment implements InterfaceFragment { /// The constants defined by this fragment of the enum. List get constants; @override EnumElement get element; @override EnumFragment? get nextFragment; @override EnumFragment? get previousFragment; } /// 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 { @override ExecutableElement get baseElement; @override ExecutableFragment get firstFragment; @override List get fragments; /// Whether the executable element did not have an explicit return type /// specified for it in the original source. bool get hasImplicitReturnType; /// Whether the executable element is abstract. /// /// Executable elements are abstract if they are not external, and have no /// body. bool get isAbstract; /// Whether the executable element is an extension type member. bool get isExtensionTypeMember; /// Whether the executable element is external. /// /// Executable elements are external if they are explicitly marked as such /// using the 'external' keyword. bool get isExternal; /// Whether the 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; } /// The portion of an [ExecutableElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class ExecutableFragment implements FunctionTypedFragment { @override ExecutableElement get element; /// Whether the body is marked as being asynchronous. bool get isAsynchronous; /// Whether the element is an augmentation. /// /// Executable elements are augmentations if they are explicitly marked as /// such using the 'augment' modifier. bool get isAugmentation; /// Whether the body is marked as being a generator. bool get isGenerator; /// Whether the body is marked as being synchronous. bool get isSynchronous; /// Whether this fragment is synthetic. /// /// A synthetic fragment is a fragment 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. @Deprecated('Use isOriginX instead') bool get isSynthetic; @override LibraryFragment get libraryFragment; @override ExecutableFragment? get nextFragment; @override ExecutableFragment? get previousFragment; } /// An extension. /// /// Clients may not extend, implement or mix-in this class. abstract class ExtensionElement implements InstanceElement { /// The type that is extended by this extension. DartType get extendedType; @override ExtensionFragment get firstFragment; @override List get fragments; } /// The portion of an [ExtensionElement] contributed by a single /// declaration. /// /// Clients may not extend, implement, or mix-in this class. abstract class ExtensionFragment implements InstanceFragment { @override ExtensionElement get element; @override ExtensionFragment? get nextFragment; /// The offset of the extension name. /// /// If the extension has no name, this is the offset of the `extension` /// keyword. @override int get offset; @override ExtensionFragment? get previousFragment; } /// An extension type. /// /// Clients may not extend, implement or mix-in this class. abstract class ExtensionTypeElement implements InterfaceElement { @override ExtensionTypeFragment get firstFragment; @override List get fragments; /// The primary constructor of this extension. ConstructorElement get primaryConstructor; /// The representation of this extension. FieldElement get representation; /// The extension type erasure, obtained by recursively replacing every /// subterm which is an extension type by the corresponding representation /// type. DartType get typeErasure; } /// The portion of an [ExtensionTypeElement] contributed by a single /// declaration. /// /// Clients may not extend, implement, or mix-in this class. abstract class ExtensionTypeFragment implements InterfaceFragment { @override ExtensionTypeElement get element; @override ExtensionTypeFragment? get nextFragment; @override ExtensionTypeFragment? get previousFragment; } /// A field defined within a class, enum, extension, or mixin. /// /// Clients may not extend, implement or mix-in this class. abstract class FieldElement implements PropertyInducingElement { @override FieldElement get baseElement; /// The declaring formal parameter, if created from one. @experimental FieldFormalParameterElement? get declaringFormalParameter; @override InstanceElement get enclosingElement; @override FieldFragment get firstFragment; @override List get fragments; /// Whether the field is abstract. /// /// Executable fields are abstract if they are declared with the `abstract` /// keyword. bool get isAbstract; /// Whether the field was explicitly marked as being covariant. bool get isCovariant; /// Whether the element is an enum constant. bool get isEnumConstant; /// Whether the field was explicitly marked as being external. bool get isExternal; /// Whether the field is from a declaring formal parameter. /// /// When this is `true`, [isOriginDeclaration], [isOriginGetterSetter], /// and [isOriginEnumValues] are `false`. bool get isOriginDeclaringFormalParameter; /// Whether the field is the `values` field of an enum. /// /// When this is `true`, [isOriginDeclaration], [isOriginGetterSetter], /// and [isOriginDeclaringFormalParameter] are `false`. bool get isOriginEnumValues; /// Whether the field is an extension type representation field, created only /// for recovery purposes, and does not correspond to a formal parameter. bool get isOriginExtensionTypeRecoveryRepresentation; /// Whether the field can be type promoted. bool get isPromotable; } /// A field formal parameter defined within a constructor element. /// /// Clients may not extend, implement or mix-in this class. abstract class FieldFormalParameterElement implements FormalParameterElement { /// The field element associated with this field formal parameter. /// /// Returns `null` if the parameter references a field that doesn't exist. FieldElement? get field; @override FieldFormalParameterFragment get firstFragment; @override List get fragments; /// Whether this is a declaring formal parameter. @experimental bool get isDeclaring; /// If this field formal parameter is a named parameter with a private name, /// the original private name. /// /// In that case, [name] is the corresponding public name for the parameter /// and [privateName] is the original declared name. Otherwise (the declared /// name wasn't private or was private but has no corresponding public name), /// then, [privateName] is `null`. /// /// The private name is used for: /// /// * Accessing the parameter in the initializer list. /// /// * Finding the corresponding instance variable. /// /// * Referring to the parameter in the constructor's doc comment. @experimental String? get privateName; } /// The portion of a [FieldFormalParameterElement] contributed by a single /// declaration. /// /// Clients may not extend, implement, or mix-in this class. abstract class FieldFormalParameterFragment implements FormalParameterFragment { @override FieldFormalParameterElement get element; @override FieldFormalParameterFragment? get nextFragment; @override FieldFormalParameterFragment? get previousFragment; /// If this field formal parameter is a named parameter with a private name, /// the original private name. /// /// In that case, [name] is the corresponding public name for the parameter. @experimental String? get privateName; } /// The portion of a [FieldElement] contributed by a single declaration. /// /// Clients may not extend, implement, or mix-in this class. abstract class FieldFragment implements PropertyInducingFragment { @override FieldElement get element; @override FieldFragment? get nextFragment; /// The offset of the field name. /// /// If the field declaration is implicit, this is the offset of the name of /// the containing element (e.g., for the `values` field of an enum, this is /// the offset of the enum name). @override int get offset; @override FieldFragment? get previousFragment; } /// A formal parameter defined by an executable element. /// /// Clients may not extend, implement or mix-in this class. abstract class FormalParameterElement implements VariableElement, LocalElement { @override FormalParameterElement get baseElement; /// The code of the default value. /// /// Returns `null` if no default value. String? get defaultValueCode; @override FormalParameterFragment get firstFragment; /// The formal parameters defined by this formal parameter. /// /// A parameter will only define other parameters if it is a function typed /// formal parameter. List get formalParameters; @override List get fragments; /// Whether the parameter has a default value. bool get hasDefaultValue; /// Whether the parameter is covariant, meaning it is allowed to have a /// narrower type in an override. bool get isCovariant; /// Whether the parameter is an initializing formal parameter. bool get isInitializingFormal; /// Whether the parameter is a named parameter. /// /// Named parameters that are annotated with the `@required` annotation are /// considered optional. Named parameters that are annotated with the /// `required` syntax are considered required. bool get isNamed; /// Whether the parameter is an optional parameter. /// /// Optional parameters can either be positional or named. Named parameters /// that are annotated with the `@required` annotation are considered /// optional. Named parameters that are annotated with the `required` syntax /// are considered required. bool get isOptional; /// Whether the parameter is both an optional and named parameter. /// /// Named parameters that are annotated with the `@required` annotation are /// considered optional. Named parameters that are annotated with the /// `required` syntax are considered required. bool get isOptionalNamed; /// Whether the parameter is both an optional and positional parameter. bool get isOptionalPositional; /// Whether the parameter is a positional parameter. /// /// Positional parameters can either be required or optional. bool get isPositional; /// Whether the parameter is either a required positional parameter, or a /// named parameter with the `required` keyword. /// /// Note: the presence or absence of the `@required` annotation does not /// change the meaning of this getter. The parameter `{@required int x}` /// will return `false` and the parameter `{@required required int x}` /// will return `true`. bool get isRequired; /// Whether the parameter is both a required and named parameter. /// /// Named parameters that are annotated with the `@required` annotation are /// considered optional. Named parameters that are annotated with the /// `required` syntax are considered required. bool get isRequiredNamed; /// Whether the parameter is both a required and positional parameter. bool get isRequiredPositional; /// Whether the parameter is a super formal parameter. bool get isSuperFormal; /// The type parameters defined by this parameter. /// /// A parameter will only define type parameters if it is a function typed /// parameter. List get typeParameters; /// Appends the type, name and possibly the default value of this parameter /// to the given [buffer]. void appendToWithoutDelimiters(StringBuffer buffer); } /// The portion of a [FormalParameterElement] contributed by a single /// declaration. /// /// Clients may not extend, implement, or mix-in this class. abstract class FormalParameterFragment implements VariableFragment, LocalFragment { @override FormalParameterElement get element; @override FormalParameterFragment? get nextFragment; /// The offset of the parameter name. /// /// If the parameter is implicit (because it's the parameter of an implicit /// setter that's induced by a field or top level variable declaration), this /// is the offset of the field or top level variable name. @override int get offset; @override FormalParameterFragment? get previousFragment; } /// A fragment that wholly or partially defines an element. /// /// When an element is defined by one or more fragments, those fragments form an /// augmentation chain. This is represented in the element model as a /// doubly-linked list. /// /// In valid code the first fragment is the base declaration and all of the /// other fragments are augmentations. This can be violated in the element model /// in the case of invalid code, such as when an augmentation is declared even /// though there is no base declaration. abstract class Fragment { /// The children of this fragment. /// /// There is no guarantee of the order in which the children will be returned. /// In particular, they are not guaranteed to be in lexical order. List get children; /// The content of the documentation comment (including delimiters) for this /// fragment. /// /// Returns `null` if the fragment doesn't have documentation. String? get documentationComment; /// The element composed from this fragment and possibly other fragments. Element get element; /// The fragment that either physically or logically encloses this fragment. /// /// Returns `null` if this fragment is the root fragment of a library because /// there are no fragments above the root fragment of a library. Fragment? get enclosingFragment; /// The library fragment that contains this fragment. /// /// This will be the fragment itself if it is a library fragment. LibraryFragment? get libraryFragment; /// The metadata associated with the fragment. /// /// The list will be empty if the fragment does not have any metadata. Metadata get metadata; /// The name of the fragment. /// /// Never empty. /// /// If a fragment, e.g. an [ExtensionFragment], does not have a name, /// then the name is `null`. /// /// For an unnamed [ConstructorFragment] the name is `new`, but [nameOffset] /// is `null`. If there is an explicit `ClassName.new`, the name is also /// `new`, and [nameOffset] is not `null`. For a synthetic default unnamed /// [ConstructorElement] there is always a synthetic [ConstructorFragment] /// with the name `new`, and [nameOffset] is `null`. /// /// If the fragment declaration node does not have the name specified, and /// the parser inserted a synthetic token, then the name is `null`, and /// [nameOffset] is `null`. /// /// For a synthetic [GetterFragment] or [SetterFragment] the name is the /// name of the corresponding non-synthetic [PropertyInducingFragment], /// which is usually not `null`, but could be. And `nameOffset2` is `null` /// for such synthetic fragments. /// /// For a [SetterFragment] this is the identifier, without `=` at the end. /// /// For both unary and binary `-` operator this is `-`. String? get name; /// The offset of the [name] of this element. /// /// If a fragment, e.g. an [ExtensionFragment], does not have a name, /// then the name offset is `null`. /// /// If the fragment declaration node does not have the name specified, and /// the parser inserted a synthetic token, then the name is `null`, and /// the name offset is `null`. /// /// For a synthetic fragment, e.g. [ConstructorFragment] the name offset /// is `null`. int? get nameOffset; /// The next fragment in the augmentation chain. /// /// Returns `null` if this is the last fragment in the chain. Fragment? get nextFragment; /// A canonical offset to the fragment within the source file. /// /// If the fragment has a name, this is equal to [nameOffset]. Otherwise it /// is the offset of some character within the fragment; see subclasses for /// more information. /// /// If the fragment is of a kind that would normally have a name, but there is /// no name due to error recovery, then the exact offset is unspecified, but /// is guaranteed to be within the span of the tokens that constitute the /// fragment's declaration. int get offset; /// The previous fragment in the augmentation chain. /// /// Returns `null` if this is the first fragment in the chain. Fragment? get previousFragment; } /// 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 { @override FunctionTypedFragment get firstFragment; /// The formal parameters defined by this element. List get formalParameters; @override List get fragments; /// The return type defined by this element. DartType get returnType; /// The type defined by this element. FunctionType get type; } /// The portion of a [FunctionTypedElement] contributed by a single declaration. /// /// Clients may not extend, implement, or mix-in this class. abstract class FunctionTypedFragment implements TypeParameterizedFragment { @override FunctionTypedElement get element; /// The formal parameters defined by this fragment. List get formalParameters; @override FunctionTypedFragment? get nextFragment; @override FunctionTypedFragment? get previousFragment; } /// The pseudo-declaration that defines a generic function type. /// /// Clients may not extend, implement, or mix-in this class. abstract class GenericFunctionTypeElement implements FunctionTypedElement { @override GenericFunctionTypeFragment get firstFragment; @override List get fragments; } /// The portion of a [GenericFunctionTypeElement] coming from a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class GenericFunctionTypeFragment implements FunctionTypedFragment { @override GenericFunctionTypeElement get element; @override GenericFunctionTypeFragment? get nextFragment; /// The offset of the generic function type. /// /// Generic function types are not named, so the offset is the offset of the /// first token in the generic function type. @override int get offset; @override GenericFunctionTypeFragment? get previousFragment; } /// A getter. /// /// Getters can either be defined explicitly or they can be induced by either a /// top-level variable or a field. Induced getters are synthetic. /// /// Clients may not extend, implement or mix-in this class. abstract class GetterElement implements PropertyAccessorElement { @override GetterElement get baseElement; /// The setter that corresponds to (has the same name as) this getter, or /// `null` if there is no corresponding setter. SetterElement? get correspondingSetter; @override GetterFragment get firstFragment; @override List get fragments; } /// The portion of a [GetterElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class GetterFragment implements PropertyAccessorFragment { @override GetterElement get element; @override GetterFragment? get nextFragment; /// The offset of the getter name. /// /// If the getter is implicit (because it's induced by a field or top level /// variable declaration), this is the offset of the field or top level /// variable name. @override int get offset; @override GetterFragment? get previousFragment; } /// 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 { /// The names that are not to be made visible in the importing library even /// if they are defined in the imported library. List get hiddenNames; } /// An element whose instance members can refer to `this`. /// /// Clients may not extend, implement or mix-in this class. abstract class InstanceElement implements TypeParameterizedElement { @override InstanceElement get baseElement; @override LibraryElement get enclosingElement; /// The fields declared in this element. List get fields; @override InstanceFragment get firstFragment; @override List get fragments; /// The getters declared in this element. List get getters; /// The methods declared in this element. List get methods; /// The setters declared in this element. List get setters; /// The type of a `this` expression. DartType get thisType; /// Returns the field from [fields] that has the given [name]. FieldElement? getField(String name); /// Returns the getter from [getters] that has the given [name]. GetterElement? getGetter(String name); /// Returns the method from [methods] that has the given [name]. MethodElement? getMethod(String name); /// Returns the setter from [setters] that has the given [name]. SetterElement? getSetter(String name); /// Returns the element representing the getter that results from looking up /// the given [name] 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 17.18 Lookup. GetterElement? lookUpGetter({ required String name, required LibraryElement library, }); /// Returns the element representing the method that results from looking up /// the given [name] 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 17.18 Lookup. MethodElement? lookUpMethod({ required String name, required LibraryElement library, }); /// Returns the element representing the setter that results from looking up /// the given [name] 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 17.18 Lookup. SetterElement? lookUpSetter({ required String name, required LibraryElement library, }); } /// The portion of an [InstanceElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class InstanceFragment implements TypeParameterizedFragment { @override InstanceElement get element; @override LibraryFragment? get enclosingFragment; /// The fields declared in this fragment. List get fields; /// The getters declared in this fragment. List get getters; /// Whether the fragment is an augmentation. /// /// If `true`, the declaration has the explicit `augment` modifier. bool get isAugmentation; @override LibraryFragment get libraryFragment; /// The methods declared in this fragment. List get methods; @override InstanceFragment? get nextFragment; @override InstanceFragment? get previousFragment; /// The setters declared in this fragment. List get setters; } /// An element that defines an [InterfaceType]. /// /// Clients may not extend, implement or mix-in this class. abstract class InterfaceElement implements InstanceElement { /// All the supertypes defined for this element and its supertypes. /// /// This includes superclasses, mixins, interfaces, and superclass /// constraints. List get allSupertypes; /// The constructors defined for this element. /// /// The list is empty for [MixinElement]. List get constructors; @override InterfaceFragment get firstFragment; @override List get fragments; /// Returns a map of all concrete members that this type inherits from /// superclasses and mixins, keyed by the member's [Name]. /// /// Members declared in this type have no effect on the map. This means that: /// - If this type contains a member named `foo`, but none of its superclasses /// or mixins contains a member named `foo`, then there will be no entry for /// `foo` in the map. /// - If this type contains a member named `foo`, and one of its superclasses /// or mixins contains a member named `foo`, then there will be an entry for /// `foo` in this map, pointing to the declaration inherited from the /// superclass or mixin. /// /// This method is potentially expensive, since it needs to consider all /// possible inherited names. If you only need to look up a certain specific /// name (or names), use [getInheritedConcreteMember] instead. Map get inheritedConcreteMembers; /// Returns a map of all members that this type inherits from supertypes via /// `extends`, `with`, `implements`, or `on` clauses, keyed by the member's /// [Name]. /// /// Members declared in this type have no effect on the map. This means that: /// - If this type contains a member named `foo`, but none of its supertypes /// contains a member named `foo`, then there will be no entry for `foo` in /// the map. /// - If this type contains a member named `foo`, and one of its supertypes /// contains a member named `foo`, then there will be an entry for `foo` in /// this map, pointing to the declaration inherited from the supertype. /// /// This method is potentially expensive, since it needs to consider all /// possible inherited names. If you only need to look up a certain specific /// name (or names), use [getInheritedMember] instead. Map get inheritedMembers; /// Returns a map of all members in the type's interface, keyed by the /// member's [Name]. /// /// Note that some names are not declared directly on [thisType], but are /// inherited from supertypes. /// /// This method is potentially expensive, since it needs to consider all /// possible interface names. If you only need to look up a certain specific /// name (or names), use [getInterfaceMember] instead. Map get interfaceMembers; /// The interfaces that are implemented by this class. /// /// Note: 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 get interfaces; /// The mixins that are applied to the class being extended in order to /// derive the superclass of this class. /// /// [ClassElement] and [EnumElement] can have mixins. /// /// [MixinElement] cannot have mixins, so an empty list is returned. /// /// Note: 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 get mixins; /// The superclass of this element. /// /// For [ClassElement] returns `null` only if this class is `Object`. If the /// superclass is not explicitly specified, or the superclass cannot be /// resolved, then the implicit superclass `Object` is returned. /// /// For [EnumElement] returns `Enum` from `dart:core`. /// /// For [MixinElement] always returns `null`. /// /// Note: 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 thisType; /// The unnamed constructor declared directly in this class. /// /// If the class does not declare any constructors, a synthetic default /// constructor will be returned. ConstructorElement? get unnamedConstructor; /// Returns the most specific member with the given [name] that this type /// inherits from a superclass or mixin. /// /// Returns `null` if no member is inherited. /// /// This method is semantically equivalent to calling /// [inheritedConcreteMembers] and then using the `[]` operator, but it /// potentially has better performance, since it does not need to consider all /// possible inherited names. ExecutableElement? getInheritedConcreteMember(Name name); /// Returns the most specific member with the given [name] that this type /// inherits from a supertype via an `extends`, `with`, `implements`, or `on` /// clause. /// /// Returns `null` if no member is inherited because the member is not /// declared at all, or because there is no the most specific signature. /// /// This method is semantically equivalent to calling [inheritedMembers] and /// then using the `[]` operator, but it potentially has better performance, /// since it does not need to consider all possible inherited names. ExecutableElement? getInheritedMember(Name name); /// Returns the most specific member with the given [name] in this type's /// interface. /// /// Returns `null` if there is no member with the given [name] in this type's /// interface, either because the member is not declared at all, or because of /// a conflict between inherited members. /// /// This method is semantically equivalent to calling [interfaceMembers] and /// then using the `[]` operator, but it potentially has better performance, /// since it does not need to consider all possible interface names. ExecutableElement? getInterfaceMember(Name name); /// Returns the constructor from [constructors] that has the given [name]. ConstructorElement? getNamedConstructor(String name); /// Returns all members of mixins, superclasses, and interfaces that a member /// with the given [name], defined in this element, would override; or `null` /// if no members would be overridden. /// /// Transitive overrides are not included unless there is a direct path to /// them. For example, if classes `A`, `B`, and `C` are defined as follows: /// /// class A { void m() {} } /// class B extends A { void m() {} } /// class C extends B { void m() {} } /// /// Then a [getOverridden] query for name `m` on class `C` would return just a /// single result: the element for `B.m`. /// /// However, if the example were changed so that `class C` both `extends B` /// *and* `implements A`, then a list containing both `A.m` and `B.m` would be /// returned. List? getOverridden(Name name); /// Create the [InterfaceType] for this element with the given /// [typeArguments] and [nullabilitySuffix]. InterfaceType instantiate({ required List typeArguments, required NullabilitySuffix nullabilitySuffix, }); /// Returns 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: ///
/// The result of looking up method m in class C with respect to /// library L is: If C declares an instance method named /// m that is accessible to L, then that method is the result of /// the lookup. Otherwise, if C has a superclass S, then the /// result of the lookup is the result of looking up method m in /// S with respect to L. Otherwise, we say that the lookup has /// failed. ///
// TODO(scheglov): Deprecate and remove it. MethodElement? lookUpConcreteMethod( String methodName, LibraryElement library, ); /// Returns 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: ///
/// The result of looking up method m in class C with respect to /// library L is: If C declares an instance method named /// m that is accessible to L, then that method is the result of /// the lookup. Otherwise, if C has a superclass S, then the /// result of the lookup is the result of looking up method m in /// S with respect to L. Otherwise, we say that the lookup has /// failed. ///
MethodElement? lookUpInheritedMethod({ required String methodName, required LibraryElement library, }); } /// The portion of an [InterfaceElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class InterfaceFragment implements InstanceFragment { /// The constructors declared in this fragment. /// /// The list is empty for [MixinFragment]. List get constructors; @override InterfaceElement get element; @override InterfaceFragment? get nextFragment; @override InterfaceFragment? get previousFragment; } /// A pattern variable that is a join of other pattern variables, created /// for a logical-or patterns, or shared `case` bodies in `switch` statements. /// /// Clients may not extend, implement or mix-in this class. abstract class JoinPatternVariableElement implements PatternVariableElement { @override JoinPatternVariableFragment get firstFragment; @override List get fragments; /// Whether the [variables] are consistent. /// /// The variables are consistent if they are present in all branches, and have /// the same type and finality. bool get isConsistent; /// The variables that join into this variable. List get variables; } /// The portion of a [JoinPatternVariableElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class JoinPatternVariableFragment implements PatternVariableFragment { @override JoinPatternVariableElement get element; @override JoinPatternVariableFragment? get nextFragment; /// The offset of the first variable in the join. @override int get offset; @override JoinPatternVariableFragment? get previousFragment; } /// A label associated with a statement. /// /// Clients may not extend, implement or mix-in this class. abstract class LabelElement implements Element { @override // TODO(brianwilkerson): We shouldn't be inheriting this member. ExecutableElement? get enclosingElement; @override LabelFragment get firstFragment; @override List get fragments; @override LibraryElement get library; } /// The portion of a [LabelElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class LabelFragment implements Fragment { @override LabelElement get element; @override LabelFragment? get nextFragment; @override LabelFragment? get previousFragment; } /// A library. /// /// Clients may not extend, implement or mix-in this class. abstract class LibraryElement implements Element { /// The classes defined in this library. /// /// There is no guarantee of the order in which the classes will be returned. /// In particular, they are not guaranteed to be in lexical order. List get classes; /// The entry point for this library. /// /// Returns `null` if this library doesn't have an entry point. /// /// The entry point is defined to be a zero, one, or two argument top-level /// function whose name is `main`. TopLevelFunctionElement? get entryPoint; /// The enums defined in this library. /// /// There is no guarantee of the order in which the enums will be returned. /// In particular, they are not guaranteed to be in lexical order. List get enums; /// The libraries that are exported from this library. /// /// There is no guarantee of the order in which the libraries will be /// returned. In particular, they are not guaranteed to be in lexical order. // TODO(brianwilkerson): Consider removing this from the public API. It isn't // clear that it's useful, given that it ignores hide and show clauses. List get exportedLibraries; /// The export [Namespace] of this library. Namespace get exportNamespace; /// The extensions defined in this library. /// /// There is no guarantee of the order in which the extensions will be /// returned. In particular, they are not guaranteed to be in lexical order. List get extensions; /// The extension types defined in this library. /// /// There is no guarantee of the order in which the extension types will be /// returned. In particular, they are not guaranteed to be in lexical order. List get extensionTypes; /// The set of features available to this library. /// /// Determined by the combination of the language version for the enclosing /// package, enabled experiments, and the presence of a `// @dart` language /// version override comment at the top of the files that make up the library. FeatureSet get featureSet; @override LibraryFragment get firstFragment; /// The fragments this library consists of. /// /// This includes the defining fragment, and fragments included using the /// `part` directive. @override List get fragments; /// The getters defined in this library. /// /// There is no guarantee of the order in which the getters will be returned. /// In particular, they are not guaranteed to be in lexical order. List get getters; /// The identifier that uniquely identifies this element among the children /// of this element's parent. String get identifier; /// Whether the library is the `dart:async` library. bool get isDartAsync; /// Whether the library is the `dart:core` library. bool get isDartCore; /// Whether the library is part of the SDK. bool get isInSdk; /// Whether the library is created from a file that does not exist. bool get isOriginNotExistingFile; /// The language version for this library. LibraryLanguageVersion get languageVersion; @override LibraryElement get library; /// The element representing the synthetic function `loadLibrary`. /// /// Technically the function is implicitly defined for this library only if /// the library is imported using a deferred import, but the element is always /// defined for performance reasons. TopLevelFunctionElement get loadLibraryFunction; /// The mixins defined in this library. /// /// There is no guarantee of the order in which the mixins will be returned. /// In particular, they are not guaranteed to be in lexical order. List get mixins; /// The public [Namespace] of this library. Namespace get publicNamespace; /// The analysis session in which this library is defined. @override AnalysisSession get session; /// The setters defined in this library. /// /// There is no guarantee of the order in which the setters will be returned. /// In particular, they are not guaranteed to be in lexical order. List get setters; /// The functions defined in this library. /// /// There is no guarantee of the order in which the functions will be /// returned. In particular, they are not guaranteed to be in lexical order. List get topLevelFunctions; /// The top level variables defined in this library. /// /// There is no guarantee of the order in which the top level variables will /// be returned. In particular, they are not guaranteed to be in lexical /// order. List get topLevelVariables; /// The type aliases defined in this library. /// /// There is no guarantee of the order in which the type aliases will be /// returned. In particular, they are not guaranteed to be in lexical order. List get typeAliases; /// The [TypeProvider] that is used in this library. TypeProvider get typeProvider; /// The [TypeSystem] that is used in this library. TypeSystem get typeSystem; /// The canonical URI of the library. /// /// This is the same URI as `firstFragment.source.uri` returns. Uri get uri; /// Returns the class defined in this library that has the given [name]. ClassElement? getClass(String name); /// Returns the enum defined in this library that has the given [name]. EnumElement? getEnum(String name); /// Returns the extension defined in this library that has the given [name]. ExtensionElement? getExtension(String name); /// Returns the extension type defined in this library that has the /// given [name]. ExtensionTypeElement? getExtensionType(String name); /// Returns the getter defined in this library that has the given [name]. GetterElement? getGetter(String name); /// Returns the mixin defined in this library that has the given [name]. MixinElement? getMixin(String name); /// Returns the setter defined in this library that has the given [name]. SetterElement? getSetter(String name); /// Returns the function defined in this library that has the given [name]. TopLevelFunctionElement? getTopLevelFunction(String name); /// Returns the top-level variable defined in this library that has the /// given [name]. TopLevelVariableElement? getTopLevelVariable(String name); /// Returns the type alias defined in this library that has the given [name]. TypeAliasElement? getTypeAlias(String name); } /// An `export` directive within a library fragment. /// /// Clients may not extend, implement or mix-in this class. abstract class LibraryExport implements ElementDirective { /// The combinators that were specified as part of the `export` directive. /// /// The combinators are in the order in which they were specified. List get combinators; /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary]. LibraryElement? get exportedLibrary; /// The offset of the `export` keyword. int get exportKeywordOffset; } /// The portion of a [LibraryElement] coming from a single compilation unit. abstract class LibraryFragment implements Fragment { /// The extension elements accessible within this fragment. List get accessibleExtensions; /// The fragments of the classes declared in this fragment. List get classes; @override LibraryElement get element; @override LibraryFragment? get enclosingFragment; /// The fragments of the enums declared in this fragment. List get enums; /// The fragments of the extensions declared in this fragment. List get extensions; /// The fragments of the extension types declared in this fragment. List get extensionTypes; /// The fragments of the top-level functions declared in this fragment. List get functions; /// The fragments of the top-level getters declared in this fragment. List get getters; /// The libraries that are imported by this unit. /// /// This includes all of the libraries that are imported using a prefix, and /// those that are imported without a prefix. List get importedLibraries; /// The libraries exported by this unit. List get libraryExports; /// The libraries imported by this unit. List get libraryImports; /// The [LineInfo] for the fragment. LineInfo get lineInfo; /// The fragments of the mixins declared in this fragment. List get mixins; @override LibraryFragment? get nextFragment; /// If this is the first fragment in the library and the library has `library` /// declaration that specifies a name, the offset of the name; otherwise zero. @override int get offset; /// The `part` directives within this fragment. List get partIncludes; /// The prefixes used by [libraryImports]. /// /// Each prefix can be used in more than one `import` directive. List get prefixes; @override LibraryFragment? get previousFragment; /// The scope used to resolve names within the fragment. /// /// It includes all of the elements that are declared in the library, and all /// of the elements imported into this fragment or parent fragments. Scope get scope; /// The fragments of the top-level setters declared in this fragment. List get setters; /// The source associated with this fragment. Source get source; /// The fragments of the top-level variables declared in this fragment. List get topLevelVariables; /// The fragments of the type aliases declared in this fragment. List get typeAliases; } /// An `import` directive within a library fragment. /// /// Clients may not extend, implement or mix-in this class. abstract class LibraryImport implements ElementDirective { /// The combinators that were specified as part of the `import` directive. /// /// The combinators are in the order in which they were specified. List get combinators; /// The [LibraryElement], if [uri] is a [DirectiveUriWithLibrary]. LibraryElement? get importedLibrary; /// The offset of the `import` keyword. int get importKeywordOffset; /// Whether this import is synthetic. /// /// A synthetic import is an import that is not represented in the source /// code explicitly, but is implied by the source code. This only happens for /// an implicit import of `dart:core`. bool get isSynthetic; /// The [Namespace] that this directive contributes to the containing library. Namespace get namespace; /// The prefix fragment that was specified as part of the import directive. /// /// Returns `null` if there was no prefix specified. PrefixFragment? get prefix; } class LibraryLanguageVersion { /// The version for the whole package that contains this library. final Version package; /// The version specified using `@dart` override, `null` if absent or invalid. final Version? override; LibraryLanguageVersion({required this.package, required this.override}); /// The effective language version for the library. Version get effective { return override ?? package; } } /// An element that can be (but is not required to be) defined within a method /// or function (an [ExecutableFragment]). /// /// Clients may not extend, implement or mix-in this class. abstract class LocalElement implements Element {} /// The portion of an [LocalElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class LocalFragment implements Fragment {} /// A local function. /// /// This can be either 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 LocalFunctionElement implements ExecutableElement, LocalElement { @override LocalFunctionFragment get firstFragment; @override List get fragments; } /// The portion of a [LocalFunctionElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class LocalFunctionFragment implements ExecutableFragment, LocalFragment { @override LocalFunctionElement get element; @override LocalFunctionFragment? get nextFragment; /// The offset of the local function name. /// /// If the local function has no name (because it's a function expression), /// this is the offset of the `(` that begins the function expression. @override int get offset; @override LocalFunctionFragment? get previousFragment; } /// A local variable. /// /// Clients may not extend, implement or mix-in this class. abstract class LocalVariableElement implements VariableElement, LocalElement { @override LocalVariableElement get baseElement; @override LocalVariableFragment get firstFragment; @override List get fragments; } /// The portion of a [LocalVariableElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class LocalVariableFragment implements VariableFragment, LocalFragment { @override LocalVariableElement get element; @override LocalVariableFragment? get nextFragment; @override LocalVariableFragment? get previousFragment; } /// The metadata (annotations) associated with an element or fragment. abstract class Metadata { /// The annotations associated with the associated element or fragment. /// /// If the metadata is associated with an element that has fragments, the list /// will include all of the annotations from all of the fragments. /// /// The list will be empty if the associated element or fragment does not have /// any annotations or if the library containing the holder has not yet been /// fully resolved. List get annotations; /// Whether the receiver has an annotation of the form `@alwaysThrows`. bool get hasAlwaysThrows; /// Whether the receiver has an annotation of the form `@awaitNotRequired`. bool get hasAwaitNotRequired; /// Whether the receiver has an annotation of the form `@deprecated`, /// `@Deprecated('..')`, or any other `Deprecated` constructor. bool get hasDeprecated; /// Whether the receiver has an annotation of the form `@doNotStore`. bool get hasDoNotStore; /// Whether the receiver has an annotation of the form `@doNotSubmit`. bool get hasDoNotSubmit; /// Whether the receiver has an annotation of the form `@experimental`. bool get hasExperimental; /// Whether the receiver has an annotation of the form `@factory`. bool get hasFactory; /// Whether the receiver has an annotation of the form `@immutable`. bool get hasImmutable; /// Whether the receiver has an annotation of the form `@internal`. bool get hasInternal; /// Whether the receiver has an annotation of the form `@isTest`. bool get hasIsTest; /// Whether the receiver has an annotation of the form `@isTestGroup`. bool get hasIsTestGroup; /// Whether the receiver has an annotation of the form `@JS(..)`. bool get hasJS; /// Whether the receiver has an annotation of the form `@literal`. bool get hasLiteral; /// Whether the receiver has an annotation of the form `@mustBeConst`. bool get hasMustBeConst; /// Whether the receiver has an annotation of the form `@mustBeOverridden`. bool get hasMustBeOverridden; /// Whether the receiver has an annotation of the form `@mustCallSuper`. bool get hasMustCallSuper; /// Whether the receiver has an annotation of the form `@nonVirtual`. bool get hasNonVirtual; /// Whether the receiver has an annotation of the form `@optionalTypeArgs`. bool get hasOptionalTypeArgs; /// Whether the receiver has an annotation of the form `@override`. bool get hasOverride; /// Whether the receiver has an annotation of the form `@protected`. bool get hasProtected; /// Whether the receiver has an annotation of the form `@redeclare`. bool get hasRedeclare; /// Whether the receiver has an annotation of the form `@reopen`. bool get hasReopen; /// Whether the receiver has an annotation of the form `@required`. bool get hasRequired; /// Whether the receiver has an annotation of the form `@sealed`. bool get hasSealed; /// Whether the receiver has an annotation of the form `@useResult` /// or `@UseResult('..')`. bool get hasUseResult; /// Whether the receiver has an annotation of the form `@visibleForOverriding`. bool get hasVisibleForOverriding; /// Whether the receiver has an annotation of the form `@visibleForTemplate`. bool get hasVisibleForTemplate; /// Whether the receiver has an annotation of the form `@visibleForTesting`. bool get hasVisibleForTesting; /// Whether the receiver has an annotation of the form /// `@visibleOutsideTemplate`. bool get hasVisibleOutsideTemplate; /// Whether the receiver has an annotation of the form `@widgetFactory`. bool get hasWidgetFactory; } /// A method. /// /// The method can be either an instance method, an operator, or a static /// method. /// /// Clients may not extend, implement or mix-in this class. abstract class MethodElement implements ExecutableElement { /// 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 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"; @override MethodElement get baseElement; @override MethodFragment get firstFragment; @override List get fragments; /// Whether the method defines an operator. /// /// The test might 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; /// Whether the method is from an explicit [MethodDeclaration]. /// /// When this is `true`, [isOriginInterface] is `false`. bool get isOriginDeclaration; /// Whether the method is created while building interface. /// /// When this is `true`, [isOriginDeclaration] is `false`. bool get isOriginInterface; } /// The portion of a [MethodElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class MethodFragment implements ExecutableFragment { @override MethodElement get element; @override InstanceFragment? get enclosingFragment; @override MethodFragment? get nextFragment; @override MethodFragment? get previousFragment; } /// An element that represents a mixin. /// /// Clients may not extend, implement or mix-in this class. abstract class MixinElement implements InterfaceElement { @override MixinFragment get firstFragment; @override List get fragments; /// Whether the mixin is a base mixin. /// /// A mixin is a base mixin if it has an explicit `base` modifier. /// The base modifier allows a mixin to be mixed in, but not implemented. bool get isBase; /// Whether the mixin can be implemented by declarations outside of its /// library. bool get isImplementableOutside; /// The superclass constraints defined for this mixin. /// /// If the declaration does not have an `on` clause, then the list will /// contain the type for the class `Object`. /// /// Note: 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 get superclassConstraints; } /// The portion of a [PrefixElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class MixinFragment implements InterfaceFragment { @override MixinElement get element; @override MixinFragment? get nextFragment; @override MixinFragment? get previousFragment; /// The superclass constraints defined for this mixin. /// /// If the declaration does not have an `on` clause, then the list will /// contain the type for the class `Object`. /// /// Note: 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 get superclassConstraints; } /// 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 { /// The elements that were defined within the scope to have the same name. List get conflictingElements; @override MultiplyDefinedFragment get firstFragment; @override List get fragments; } /// The fragment for a [MultiplyDefinedElement]. /// /// It has no practical use, and exists for consistency, so that the /// corresponding element has a fragment. /// /// Clients may not extend, implement or mix-in this class. abstract class MultiplyDefinedFragment implements Fragment { @override MultiplyDefinedElement get element; @override Null get nextFragment; /// Always returns zero. @override int get offset; @override Null get previousFragment; } /// An object that controls how namespaces are combined. /// /// Clients may not extend, implement or mix-in this class. sealed class NamespaceCombinator { /// The offset of the character immediately following the last character of /// this node. int get end; /// The offset of the first character of this node. int get offset; } /// A 'part' directive within a library fragment. /// /// Clients may not extend, implement or mix-in this class. abstract class PartInclude implements ElementDirective { /// The [LibraryFragment], if [uri] is a [DirectiveUriWithUnit]. LibraryFragment? get includedFragment; /// The offset of the `part` keyword. int get partKeywordOffset; } /// A pattern variable. /// /// Clients may not extend, implement or mix-in this class. abstract class PatternVariableElement implements LocalVariableElement { @override PatternVariableFragment get firstFragment; @override List get fragments; /// The variable in which this variable joins with other pattern variables /// with the same name, in a logical-or pattern, or shared case scope. JoinPatternVariableElement? get join; } /// The portion of a [PatternVariableElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class PatternVariableFragment implements LocalVariableFragment { @override PatternVariableElement get element; /// The variable in which this variable joins with other pattern variables /// with the same name, in a logical-or pattern, or shared case scope. JoinPatternVariableFragment? get join; @override PatternVariableFragment? get nextFragment; @override PatternVariableFragment? get previousFragment; } /// 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 { /// There is no enclosing element for import prefixes, which are elements, /// but exist inside a single [LibraryFragment], not an element. @override Null get enclosingElement; @override PrefixFragment get firstFragment; @override List get fragments; /// The imports that share this prefix. List get imports; @override LibraryElement get library; /// The name lookup scope for this import prefix. /// /// It consists of elements imported into the enclosing library with this /// prefix. The namespace combinators of the import directives are taken /// into account. Scope get scope; } /// The portion of a [PrefixElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class PrefixFragment implements Fragment { @override PrefixElement get element; @override LibraryFragment? get enclosingFragment; /// Whether the [LibraryImport] is deferred. bool get isDeferred; @override PrefixFragment? get nextFragment; @override PrefixFragment? get previousFragment; } /// A getter or a setter. /// /// Property accessors can either be defined explicitly or they can be induced /// by either a top-level variable or a field. Induced property accessors are /// synthetic. /// /// Clients may not extend, implement or mix-in this class. abstract class PropertyAccessorElement implements ExecutableElement { @override PropertyAccessorElement get baseElement; @override Element get enclosingElement; @override PropertyAccessorFragment get firstFragment; @override List get fragments; /// Whether the property accessor is from an explicit [MethodDeclaration] or /// [FunctionDeclaration]. /// /// When this is `true`, [isOriginVariable] and [isOriginInterface] are `false`. bool get isOriginDeclaration; /// Whether the property accessor is created while building interface. /// /// When this is `true`, [isOriginDeclaration] and [isOriginVariable] /// are `false`. bool get isOriginInterface; /// Whether the property accessor is from a [FieldElement] or /// [TopLevelVariableElement]. /// /// When this is `true`, [isOriginDeclaration] and [isOriginInterface] are /// `false`. bool get isOriginVariable; @Deprecated('Use isOriginX instead') @override bool get isSynthetic; /// The field or top-level variable associated with this getter. /// /// If this getter was explicitly defined (is not synthetic) then the variable /// associated with it will be synthetic. PropertyInducingElement get variable; } /// The portion of a [GetterElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class PropertyAccessorFragment implements ExecutableFragment { @override PropertyAccessorElement get element; @override PropertyAccessorFragment? get nextFragment; @override PropertyAccessorFragment? get previousFragment; } /// 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 synthetic [GetterElement], /// possibly a synthetic [SetterElement. /// * Every explicit getter by a non-synthetic [GetterElement]. /// * Every explicit setter by a non-synthetic [SetterElement]. /// * 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 { @override PropertyInducingFragment get firstFragment; @override List get fragments; /// The getter associated with this variable. /// /// If this variable was explicitly defined (is not synthetic) then the /// getter associated with it will be synthetic. GetterElement? get getter; /// Whether any fragment of this variable has an initializer at declaration. bool get hasInitializer; /// Whether the property is from an explicit [FieldDeclaration], /// [TopLevelVariableDeclaration], or [EnumConstantDeclaration]. /// /// When this is `true`, [isOriginGetterSetter] is `false`. bool get isOriginDeclaration; /// Whether the property is from a getter or setter. /// /// When this is `true`, [isOriginGetterSetter] is `false`. bool get isOriginGetterSetter; @Deprecated('Use isOriginX instead') @override bool get isSynthetic; @override LibraryElement get library; /// The setter associated with this variable. /// /// Returns `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. SetterElement? get setter; } /// The portion of a [PropertyInducingElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class PropertyInducingFragment implements VariableFragment { @override PropertyInducingElement get element; /// Whether the variable has an initializer at declaration. bool get hasInitializer; /// Whether the element is an augmentation. /// /// Property inducing fragments are augmentations if they are explicitly /// marked as such using the 'augment' modifier. bool get isAugmentation; /// Whether this fragment is synthetic. /// /// A synthetic fragment is a fragment 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. @Deprecated('Use isOriginX instead') bool get isSynthetic; @override LibraryFragment get libraryFragment; @override PropertyInducingFragment? get nextFragment; @override PropertyInducingFragment? get previousFragment; } /// A setter. /// /// Setters can either be defined explicitly or they can be induced by either a /// top-level variable or a field. Induced setters are synthetic. /// /// Clients may not extend, implement or mix-in this class. abstract class SetterElement implements PropertyAccessorElement { @override SetterElement get baseElement; /// The getter that corresponds to (has the same name as) this setter, or /// `null` if there is no corresponding getter. GetterElement? get correspondingGetter; @override SetterFragment get firstFragment; @override List get fragments; } /// The portion of a [SetterElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class SetterFragment implements PropertyAccessorFragment { @override SetterElement get element; @override SetterFragment? get nextFragment; /// The offset of the setter name. /// /// If the setter is implicit (because it's induced by a field or top level /// variable declaration), this is the offset of the field or top level /// variable name. @override int get offset; @override SetterFragment? get previousFragment; } /// 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 { /// The names that are to be made visible in the importing library if they /// are defined in the imported library. List get shownNames; } /// A super formal parameter. /// /// Super formal parameters can only be defined within a constructor element. /// /// Clients may not extend, implement or mix-in this class. abstract class SuperFormalParameterElement implements FormalParameterElement { @override SuperFormalParameterFragment get firstFragment; @override List get fragments; /// The associated super-constructor parameter, from the super-constructor /// that is referenced by the implicit or explicit super-constructor /// invocation. /// /// Can be `null` for erroneous code - not existing super-constructor, /// no corresponding parameter in the super-constructor. FormalParameterElement? get superConstructorParameter; } /// The portion of a [SuperFormalParameterElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class SuperFormalParameterFragment implements FormalParameterFragment { @override SuperFormalParameterElement get element; @override SuperFormalParameterFragment? get nextFragment; @override SuperFormalParameterFragment? get previousFragment; } /// A top-level function. /// /// Clients may not extend, implement or mix-in this class. abstract class TopLevelFunctionElement implements ExecutableElement { /// The name of the function used as an entry point. static const String MAIN_FUNCTION_NAME = "main"; /// The name of the synthetic function defined for libraries that are /// deferred. static final String LOAD_LIBRARY_NAME = "loadLibrary"; @override TopLevelFunctionElement get baseElement; @override TopLevelFunctionFragment get firstFragment; @override List get fragments; /// Whether the function represents `identical` from the `dart:core` library. bool get isDartCoreIdentical; /// Whether the function is an entry point. /// /// A top-level function is an entry point if it has the name `main`. bool get isEntryPoint; /// Whether the function is from an explicit [FunctionDeclaration]. /// /// When this is `true`, [isOriginLoadLibrary] is `false`. bool get isOriginDeclaration; /// Whether the function is the synthetic `loadLibrary` function. /// /// When this is `true`, [isOriginDeclaration] is `false`. bool get isOriginLoadLibrary; } /// The portion of a [TopLevelFunctionElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class TopLevelFunctionFragment implements ExecutableFragment { @override TopLevelFunctionElement get element; @override TopLevelFunctionFragment? get nextFragment; @override TopLevelFunctionFragment? get previousFragment; } /// A top-level variable. /// /// Clients may not extend, implement or mix-in this class. abstract class TopLevelVariableElement implements PropertyInducingElement { @override TopLevelVariableElement get baseElement; @override TopLevelVariableFragment get firstFragment; @override List get fragments; /// Whether the field was explicitly marked as being external. bool get isExternal; } /// The portion of a [TopLevelVariableElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class TopLevelVariableFragment implements PropertyInducingFragment { @override TopLevelVariableElement get element; @override TopLevelVariableFragment? get nextFragment; @override TopLevelVariableFragment? get previousFragment; } /// A type alias (`typedef`). /// /// Clients may not extend, implement or mix-in this class. abstract class TypeAliasElement implements TypeParameterizedElement { /// The aliased type. /// /// If non-function type aliases feature is enabled for the enclosing library, /// this type might be just anything. If the feature is disabled, return /// a [FunctionType]. DartType get aliasedType; @override LibraryElement get enclosingElement; @override TypeAliasFragment get firstFragment; @override List get fragments; /// Returns the type resulting from instantiating this typedef with the given /// [typeArguments] and [nullabilitySuffix]. /// /// Note that this always instantiates the typedef itself, so for a /// [TypeAliasElement] the returned [DartType] might still be a generic /// type, with type formals. For example, if the typedef is: /// /// typedef F = void Function(T, U); /// /// then `F` will produce `void Function(int, U)`. DartType instantiate({ required List typeArguments, required NullabilitySuffix nullabilitySuffix, }); } /// The portion of a [TypeAliasElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class TypeAliasFragment implements TypeParameterizedFragment { @override TypeAliasElement get element; @override LibraryFragment? get enclosingFragment; @override Null get nextFragment; @override Null get previousFragment; } /// A type parameter. /// /// Clients may not extend, implement or mix-in this class. abstract class TypeParameterElement implements Element { @override TypeParameterElement get baseElement; /// The type representing the bound associated with this parameter. /// /// Returns `null` if this parameter does not have an explicit bound. Being /// able to distinguish between an implicit and explicit bound is needed by /// the instantiate to bounds algorithm.` DartType? get bound; @override TypeParameterFragment get firstFragment; @override List get fragments; /// Returns the [TypeParameterType] with the given [nullabilitySuffix] for /// this type parameter. TypeParameterType instantiate({required NullabilitySuffix nullabilitySuffix}); } /// The portion of a [TypeParameterElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class TypeParameterFragment implements Fragment { @override TypeParameterElement get element; @override TypeParameterFragment? get nextFragment; @override TypeParameterFragment? get previousFragment; } /// An element that has type parameters, such as a class, typedef, or method. /// /// Clients may not extend, implement or mix-in this class. abstract class TypeParameterizedElement implements Element { @override TypeParameterizedFragment get firstFragment; @override List get fragments; /// If the element defines a type, indicates whether the type may safely /// appear without explicit type arguments as the bounds of a type parameter /// declaration. /// /// If the element does not define a type, returns `true`. bool get isSimplyBounded; @override LibraryElement get library; /// The type parameters declared by this element directly. /// /// This does not include type parameters that are declared by any enclosing /// elements. List get typeParameters; } /// The portion of a [TypeParameterizedElement] contributed by a single /// declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class TypeParameterizedFragment implements Fragment { @override TypeParameterizedElement get element; @override TypeParameterizedFragment? get nextFragment; @override TypeParameterizedFragment? get previousFragment; /// The type parameters declared by this fragment directly. /// /// This does not include type parameters that are declared by any enclosing /// fragments. List get typeParameters; } /// 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 { /// The constant initializer for this constant variable, or the default /// value for this formal parameter. /// /// Is `null` if this variable is not a constant, or does not have the /// initializer or the default value specified. Expression? get constantInitializer; @override VariableFragment get firstFragment; @override List get fragments; /// Whether the variable element did not have an explicit type specified /// for it. bool get hasImplicitType; /// Whether the variable was declared with the 'const' modifier. bool get isConst; /// Whether the 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; /// Whether the variable uses late evaluation semantics. bool get isLate; /// Whether the 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; /// The declared type of this variable. DartType get type; /// Returns a representation of the value of this variable. /// /// If the value had not previously been computed, it will be computed as a /// result of invoking this method. /// /// Returns `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(); } /// The portion of a [VariableElement] contributed by a single declaration. /// /// Clients may not extend, implement or mix-in this class. abstract class VariableFragment implements Fragment { @override VariableElement get element; @override VariableFragment? get nextFragment; @override VariableFragment? get previousFragment; }