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

Unified Diff: pkg/analyzer/lib/src/dart/element/builder.dart

Issue 1668483003: Create ElementAnnotation objects prior to resolution. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/dart/element/element.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/dart/element/builder.dart
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index df8f470bd3b63fc4e5ab07658bc6d494080ed499..673960b18e426f753d6f0c12899f867de0c89f81 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -39,10 +39,10 @@ class CompilationUnitBuilder {
return null;
}
ElementHolder holder = new ElementHolder();
- ElementBuilder builder = new ElementBuilder(holder);
- unit.accept(builder);
CompilationUnitElementImpl element =
new CompilationUnitElementImpl(source.shortName);
+ ElementBuilder builder = new ElementBuilder(holder, element);
+ unit.accept(builder);
element.accessors = holder.accessors;
element.enums = holder.enums;
element.functions = holder.functions;
@@ -167,6 +167,7 @@ class DirectiveElementBuilder extends SimpleAstVisitor<Object> {
LibraryElement exportedLibrary = exportLibraryMap[exportedSource];
if (exportedLibrary != null) {
ExportElementImpl exportElement = new ExportElementImpl(node.offset);
+ exportElement.metadata = _getElementAnnotations(node.metadata);
StringLiteral uriLiteral = node.uri;
if (uriLiteral != null) {
exportElement.uriOffset = uriLiteral.offset;
@@ -207,6 +208,7 @@ class DirectiveElementBuilder extends SimpleAstVisitor<Object> {
explicitlyImportsCore = true;
}
ImportElementImpl importElement = new ImportElementImpl(node.offset);
+ importElement.metadata = _getElementAnnotations(node.metadata);
StringLiteral uriLiteral = node.uri;
if (uriLiteral != null) {
importElement.uriOffset = uriLiteral.offset;
@@ -243,6 +245,32 @@ class DirectiveElementBuilder extends SimpleAstVisitor<Object> {
return null;
}
+ @override
+ Object visitLibraryDirective(LibraryDirective node) {
+ (node.element as LibraryElementImpl)?.metadata =
+ _getElementAnnotations(node.metadata);
+ return null;
+ }
+
+ @override
+ Object visitPartDirective(PartDirective node) {
+ (node.element as CompilationUnitElementImpl)?.metadata =
+ _getElementAnnotations(node.metadata);
+ return null;
+ }
+
+ /**
+ * Gather a list of the [ElementAnnotation]s referred to by the [Annotation]s
+ * in [metadata].
+ */
+ List<ElementAnnotation> _getElementAnnotations(
+ NodeList<Annotation> metadata) {
+ if (metadata.isEmpty) {
+ return ElementAnnotation.EMPTY_LIST;
+ }
+ return metadata.map((Annotation a) => a.elementAnnotation).toList();
+ }
+
/**
* If the given [node] has a documentation comment, remember its content
* and range into the given [element].
@@ -277,6 +305,12 @@ class DirectiveElementBuilder extends SimpleAstVisitor<Object> {
*/
class ElementBuilder extends RecursiveAstVisitor<Object> {
/**
+ * The compilation unit element into which the elements being built will be
+ * stored.
+ */
+ final CompilationUnitElement compilationUnitElement;
+
+ /**
* The element holder associated with the element that is currently being built.
*/
ElementHolder _currentHolder;
@@ -310,7 +344,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
*
* @param initialHolder the element holder associated with the compilation unit being built
*/
- ElementBuilder(ElementHolder initialHolder) {
+ ElementBuilder(ElementHolder initialHolder, this.compilationUnitElement) {
_currentHolder = initialHolder;
}
@@ -374,6 +408,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
SimpleIdentifier className = node.name;
ClassElementImpl element = new ClassElementImpl.forNode(className);
+ element.metadata = _createElementAnnotations(node.metadata);
List<TypeParameterElement> typeParameters = holder.typeParameters;
List<DartType> typeArguments = _createTypeParameterTypes(typeParameters);
InterfaceTypeImpl interfaceType = new InterfaceTypeImpl(element);
@@ -422,6 +457,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
_visitChildren(holder, node);
SimpleIdentifier className = node.name;
ClassElementImpl element = new ClassElementImpl.forNode(className);
+ element.metadata = _createElementAnnotations(node.metadata);
element.abstract = node.abstractKeyword != null;
element.mixinApplication = true;
List<TypeParameterElement> typeParameters = holder.typeParameters;
@@ -451,6 +487,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
SimpleIdentifier constructorName = node.name;
ConstructorElementImpl element =
new ConstructorElementImpl.forNode(constructorName);
+ element.metadata = _createElementAnnotations(node.metadata);
_setDoc(element, node);
if (node.externalKeyword != null) {
element.external = true;
@@ -491,6 +528,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
SimpleIdentifier variableName = node.identifier;
LocalVariableElementImpl element =
new LocalVariableElementImpl.forNode(variableName);
+ element.metadata = _createElementAnnotations(node.metadata);
ForEachStatement statement = node.parent as ForEachStatement;
int declarationEnd = node.offset + node.length;
int statementEnd = statement.offset + statement.length;
@@ -555,6 +593,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
Object visitEnumDeclaration(EnumDeclaration node) {
SimpleIdentifier enumName = node.name;
ClassElementImpl enumElement = new ClassElementImpl.forNode(enumName);
+ enumElement.metadata = _createElementAnnotations(node.metadata);
enumElement.enum2 = true;
_setDoc(enumElement, node);
InterfaceTypeImpl enumType = new InterfaceTypeImpl(enumElement);
@@ -570,6 +609,12 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
@override
+ Object visitExportDirective(ExportDirective node) {
+ _createElementAnnotations(node.metadata);
+ return super.visitExportDirective(node);
+ }
+
+ @override
Object visitFieldDeclaration(FieldDeclaration node) {
bool wasInField = _inFieldContext;
_inFieldContext = true;
@@ -605,6 +650,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
ElementHolder holder = new ElementHolder();
_visitChildren(holder, node);
ParameterElementImpl element = node.element;
+ element.metadata = _createElementAnnotations(node.metadata);
element.parameters = holder.parameters;
element.typeParameters = holder.typeParameters;
holder.validate();
@@ -629,6 +675,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
SimpleIdentifier functionName = node.name;
FunctionElementImpl element =
new FunctionElementImpl.forNode(functionName);
+ element.metadata = _createElementAnnotations(node.metadata);
_setDoc(element, node);
if (node.externalKeyword != null) {
element.external = true;
@@ -676,6 +723,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
if (node.isGetter) {
PropertyAccessorElementImpl getter =
new PropertyAccessorElementImpl.forNode(propertyNameNode);
+ getter.metadata = _createElementAnnotations(node.metadata);
_setDoc(getter, node);
if (node.externalKeyword != null) {
getter.external = true;
@@ -702,6 +750,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
} else {
PropertyAccessorElementImpl setter =
new PropertyAccessorElementImpl.forNode(propertyNameNode);
+ setter.metadata = _createElementAnnotations(node.metadata);
_setDoc(setter, node);
if (node.externalKeyword != null) {
setter.external = true;
@@ -792,6 +841,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
List<TypeParameterElement> typeParameters = holder.typeParameters;
FunctionTypeAliasElementImpl element =
new FunctionTypeAliasElementImpl.forNode(aliasName);
+ element.metadata = _createElementAnnotations(node.metadata);
_setDoc(element, node);
element.parameters = parameters;
element.typeParameters = typeParameters;
@@ -821,6 +871,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
ElementHolder holder = new ElementHolder();
_visitChildren(holder, node);
ParameterElementImpl element = node.element;
+ element.metadata = _createElementAnnotations(node.metadata);
element.parameters = holder.parameters;
element.typeParameters = holder.typeParameters;
holder.validate();
@@ -828,6 +879,12 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
@override
+ Object visitImportDirective(ImportDirective node) {
+ _createElementAnnotations(node.metadata);
+ return super.visitImportDirective(node);
+ }
+
+ @override
Object visitLabeledStatement(LabeledStatement node) {
bool onSwitchStatement = node.statement is SwitchStatement;
for (Label label in node.labels) {
@@ -841,6 +898,12 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
@override
+ Object visitLibraryDirective(LibraryDirective node) {
+ _createElementAnnotations(node.metadata);
+ return super.visitLibraryDirective(node);
+ }
+
+ @override
Object visitMethodDeclaration(MethodDeclaration node) {
try {
ElementHolder holder = new ElementHolder();
@@ -863,6 +926,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
MethodElementImpl element =
new MethodElementImpl(nameOfMethod, methodName.offset);
+ element.metadata = _createElementAnnotations(node.metadata);
_setDoc(element, node);
element.abstract = node.isAbstract;
if (node.externalKeyword != null) {
@@ -900,6 +964,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
if (node.isGetter) {
PropertyAccessorElementImpl getter =
new PropertyAccessorElementImpl.forNode(propertyNameNode);
+ getter.metadata = _createElementAnnotations(node.metadata);
_setDoc(getter, node);
if (node.externalKeyword != null) {
getter.external = true;
@@ -926,6 +991,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
} else {
PropertyAccessorElementImpl setter =
new PropertyAccessorElementImpl.forNode(propertyNameNode);
+ setter.metadata = _createElementAnnotations(node.metadata);
_setDoc(setter, node);
if (node.externalKeyword != null) {
setter.external = true;
@@ -992,6 +1058,12 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
@override
+ Object visitPartDirective(PartDirective node) {
+ _createElementAnnotations(node.metadata);
+ return super.visitPartDirective(node);
+ }
+
+ @override
Object visitSimpleFormalParameter(SimpleFormalParameter node) {
if (node.parent is! DefaultFormalParameter) {
SimpleIdentifier parameterName = node.identifier;
@@ -1007,7 +1079,10 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
_currentHolder.addParameter(parameter);
parameterName.staticElement = parameter;
}
- return super.visitSimpleFormalParameter(node);
+ super.visitSimpleFormalParameter(node);
+ (node.element as ElementImpl).metadata =
+ _createElementAnnotations(node.metadata);
+ return null;
}
@override
@@ -1037,6 +1112,7 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
SimpleIdentifier parameterName = node.name;
TypeParameterElementImpl typeParameter =
new TypeParameterElementImpl.forNode(parameterName);
+ typeParameter.metadata = _createElementAnnotations(node.metadata);
TypeParameterTypeImpl typeParameterType =
new TypeParameterTypeImpl(typeParameter);
typeParameter.type = typeParameterType;
@@ -1153,6 +1229,26 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
return null;
}
+ @override
+ Object visitVariableDeclarationList(VariableDeclarationList node) {
+ super.visitVariableDeclarationList(node);
+ AstNode parent = node.parent;
+ List<ElementAnnotation> elementAnnotations;
+ if (parent is FieldDeclaration) {
+ elementAnnotations = _createElementAnnotations(parent.metadata);
+ } else if (parent is TopLevelVariableDeclaration) {
+ elementAnnotations = _createElementAnnotations(parent.metadata);
+ } else {
+ // Local variable declaration
+ elementAnnotations = _createElementAnnotations(node.metadata);
+ }
+ for (VariableDeclaration variableDeclaration in node.variables) {
+ (variableDeclaration.element as ElementImpl).metadata =
+ elementAnnotations;
+ }
+ return null;
+ }
+
/**
* Build the table mapping field names to field elements for the fields defined in the current
* class.
@@ -1186,6 +1282,23 @@ class ElementBuilder extends RecursiveAstVisitor<Object> {
}
/**
+ * For each [Annotation] found in [annotations], create a new
+ * [ElementAnnotation] object and set the [Annotation] to point to it.
+ */
+ List<ElementAnnotation> _createElementAnnotations(
+ NodeList<Annotation> annotations) {
+ if (annotations.isEmpty) {
+ return ElementAnnotation.EMPTY_LIST;
+ }
+ return annotations.map((Annotation a) {
+ ElementAnnotationImpl elementAnnotation =
+ new ElementAnnotationImpl(compilationUnitElement);
+ a.elementAnnotation = elementAnnotation;
+ return elementAnnotation;
+ }).toList();
+ }
+
+ /**
* Create the types associated with the given type parameters, setting the type of each type
* parameter, and return an array of types corresponding to the given parameters.
*
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/dart/element/element.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698