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

Unified Diff: compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java

Issue 10020008: Adds parser recovery to the class right brace and handles stray semicolons in a class (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: # Created 8 years, 8 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 | « compiler/java/com/google/dart/compiler/parser/DartParser.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
diff --git a/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java b/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
index 73fc7771cfe9cf41eb5067a00210c2d3d943d047..c5f660da2b7724899c163d316e28f875997922bd 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/ParserRecoveryTest.java
@@ -244,6 +244,41 @@ public class ParserRecoveryTest extends AbstractParserTest {
assertEquals("b", B_b.getFields().get(0).getName().getName());
}
+ public void testRecoverToTopLevel9() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recover_to_toplevel9.dart",
+ Joiner.on("\n").join(
+ "class A ", // missing braces
+ "class B { ", // error recovery should pick up class B
+ " var b;",
+ "}"));
+ // Make sure class B is still around
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(0);
+ assertEquals("A", A.getName().getName());
+ DartClass B = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("B", B.getName().getName());
+ DartFieldDefinition B_b = (DartFieldDefinition)B.getMembers().get(0);
+ assertEquals("b", B_b.getFields().get(0).getName().getName());
+ }
+
+ public void testRecoverToTopLevel10() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recover_to_toplevel10.dart",
+ Joiner.on("\n").join(
+ "class A ", // missing opening brace
+ " var a;",
+ "}",
+ "class B { ", // error recovery should pick up class B
+ " var b;",
+ "}"));
+ // Make sure class B is still around
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(0);
+ assertEquals("A", A.getName().getName());
+ // In this case, the parser chooses to promote 'var a' to a top level element
+ DartClass B = (DartClass)unit.getTopLevelNodes().get(2);
+ assertEquals("B", B.getName().getName());
+ DartFieldDefinition B_b = (DartFieldDefinition)B.getMembers().get(0);
+ assertEquals("b", B_b.getFields().get(0).getName().getName());
+ }
+
public void testReservedWordClass() {
DartUnit unit = parseUnitUnspecifiedErrors("phony_reserved_word_class",
Joiner.on("\n").join(
@@ -701,4 +736,226 @@ assertEquals("foo", ((DartIdentifier)prop.getQualifier()).getName());
DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
assertEquals("after", after.getFields().get(0).getName().getName());
}
+
+ public void testRecoveryClassRbrace1() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace1.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " int bad =,", // incomplete field definition
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartFieldDefinition bad = (DartFieldDefinition)A.getMembers().get(0);
+ assertEquals("bad", bad.getFields().get(0).getName().getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace2() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace2.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " int bad( arg a,", // incomplete method definition
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace3() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace3.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " int bad( arg a, ; complete garbage follows", // incomplete method definition
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace4() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace4.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " int bad(arg a) { junk }; ", // trailing semicolon
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace5() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace5.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " var bad = int foo(arg a) { = junk }; ", // jibberish value with trailing semicolon
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartFieldDefinition bad = (DartFieldDefinition)A.getMembers().get(0);
+ assertEquals("bad", bad.getFields().get(0).getName().getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace6() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace6.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " bad() ", // incomplete method
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace7() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace7.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " bad() }", // incomplete method
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace8() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace8.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " bad( }", // incomplete method
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace9() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace9.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " bad", // incomplete declaration
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartMethodDefinition bad = (DartMethodDefinition)A.getMembers().get(0);
+ assertEquals("bad", ((DartIdentifier)bad.getName()).getName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace10() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace10.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " void", // incomplete declaration
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace11() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace11.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " const", // incomplete declaration
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
+
+ public void testRecoveryClassRbrace12() {
+ DartUnit unit = parseUnitUnspecifiedErrors("phony_recovery_class_rbrace12.dart",
+ Joiner.on("\n").join(
+ "var before;",
+ "class A {",
+ " ;;;;", // stray semicolons
+ "}",
+ "int after;")); // use 'int' instead of 'var' because it is harder to recover to
+ DartFieldDefinition before = (DartFieldDefinition)unit.getTopLevelNodes().get(0);
+ assertEquals("before", before.getFields().get(0).getName().getName());
+ DartClass A = (DartClass)unit.getTopLevelNodes().get(1);
+ assertEquals("A", A.getClassName());
+ DartFieldDefinition after = (DartFieldDefinition)unit.getTopLevelNodes().get(2);
+ assertEquals("after", after.getFields().get(0).getName().getName());
+ assertEquals("int", ((DartIdentifier)after.getTypeNode().getIdentifier()).getName());
+ }
}
« no previous file with comments | « compiler/java/com/google/dart/compiler/parser/DartParser.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698