[fasta] Set parent of annotations in BodyBuilder.finishMetadata.
Change-Id: Iffd063860fb0ecf58f6001688547436690810281
Reviewed-on: https://dart-review.googlesource.com/62820
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Peter von der Ahé <ahe@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index a5a22ec..5582de2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -743,9 +743,42 @@
}
@override
- List<Expression> finishMetadata() {
+ List<Expression> finishMetadata(TreeNode parent) {
List<Expression> expressions = pop();
_typeInferrer.inferMetadata(this, factory, expressions);
+ if (parent is Class) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is Library) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is LibraryDependency) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is LibraryPart) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is Member) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is Typedef) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is TypeParameter) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ } else if (parent is VariableDeclaration) {
+ for (Expression expression in expressions) {
+ parent.addAnnotation(expression);
+ }
+ }
return expressions;
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index 24c7be1..dd37979 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -33,6 +33,9 @@
LabeledStatement,
Let,
Library,
+ LibraryDependency,
+ LibraryPart,
+ ListLiteral,
Location,
Member,
MethodInvocation,
@@ -47,6 +50,7 @@
ReturnStatement,
Statement,
StaticGet,
+ StaticInvocation,
StaticSet,
StringConcatenation,
SuperInitializer,
@@ -55,6 +59,7 @@
SwitchCase,
Throw,
TreeNode,
+ Typedef,
TypeParameter,
TypeParameterType,
VariableDeclaration,
diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
index 5a72afa..71365fd 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -7,15 +7,13 @@
import 'package:kernel/ast.dart'
show
AsyncMarker,
- Class,
Expression,
- Field,
InterfaceType,
Library,
LibraryDependency,
LibraryPart,
Node,
- Typedef;
+ TreeNode;
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
@@ -218,13 +216,7 @@
Token metadata = pop();
Declaration typedefBuilder = lookupBuilder(typedefKeyword, null, name);
- Typedef target = typedefBuilder.target;
- var metadataConstants = parseMetadata(typedefBuilder, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- target.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(typedefBuilder, metadata, typedefBuilder.target);
checkEmpty(typedefKeyword.charOffset);
}
@@ -293,13 +285,7 @@
pop(); // name
Token metadata = pop();
- Library target = library.target;
- var metadataConstants = parseMetadata(library, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- target.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(library, metadata, library.target);
}
@override
@@ -404,12 +390,7 @@
Library libraryNode = library.target;
LibraryDependency dependency =
libraryNode.dependencies[importExportDirectiveIndex++];
- var metadataConstants = parseMetadata(library, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- dependency.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(library, metadata, dependency);
}
@override
@@ -425,12 +406,7 @@
Library libraryNode = library.target;
LibraryDependency dependency =
libraryNode.dependencies[importExportDirectiveIndex++];
- var metadataConstants = parseMetadata(library, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- dependency.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(library, metadata, dependency);
}
@override
@@ -440,12 +416,7 @@
Token metadata = pop();
Library libraryNode = library.target;
LibraryPart part = libraryNode.parts[partDirectiveIndex++];
- var metadataConstants = parseMetadata(library, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- part.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(library, metadata, part);
}
@override
@@ -624,13 +595,7 @@
assert(memberScope == library.scope);
Declaration classBuilder = lookupBuilder(token, null, name);
- Class target = classBuilder.target;
- var metadataConstants = parseMetadata(classBuilder, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- target.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(classBuilder, metadata, classBuilder.target);
currentClass = classBuilder;
memberScope = currentClass.scope;
@@ -660,22 +625,13 @@
Token metadata = pop();
ClassBuilder enumBuilder = lookupBuilder(enumKeyword, null, name);
- Class target = enumBuilder.target;
- var metadataConstants = parseMetadata(enumBuilder, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- target.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(enumBuilder, metadata, enumBuilder.target);
for (int i = 0; i < metadataAndValues.length; i += 2) {
Token metadata = metadataAndValues[i];
String valueName = metadataAndValues[i + 1];
Declaration declaration = enumBuilder.scope.local[valueName];
if (metadata != null) {
- Field field = declaration.target;
- for (var annotation in parseMetadata(declaration, metadata)) {
- field.addAnnotation(annotation);
- }
+ parseMetadata(declaration, metadata, declaration.target);
}
}
@@ -691,13 +647,7 @@
Token metadata = pop();
Declaration classBuilder = lookupBuilder(classKeyword, null, name);
- Class target = classBuilder.target;
- var metadataConstants = parseMetadata(classBuilder, metadata);
- if (metadataConstants != null) {
- for (var metadataConstant in metadataConstants) {
- target.addAnnotation(metadataConstant);
- }
- }
+ parseMetadata(classBuilder, metadata, classBuilder.target);
checkEmpty(beginToken.charOffset);
}
@@ -845,12 +795,13 @@
/// If the [metadata] is not `null`, return the parsed metadata [Expression]s.
/// Otherwise, return `null`.
- List<Expression> parseMetadata(ModifierBuilder builder, Token metadata) {
+ List<Expression> parseMetadata(
+ ModifierBuilder builder, Token metadata, TreeNode parent) {
if (metadata != null) {
var listener = createListener(builder, memberScope, false);
var parser = new Parser(listener);
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
- return listener.finishMetadata();
+ return listener.finishMetadata(parent);
}
return null;
}
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index 7d5b477..df55a69 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -4,7 +4,8 @@
library fasta.stack_listener;
-import 'package:kernel/ast.dart' show AsyncMarker, Expression, FunctionNode;
+import 'package:kernel/ast.dart'
+ show AsyncMarker, Expression, FunctionNode, TreeNode;
import '../fasta_codes.dart'
show
@@ -87,7 +88,7 @@
// TODO(ahe): This doesn't belong here. Only implemented by body_builder.dart
// and ast_builder.dart.
- List<Expression> finishMetadata() {
+ List<Expression> finishMetadata(TreeNode parent) {
return unsupported("finishMetadata", -1, uri);
}