| Index: compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| diff --git a/compiler/java/com/google/dart/compiler/parser/DartParser.java b/compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| index a79148c2fa09144518d66679bebd9128e61ff3b8..30f3658eaa981a0a467e33620ec4d5b63ed46d36 100644
|
| --- a/compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| +++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java
|
| @@ -308,14 +308,14 @@ public class DartParser extends CompletionHooksParserBase {
|
| beginCompilationUnit();
|
| ctx.unitAboutToCompile(dartSource, isDietParse);
|
| DartUnit unit = new DartUnit(dartSource, isDietParse);
|
| + List<DartAnnotation> metadata = parseMetadata();
|
|
|
| // parse any directives at the beginning of the source
|
| - parseDirectives(unit);
|
| + metadata = parseDirectives(unit, metadata);
|
|
|
| while (!EOS()) {
|
| DartNodeWithMetadata node = null;
|
| beginTopLevelElement();
|
| - List<DartAnnotation> metadata = parseMetadata();
|
| isParsingClass = isParsingInterface = false;
|
| // Check for ABSTRACT_KEYWORD.
|
| isTopLevelAbstract = false;
|
| @@ -347,14 +347,15 @@ public class DartParser extends CompletionHooksParserBase {
|
| node = done(parseFunctionTypeAlias());
|
| } else if (looksLikeDirective()) {
|
| reportErrorWithoutAdvancing(ParserErrorCode.DIRECTIVE_OUT_OF_ORDER);
|
| - parseDirectives(unit);
|
| + metadata = parseDirectives(unit, metadata);
|
| } else {
|
| node = done(parseFieldOrMethod(false));
|
| }
|
| // Parsing was successful, add node.
|
| if (node != null) {
|
| - setMetadata(node, metadata);
|
| unit.getTopLevelNodes().add(node);
|
| + setMetadata(node, metadata);
|
| + metadata = parseMetadata();
|
| // Only "class" can be top-level abstract element.
|
| if (isTopLevelAbstract && !isParsingClass) {
|
| int abstractPositionEnd = topLevelAbstractModifierPosition + ABSTRACT_KEYWORD.length();
|
| @@ -530,8 +531,7 @@ public class DartParser extends CompletionHooksParserBase {
|
| return done(libUnit);
|
| }
|
|
|
| - private void parseDirectives(DartUnit unit) {
|
| - List<DartAnnotation> metadata = parseMetadata();
|
| + private List<DartAnnotation> parseDirectives(DartUnit unit, List<DartAnnotation> metadata) {
|
| if (peekPseudoKeyword(0, LIBRARY_KEYWORD)) {
|
| DartLibraryDirective libraryDirective = parseLibraryDirective();
|
| for (DartDirective directive : unit.getDirectives()) {
|
| @@ -540,29 +540,34 @@ public class DartParser extends CompletionHooksParserBase {
|
| break;
|
| }
|
| }
|
| - setMetadata(libraryDirective, metadata);
|
| unit.getDirectives().add(libraryDirective);
|
| + setMetadata(libraryDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| while (peekPseudoKeyword(0, IMPORT_KEYWORD) || peekPseudoKeyword(0, EXPORT_KEYWORD)) {
|
| if (peekPseudoKeyword(0, IMPORT_KEYWORD)) {
|
| DartImportDirective importDirective = parseImportDirective();
|
| - setMetadata(importDirective, metadata);
|
| unit.getDirectives().add(importDirective);
|
| + setMetadata(importDirective, metadata);
|
| + metadata = parseMetadata();
|
| } else {
|
| DartExportDirective exportDirective = parseExportDirective();
|
| - setMetadata(exportDirective, metadata);
|
| unit.getDirectives().add(exportDirective);
|
| + setMetadata(exportDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| }
|
| while (peekPseudoKeyword(0, PART_KEYWORD)) {
|
| if (peekPseudoKeyword(1, OF_KEYWORD)) {
|
| DartPartOfDirective partOfDirective = parsePartOfDirective();
|
| - setMetadata(partOfDirective, metadata);
|
| unit.getDirectives().add(partOfDirective);
|
| + setMetadata(partOfDirective, metadata);
|
| + metadata = parseMetadata();
|
| } else {
|
| DartSourceDirective partDirective = parsePartDirective();
|
| - setMetadata(partDirective, metadata);
|
| unit.getDirectives().add(partDirective);
|
| + setMetadata(partDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| }
|
| //
|
| @@ -578,21 +583,24 @@ public class DartParser extends CompletionHooksParserBase {
|
| break;
|
| }
|
| }
|
| - setMetadata(libraryDirective, metadata);
|
| unit.getDirectives().add(libraryDirective);
|
| done(libraryDirective);
|
| + setMetadata(libraryDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| while (peek(0) == Token.IMPORT) {
|
| beginImportDirective();
|
| DartImportDirective importDirective = parseObsoleteImportDirective();
|
| - setMetadata(importDirective, metadata);
|
| unit.getDirectives().add(done(importDirective));
|
| + setMetadata(importDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| while (peek(0) == Token.SOURCE) {
|
| beginSourceDirective();
|
| DartSourceDirective sourceDirective = parseSourceDirective();
|
| - setMetadata(sourceDirective, metadata);
|
| unit.getDirectives().add(done(sourceDirective));
|
| + setMetadata(sourceDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| while (peek(0) == Token.RESOURCE) {
|
| parseResourceDirective();
|
| @@ -600,9 +608,11 @@ public class DartParser extends CompletionHooksParserBase {
|
| while (peek(0) == Token.NATIVE) {
|
| beginNativeDirective();
|
| DartNativeDirective nativeDirective = parseNativeDirective();
|
| - setMetadata(nativeDirective, metadata);
|
| unit.getDirectives().add(done(nativeDirective));
|
| + setMetadata(nativeDirective, metadata);
|
| + metadata = parseMetadata();
|
| }
|
| + return metadata;
|
| }
|
|
|
| private DartLibraryDirective parseLibraryDirective() {
|
|
|