| 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());
|
| + }
|
| }
|
|
|