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

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

Issue 8576007: Expect 'extends' in type parameters declaration and recover, issue 341 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Better recovering, more tests. Created 9 years, 1 month 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
Index: compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
diff --git a/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java b/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
index 7492bfdc9ce6924280cd3f5d38f361eee9868c95..4f2eb83b2ad441c02ffbea50a378041469479120 100644
--- a/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
+++ b/compiler/javatests/com/google/dart/compiler/parser/NegativeParserTest.java
@@ -3,27 +3,16 @@
// BSD-style license that can be found in the LICENSE file.
package com.google.dart.compiler.parser;
+import com.google.common.base.Joiner;
import com.google.dart.compiler.CompilerTestCase;
-import com.google.dart.compiler.DartCompilationError;
import com.google.dart.compiler.ast.DartIdentifier;
import com.google.dart.compiler.ast.DartMethodDefinition;
import com.google.dart.compiler.ast.DartUnit;
-import java.util.List;
-
/**
* Negative Parser/Syntax tests.
*/
public class NegativeParserTest extends CompilerTestCase {
- private void parseExpectErrors(String code, ErrorExpectation... expectedErrors) {
- List<DartCompilationError> errors = getParseErrors(code);
- assertErrors(errors, expectedErrors);
- }
-
- private List<DartCompilationError> getParseErrors(String code) {
- return DartParserRunner.parse(getName(), code, Integer.MAX_VALUE, false).getErrors();
- }
-
public void testFieldInitializerInRedirectionConstructor1() {
parseExpectErrors(
"class A { A(x) { } A.foo() : this(5), y = 5; var y; }",
@@ -208,4 +197,109 @@ public class NegativeParserTest extends CompilerTestCase {
"class A { operator []=(int a, [int b]); }",
errEx(ParserErrorCode.NAMED_PARAMETER_NOT_ALLOWED, 1, 32, 5));
}
+
+ /**
+ * If keyword "extends" is mistyped in type parameters declaration, we should report about this
+ * and then recover correctly.
+ * <p>
+ * http://code.google.com/p/dart/issues/detail?id=341
+ */
+ public void test_parseTypeParameter_expectedExtends_mistypedExtends() throws Exception {
+ DartParserRunner parserRunner =
+ parseSource(Joiner.on("\n").join(
+ "class A {",
+ "}",
+ "class B {",
+ " factory B<X ex>(){}",
+ " factory B<X extneds A>(){}",
+ " factory B<X extneds A, Y extends A>(){}",
+ "}"));
+ // check expected errors
+ assertErrors(
+ parserRunner.getErrors(),
+ errEx(ParserErrorCode.EXPECTED_EXTENDS, 4, 15, 2),
+ errEx(ParserErrorCode.EXPECTED_EXTENDS, 5, 15, 7),
+ errEx(ParserErrorCode.EXPECTED_EXTENDS, 6, 15, 7));
+ // check structure of AST
+ DartUnit dartUnit = parserRunner.getDartUnit();
+ assertEquals(
+ Joiner.on("\n").join(
+ "// unit " + getName(),
+ "class A {",
+ "}",
+ "",
+ "class B {",
+ "",
+ " factory B<X>() { }",
+ "",
+ " factory B<X extends A>() { }",
+ "",
+ " factory B<X extends A, Y extends A>() { }",
+ "}"),
+ dartUnit.toDietSource().trim());
+ }
+
+ /**
+ * Type parameters declaration is not finished, stop parsing and restart from next top level
+ * element.
+ * <p>
+ * http://code.google.com/p/dart/issues/detail?id=341
+ */
+ public void test_parseTypeParameter_unfinishedTypeParameters() throws Exception {
+ DartParserRunner parserRunner =
+ parseSource(Joiner.on("\n").join(
+ "class ClassWithLongEnoughName {",
+ "}",
+ "class B {",
+ " factory B<X(){}",
+ "}",
+ "class C {",
+ "}"));
+ // check expected errors
+ assertErrors(
+ parserRunner.getErrors(),
+ errEx(ParserErrorCode.EXPECTED_EXTENDS, 4, 14, 1),
+ errEx(ParserErrorCode.SKIPPED_SOURCE, 4, 14, 6));
+ // check structure of AST
+ DartUnit dartUnit = parserRunner.getDartUnit();
+ assertEquals(
+ Joiner.on("\n").join(
+ "// unit " + getName(),
+ "class ClassWithLongEnoughName {",
+ "}",
+ "",
+ "class C {",
+ "}"),
+ dartUnit.toDietSource().trim());
+ }
+
+ /**
+ * Type parameters declaration is not finished, next top level element beginning encountered. May
+ * be use just types new class declaration before existing one.
+ * <p>
+ * http://code.google.com/p/dart/issues/detail?id=341
+ */
+ public void test_parseTypeParameter_nextTopLevelInTheMiddle() throws Exception {
+ DartParserRunner parserRunner =
+ parseSource(Joiner.on("\n").join(
+ "class ClassWithLongEnoughName {",
+ "}",
+ "class B {",
+ " factory B<X",
+ "class C {",
+ "}"));
+ // check expected errors
+ assertErrors(parserRunner.getErrors(), errEx(ParserErrorCode.SKIPPED_SOURCE, 4, 13, 1));
+ // check structure of AST
+ DartUnit dartUnit = parserRunner.getDartUnit();
+ assertEquals(
+ Joiner.on("\n").join(
+ "// unit " + getName(),
+ "class ClassWithLongEnoughName {",
+ "}",
+ "",
+ "class C {",
+ "}"),
+ dartUnit.toDietSource().trim());
+ }
}

Powered by Google App Engine
This is Rietveld 408576698