[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);
   }