Index: pkg/analyzer/lib/src/dart/element/element.dart |
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart |
index b504fdbb1c5724da6e9352c55fe41ed8cd64995d..83ca661c96f52f4c2ae2fe0801fda88a1e6fda43 100644 |
--- a/pkg/analyzer/lib/src/dart/element/element.dart |
+++ b/pkg/analyzer/lib/src/dart/element/element.dart |
@@ -32,37 +32,9 @@ import 'package:analyzer/src/summary/idl.dart'; |
import 'package:analyzer/src/task/dart.dart'; |
/** |
- * For AST nodes that could be in both the getter and setter contexts |
- * ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved |
- * elements are stored in the AST node, in an [AuxiliaryElements]. Because |
- * resolved elements are either statically resolved or resolved using propagated |
- * type information, this class is a wrapper for a pair of [ExecutableElement]s, |
- * not just a single [ExecutableElement]. |
- */ |
-class AuxiliaryElements { |
- /** |
- * The element based on propagated type information, or `null` if the AST |
- * structure has not been resolved or if the node could not be resolved. |
- */ |
- final ExecutableElement propagatedElement; |
- |
- /** |
- * The element based on static type information, or `null` if the AST |
- * structure has not been resolved or if the node could not be resolved. |
- */ |
- final ExecutableElement staticElement; |
- |
- /** |
- * Initialize a newly created pair to have both the [staticElement] and the |
- * [propagatedElement]. |
- */ |
- AuxiliaryElements(this.staticElement, this.propagatedElement); |
-} |
- |
-/** |
* A concrete implementation of a [ClassElement]. |
*/ |
-abstract class ClassElementImpl extends ElementImpl |
+abstract class AbstractClassElementImpl extends ElementImpl |
with TypeParameterizedElementMixin |
implements ClassElement { |
/** |
@@ -131,17 +103,18 @@ abstract class ClassElementImpl extends ElementImpl |
* Initialize a newly created class element to have the given [name] at the |
* given [offset] in the file that contains the declaration of this element. |
*/ |
- ClassElementImpl(String name, int offset) : super(name, offset); |
+ AbstractClassElementImpl(String name, int offset) : super(name, offset); |
/** |
* Initialize a newly created class element to have the given [name]. |
*/ |
- ClassElementImpl.forNode(Identifier name) : super.forNode(name); |
+ AbstractClassElementImpl.forNode(Identifier name) : super.forNode(name); |
/** |
* Initialize using the given serialized information. |
*/ |
- ClassElementImpl.forSerialized(CompilationUnitElementImpl enclosingUnit) |
+ AbstractClassElementImpl.forSerialized( |
+ CompilationUnitElementImpl enclosingUnit) |
: super.forSerialized(enclosingUnit); |
/** |
@@ -964,23 +937,51 @@ abstract class ClassElementImpl extends ElementImpl |
} |
/** |
- * Return the [ClassElementImpl] of the given [classElement]. May throw an |
- * exception if the [ClassElementImpl] cannot be provided (should not happen |
- * though). |
+ * Return the [AbstractClassElementImpl] of the given [classElement]. May |
+ * throw an exception if the [AbstractClassElementImpl] cannot be provided |
+ * (should not happen though). |
*/ |
- static ClassElementImpl getImpl(ClassElement classElement) { |
+ static AbstractClassElementImpl getImpl(ClassElement classElement) { |
if (classElement is ClassElementHandle) { |
classElement.ensureActualElementComplete(); |
return getImpl(classElement.actualElement); |
} |
- return classElement as ClassElementImpl; |
+ return classElement as AbstractClassElementImpl; |
} |
} |
/** |
- * A [ClassElementImpl], which is a class. |
+ * For AST nodes that could be in both the getter and setter contexts |
+ * ([IndexExpression]s and [SimpleIdentifier]s), the additional resolved |
+ * elements are stored in the AST node, in an [AuxiliaryElements]. Because |
+ * resolved elements are either statically resolved or resolved using propagated |
+ * type information, this class is a wrapper for a pair of [ExecutableElement]s, |
+ * not just a single [ExecutableElement]. |
*/ |
-class ClassElementImpl_Class extends ClassElementImpl { |
+class AuxiliaryElements { |
+ /** |
+ * The element based on propagated type information, or `null` if the AST |
+ * structure has not been resolved or if the node could not be resolved. |
+ */ |
+ final ExecutableElement propagatedElement; |
+ |
+ /** |
+ * The element based on static type information, or `null` if the AST |
+ * structure has not been resolved or if the node could not be resolved. |
+ */ |
+ final ExecutableElement staticElement; |
+ |
+ /** |
+ * Initialize a newly created pair to have both the [staticElement] and the |
+ * [propagatedElement]. |
+ */ |
+ AuxiliaryElements(this.staticElement, this.propagatedElement); |
+} |
+ |
+/** |
+ * An [AbstractClassElementImpl] which is a class. |
+ */ |
+class ClassElementImpl extends AbstractClassElementImpl { |
/** |
* The unlinked representation of the class in the summary. |
*/ |
@@ -990,21 +991,21 @@ class ClassElementImpl_Class extends ClassElementImpl { |
* Initialize a newly created class element to have the given [name] at the |
* given [offset] in the file that contains the declaration of this element. |
*/ |
- ClassElementImpl_Class(String name, int offset) |
+ ClassElementImpl(String name, int offset) |
: _unlinkedClass = null, |
super(name, offset); |
/** |
* Initialize a newly created class element to have the given [name]. |
*/ |
- ClassElementImpl_Class.forNode(Identifier name) |
+ ClassElementImpl.forNode(Identifier name) |
: _unlinkedClass = null, |
super.forNode(name); |
/** |
* Initialize using the given serialized information. |
*/ |
- ClassElementImpl_Class.forSerialized( |
+ ClassElementImpl.forSerialized( |
this._unlinkedClass, CompilationUnitElementImpl enclosingUnit) |
: super.forSerialized(enclosingUnit); |
@@ -1159,147 +1160,6 @@ class ClassElementImpl_Class extends ClassElementImpl { |
} |
/** |
- * A [ClassElementImpl], which is an enum. |
- */ |
-class ClassElementImpl_Enum extends ClassElementImpl { |
- /** |
- * The unlinked representation of the enum in the summary. |
- */ |
- final UnlinkedEnum _unlinkedEnum; |
- |
- /** |
- * Initialize a newly created class element to have the given [name] at the |
- * given [offset] in the file that contains the declaration of this element. |
- */ |
- ClassElementImpl_Enum(String name, int offset) |
- : _unlinkedEnum = null, |
- super(name, offset); |
- |
- /** |
- * Initialize a newly created class element to have the given [name]. |
- */ |
- ClassElementImpl_Enum.forNode(Identifier name) |
- : _unlinkedEnum = null, |
- super.forNode(name); |
- |
- /** |
- * Initialize using the given serialized information. |
- */ |
- ClassElementImpl_Enum.forSerialized( |
- this._unlinkedEnum, CompilationUnitElementImpl enclosingUnit) |
- : super.forSerialized(enclosingUnit); |
- |
- /** |
- * Set whether this class is abstract. |
- */ |
- void set abstract(bool isAbstract) { |
- assert(_unlinkedEnum == null); |
- } |
- |
- @override |
- int get codeLength { |
- if (_unlinkedEnum != null) { |
- return _unlinkedEnum.codeRange?.length; |
- } |
- return super.codeLength; |
- } |
- |
- @override |
- int get codeOffset { |
- if (_unlinkedEnum != null) { |
- return _unlinkedEnum.codeRange?.offset; |
- } |
- return super.codeOffset; |
- } |
- |
- @override |
- SourceRange get docRange { |
- if (_unlinkedEnum != null) { |
- UnlinkedDocumentationComment comment = _unlinkedEnum.documentationComment; |
- return comment != null |
- ? new SourceRange(comment.offset, comment.length) |
- : null; |
- } |
- return super.docRange; |
- } |
- |
- @override |
- String get documentationComment { |
- if (_unlinkedEnum != null) { |
- return _unlinkedEnum?.documentationComment?.text; |
- } |
- return super.documentationComment; |
- } |
- |
- @override |
- List<InterfaceType> get interfaces => const <InterfaceType>[]; |
- |
- void set interfaces(List<InterfaceType> interfaces) { |
- assert(false); |
- } |
- |
- @override |
- bool get isAbstract => false; |
- |
- @override |
- bool get isEnum => true; |
- |
- @override |
- bool get isMixinApplication => false; |
- |
- @override |
- List<ElementAnnotation> get metadata { |
- if (_unlinkedEnum != null) { |
- return _metadata ??= |
- _buildAnnotations(enclosingUnit, _unlinkedEnum.annotations); |
- } |
- return super.metadata; |
- } |
- |
- /** |
- * Set whether this class is a mixin application. |
- */ |
- void set mixinApplication(bool isMixinApplication) { |
- assert(false); |
- } |
- |
- @override |
- List<InterfaceType> get mixins => const <InterfaceType>[]; |
- |
- void set mixins(List<InterfaceType> mixins) { |
- assert(false); |
- } |
- |
- @override |
- String get name { |
- if (_unlinkedEnum != null) { |
- return _unlinkedEnum.name; |
- } |
- return super.name; |
- } |
- |
- @override |
- int get nameOffset { |
- if (_unlinkedEnum != null) { |
- return _unlinkedEnum.nameOffset; |
- } |
- return super.nameOffset; |
- } |
- |
- @override |
- List<TypeParameterElement> get typeParameters => |
- const <TypeParameterElement>[]; |
- |
- /** |
- * Set the type parameters defined for this class to the given |
- * [typeParameters]. |
- */ |
- void set typeParameters(List<TypeParameterElement> typeParameters) { |
- assert(false); |
- } |
-} |
- |
-/** |
* A concrete implementation of a [CompilationUnitElement]. |
*/ |
class CompilationUnitElementImpl extends UriReferencedElementImpl |
@@ -1485,7 +1345,7 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl |
*/ |
void set enums(List<ClassElement> enums) { |
for (ClassElement enumDeclaration in enums) { |
- (enumDeclaration as ClassElementImpl).enclosingElement = this; |
+ (enumDeclaration as EnumElementImpl).enclosingElement = this; |
} |
this._enums = enums; |
} |
@@ -1702,7 +1562,7 @@ class CompilationUnitElementImpl extends UriReferencedElementImpl |
} |
} |
for (ClassElement type in _enums) { |
- ClassElementImpl typeImpl = type; |
+ EnumElementImpl typeImpl = type; |
if (typeImpl.identifier == identifier) { |
return typeImpl; |
} |
@@ -3070,6 +2930,147 @@ class ElementLocationImpl implements ElementLocation { |
} |
/** |
+ * An [AbstractClassElementImpl] which is an enum. |
+ */ |
+class EnumElementImpl extends AbstractClassElementImpl { |
+ /** |
+ * The unlinked representation of the enum in the summary. |
+ */ |
+ final UnlinkedEnum _unlinkedEnum; |
+ |
+ /** |
+ * Initialize a newly created class element to have the given [name] at the |
+ * given [offset] in the file that contains the declaration of this element. |
+ */ |
+ EnumElementImpl(String name, int offset) |
+ : _unlinkedEnum = null, |
+ super(name, offset); |
+ |
+ /** |
+ * Initialize a newly created class element to have the given [name]. |
+ */ |
+ EnumElementImpl.forNode(Identifier name) |
+ : _unlinkedEnum = null, |
+ super.forNode(name); |
+ |
+ /** |
+ * Initialize using the given serialized information. |
+ */ |
+ EnumElementImpl.forSerialized( |
+ this._unlinkedEnum, CompilationUnitElementImpl enclosingUnit) |
+ : super.forSerialized(enclosingUnit); |
+ |
+ /** |
+ * Set whether this class is abstract. |
+ */ |
+ void set abstract(bool isAbstract) { |
+ assert(_unlinkedEnum == null); |
+ } |
+ |
+ @override |
+ int get codeLength { |
+ if (_unlinkedEnum != null) { |
+ return _unlinkedEnum.codeRange?.length; |
+ } |
+ return super.codeLength; |
+ } |
+ |
+ @override |
+ int get codeOffset { |
+ if (_unlinkedEnum != null) { |
+ return _unlinkedEnum.codeRange?.offset; |
+ } |
+ return super.codeOffset; |
+ } |
+ |
+ @override |
+ SourceRange get docRange { |
+ if (_unlinkedEnum != null) { |
+ UnlinkedDocumentationComment comment = _unlinkedEnum.documentationComment; |
+ return comment != null |
+ ? new SourceRange(comment.offset, comment.length) |
+ : null; |
+ } |
+ return super.docRange; |
+ } |
+ |
+ @override |
+ String get documentationComment { |
+ if (_unlinkedEnum != null) { |
+ return _unlinkedEnum?.documentationComment?.text; |
+ } |
+ return super.documentationComment; |
+ } |
+ |
+ @override |
+ List<InterfaceType> get interfaces => const <InterfaceType>[]; |
+ |
+ void set interfaces(List<InterfaceType> interfaces) { |
+ assert(false); |
+ } |
+ |
+ @override |
+ bool get isAbstract => false; |
+ |
+ @override |
+ bool get isEnum => true; |
+ |
+ @override |
+ bool get isMixinApplication => false; |
+ |
+ @override |
+ List<ElementAnnotation> get metadata { |
+ if (_unlinkedEnum != null) { |
+ return _metadata ??= |
+ _buildAnnotations(enclosingUnit, _unlinkedEnum.annotations); |
+ } |
+ return super.metadata; |
+ } |
+ |
+ /** |
+ * Set whether this class is a mixin application. |
+ */ |
+ void set mixinApplication(bool isMixinApplication) { |
+ assert(false); |
+ } |
+ |
+ @override |
+ List<InterfaceType> get mixins => const <InterfaceType>[]; |
+ |
+ void set mixins(List<InterfaceType> mixins) { |
+ assert(false); |
+ } |
+ |
+ @override |
+ String get name { |
+ if (_unlinkedEnum != null) { |
+ return _unlinkedEnum.name; |
+ } |
+ return super.name; |
+ } |
+ |
+ @override |
+ int get nameOffset { |
+ if (_unlinkedEnum != null) { |
+ return _unlinkedEnum.nameOffset; |
+ } |
+ return super.nameOffset; |
+ } |
+ |
+ @override |
+ List<TypeParameterElement> get typeParameters => |
+ const <TypeParameterElement>[]; |
+ |
+ /** |
+ * Set the type parameters defined for this class to the given |
+ * [typeParameters]. |
+ */ |
+ void set typeParameters(List<TypeParameterElement> typeParameters) { |
+ assert(false); |
+ } |
+} |
+ |
+/** |
* A base class for concrete implementations of an [ExecutableElement]. |
*/ |
abstract class ExecutableElementImpl extends ElementImpl |