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 85e54bf233d968aeb3ba567714bd926568e0b44c..368b4cf8f91bcc60941f218d8e38d0814f374008 100644 |
--- a/compiler/java/com/google/dart/compiler/parser/DartParser.java |
+++ b/compiler/java/com/google/dart/compiler/parser/DartParser.java |
@@ -112,6 +112,7 @@ public class DartParser extends CompletionHooksParserBase { |
private boolean isDietParse; |
private boolean isParsingInterface; |
private boolean isParsingAbstract; |
+ private boolean isParsingClass; |
/** |
* Determines the maximum number of errors before terminating the parser. See |
@@ -253,7 +254,7 @@ public class DartParser extends CompletionHooksParserBase { |
try { |
DartNode node = null; |
beginTopLevelElement(); |
- isParsingInterface = false; |
+ isParsingClass = isParsingInterface = false; |
// Check for ABSTRACT_KEYWORD. |
isParsingAbstract = false; |
if (optionalPseudoKeyword(ABSTRACT_KEYWORD)) { |
@@ -261,6 +262,7 @@ public class DartParser extends CompletionHooksParserBase { |
} |
// Parse top level element. |
if (optionalPseudoKeyword(CLASS_KEYWORD)) { |
+ isParsingClass = true; |
node = done(parseClass()); |
} else if (optionalPseudoKeyword(INTERFACE_KEYWORD)) { |
isParsingInterface = true; |
@@ -1113,7 +1115,10 @@ public class DartParser extends CompletionHooksParserBase { |
// Check for named constructor. |
if (optional(Token.PERIOD)) { |
name = doneWithoutConsuming(new DartPropertyAccess(name, parseIdentifier())); |
- |
+ if(currentlyParsingToplevel()) { |
+ // TODO: Error recovery could find a missing brace and treat this as an expression |
+ reportError(name, ParserErrorCode.FUNCTION_NAME_EXPECTED_IDENTIFIER); |
+ } |
if (optional(Token.PERIOD)) { |
name = doneWithoutConsuming(new DartPropertyAccess(name, parseIdentifier())); |
} |
@@ -1229,7 +1234,6 @@ public class DartParser extends CompletionHooksParserBase { |
* | THIS ('.' identifier)? arguments |
* ; |
* </pre> |
- * @return true if initializer is a redirected constructor, false otherwise. |
*/ |
private void parseInitializers(List<DartInitializer> initializers) { |
expect(Token.COLON); |
@@ -3746,4 +3750,8 @@ public class DartParser extends CompletionHooksParserBase { |
private void reportError(DartNode node, ErrorCode errorCode, Object... arguments) { |
reportError(new DartCompilationError(node, errorCode, arguments)); |
} |
+ |
+ private boolean currentlyParsingToplevel() { |
+ return !(isParsingInterface || isParsingAbstract || isParsingClass); |
+ } |
} |