Index: dart/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java |
diff --git a/dart/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java b/dart/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java |
deleted file mode 100644 |
index d86da206f6d50f323e9c13e2311f611a988340bf..0000000000000000000000000000000000000000 |
--- a/dart/compiler/javatests/com/google/dart/compiler/parser/SyntaxTest.java |
+++ /dev/null |
@@ -1,1741 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// 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.DartCompilerListener; |
-import com.google.dart.compiler.DartSourceTest; |
-import com.google.dart.compiler.ast.DartAnnotation; |
-import com.google.dart.compiler.ast.DartArrayLiteral; |
-import com.google.dart.compiler.ast.DartAssertStatement; |
-import com.google.dart.compiler.ast.DartBinaryExpression; |
-import com.google.dart.compiler.ast.DartBooleanLiteral; |
-import com.google.dart.compiler.ast.DartCascadeExpression; |
-import com.google.dart.compiler.ast.DartClass; |
-import com.google.dart.compiler.ast.DartClassTypeAlias; |
-import com.google.dart.compiler.ast.DartComment; |
-import com.google.dart.compiler.ast.DartExprStmt; |
-import com.google.dart.compiler.ast.DartExpression; |
-import com.google.dart.compiler.ast.DartField; |
-import com.google.dart.compiler.ast.DartFieldDefinition; |
-import com.google.dart.compiler.ast.DartFunctionExpression; |
-import com.google.dart.compiler.ast.DartIdentifier; |
-import com.google.dart.compiler.ast.DartImportDirective; |
-import com.google.dart.compiler.ast.DartIntegerLiteral; |
-import com.google.dart.compiler.ast.DartMapLiteral; |
-import com.google.dart.compiler.ast.DartMethodDefinition; |
-import com.google.dart.compiler.ast.DartNode; |
-import com.google.dart.compiler.ast.DartParameter; |
-import com.google.dart.compiler.ast.DartPropertyAccess; |
-import com.google.dart.compiler.ast.DartStatement; |
-import com.google.dart.compiler.ast.DartStringInterpolation; |
-import com.google.dart.compiler.ast.DartStringLiteral; |
-import com.google.dart.compiler.ast.DartTryStatement; |
-import com.google.dart.compiler.ast.DartTypeExpression; |
-import com.google.dart.compiler.ast.DartTypeNode; |
-import com.google.dart.compiler.ast.DartUnaryExpression; |
-import com.google.dart.compiler.ast.DartUnit; |
-import com.google.dart.compiler.ast.DartVariable; |
-import com.google.dart.compiler.ast.DartVariableStatement; |
-import com.google.dart.compiler.ast.NodeList; |
- |
-import static com.google.dart.compiler.common.ErrorExpectation.assertErrors; |
-import static com.google.dart.compiler.common.ErrorExpectation.errEx; |
- |
-import java.util.List; |
- |
-public class SyntaxTest extends AbstractParserTest { |
- |
- public void test_parseClass_withBeforeExtends() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A with B extends C {}", |
- ""), |
- ParserErrorCode.WITH_BEFORE_EXTENDS, 2, 9); |
- } |
- |
- public void test_parseClass_implementsBeforeExtends() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A implements B extends C {}", |
- ""), |
- ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, 2, 9); |
- } |
- |
- public void test_parseClass_multipleExtends() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A extends B extends C {}", |
- ""), |
- ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, 2, 19); |
- } |
- |
- public void test_parseClass_implementsBeforeWith() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A extends B implements C with D {}", |
- ""), |
- ParserErrorCode.IMPLEMENTS_BEFORE_WITH, 2, 19); |
- } |
- |
- public void test_parseClass_multipleWith() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A extends B with C with D {}", |
- ""), |
- ParserErrorCode.MULTIPLE_WITH_CLAUSES, 2, 26); |
- } |
- |
- public void test_parseClass_multipleImplements() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A implements B implements C {}", |
- ""), |
- ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, 2, 22); |
- } |
- |
- public void test_parseClass_withWithoutExtends() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A with B, C {}", |
- ""), |
- ParserErrorCode.WITH_WITHOUT_EXTENDS, 2, 9); |
- } |
- |
- public void test_parseClass_with() throws Exception { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A extends B with C, D {}", |
- "")); |
- DartClass clazz = findNode(DartClass.class, "class A"); |
- NodeList<DartTypeNode> mixins = clazz.getMixins(); |
- assertEquals(2, mixins.size()); |
- assertEquals("C", mixins.get(0).toString()); |
- assertEquals("D", mixins.get(1).toString()); |
- } |
- |
- public void test_parseTypedefMixin() throws Exception { |
- parseUnit( |
- "test.dart", |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "typedef C = A with B;", |
- "")); |
- DartClassTypeAlias typedef = findNode(DartClassTypeAlias.class, "typedef C"); |
- assertEquals("A", typedef.getSuperclass().toString()); |
- { |
- NodeList<DartTypeNode> mixins = typedef.getMixins(); |
- assertEquals(1, mixins.size()); |
- assertEquals("B", mixins.get(0).toString()); |
- } |
- } |
- |
- public void test_parseTypedefMixin_abstract() throws Exception { |
- parseUnit( |
- "test.dart", |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "typedef C = abstract A with B;", |
- "")); |
- DartClassTypeAlias typedef = findNode(DartClassTypeAlias.class, "typedef C"); |
- assertTrue(typedef.getModifiers().isAbstract()); |
- } |
- |
- /** |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=6881 |
- */ |
- public void test_uri_adjacent() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "import 'myLib' '.dart';", |
- "")); |
- } |
- /** |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=6881 |
- */ |
- public void test_uri_interpolation() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "import 'my$x' '.dart';", |
- "var a = 'Lib';", |
- ""), |
- ParserErrorCode.URI_CANNOT_USE_INTERPOLATION, 1, 8); |
- } |
- |
- public void test_exportDirective_combinators() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "library lib;", |
- "export 'a.dart' show A, B hide C, D;")); |
- } |
- |
- public void test_exportDirective_noCombinators() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "library lib;", |
- "export 'a.dart';")); |
- } |
- |
- public void test_hasParseErrors_true() { |
- DartUnit unit = parseSource("garbage").getDartUnit(); |
- assertTrue(unit.hasParseErrors()); |
- } |
- |
- public void test_hasParseErrors_false() { |
- DartUnit unit = parseSource("// empty").getDartUnit(); |
- assertFalse(unit.hasParseErrors()); |
- } |
- |
- public void test_importDirective_noUri() { |
- DartUnit unit = parseUnit("test.dart", Joiner.on("\n").join( |
- "library lib;", |
- "import;"), |
- ParserErrorCode.EXPECTED_TOKEN, 2, 7); |
- DartImportDirective dir = (DartImportDirective) unit.getDirectives().get(1); |
- assertEquals("import ;\n", dir.toSource()); |
- } |
- |
- public void test_switch_noLBrace() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "main() {", |
- " switch (0)", |
- "}", |
- ""), |
- ParserErrorCode.EXPECTED_TOKEN, 3, 12); |
- } |
- |
- /** |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=6825 |
- */ |
- public void test_annotation_forExport() { |
- parseUnit( |
- "test.dart", |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "library Test;", |
- "", |
- "@meta @meta2 export 'Lib.dart';", |
- "")); |
- } |
- |
- /** |
- * There was bug that class instead of case in switch caused infinite parsing loop. |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=7999 |
- */ |
- public void test_switch_class_inCase() { |
- DartParserRunner runner = parseSource(Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "void main() {", |
- " print((e) {", |
- " switch (e) {", |
- " case 'Up': cursor.(); break;", |
- " class LoopClass { var myData; }", |
- " case 'Down':", |
- " }", |
- " }); ", |
- "}", |
- "")); |
- assertTrue(runner.getErrorCount() > 0); |
- } |
- |
- /** |
- * There was bug that handling missing identifier (method name) after "cursor." in switch caused |
- * infinite parsing loop. |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=6908 |
- */ |
- public void test_switch_noMethodName_inCase() { |
- DartParserRunner runner = parseSource(Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "void main() {", |
- " print((e) {", |
- " switch (e) {", |
- " case 'Up': cursor.();", |
- " case 'Down':", |
- " }", |
- " }); ", |
- "}", |
- "")); |
- assertErrors(runner.getErrors(), |
- errEx(ParserErrorCode.INVALID_IDENTIFIER, 5, 24, 1)); |
- } |
- |
- public void test_getter() { |
- parseUnit("getter.dart", Joiner.on("\n").join( |
- "class G {", |
- " // Old getter syntax", |
- " int get g1 => 1;", |
- " // New getter syntax", |
- " int get g2 => 2;", |
- "}")); |
- } |
- |
- public void test_identifier_as() { |
- parseUnit("identifier.dart", Joiner.on("\n").join( |
- "class G {", |
- " int as = 0;", |
- "}")); |
- } |
- |
- public void test_patch() { |
- DartUnit unit = parseUnit("patch.dart", Joiner.on("\n").join( |
- "patch class A {", |
- "}")); |
- assertEquals(1, unit.getTopLevelNodes().size()); |
- } |
- |
- public void test_index_literalMap() { |
- parseUnit("test.dart", Joiner.on('\n').join( |
- "main() {", |
- " try { {'1' : 1, '2' : 2}['1']++; } catch(e) {}", |
- "}")); |
- } |
- |
- public void test_redirectingFactoryConstructor_const() { |
- parseUnit("redirecting.dart", Joiner.on("\n").join( |
- "class B {", |
- " const factory B.n(int x) = A.m;", |
- "}")); |
- } |
- |
- public void test_redirectingFactoryConstructor_nonConst() { |
- parseUnit("redirecting.dart", Joiner.on("\n").join( |
- "class B {", |
- " factory B.n(int x) = A.m;", |
- "}")); |
- } |
- |
- public void test_setter() { |
- parseUnit("setter.dart", Joiner.on("\n").join( |
- "class G {", |
- " void set g1(int v) {}", |
- "}")); |
- } |
- |
- public void test_cascade() { |
- parseUnit( |
- "cascade.dart", |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class C {", |
- " var f = g..m1()..m2()..f.a;", |
- " var f = g..[3].x()..y()();", |
- "}")); |
- // test that cascaded invocations have reasonable SourceInfo |
- assertNodeSourceInfo("..m1()"); |
- assertNodeSourceInfo("..m2()"); |
- } |
- |
-// public void test_cascade2() { |
-// DartUnit unit = parseUnit("cascade.dart", Joiner.on("\n").join( |
-// "class A {", |
-// " B b;", |
-// "}", |
-// "", |
-// "class B {", |
-// " void m() {}", |
-// "}", |
-// "", |
-// "main() {", |
-// " A a;", |
-// " a..b.m()..b.m();", |
-// "}")); |
-// assertNotNull(unit); |
-// } |
- |
- public void test_assertStatement() { |
- DartUnit unit = parseUnit("function.dart", Joiner.on("\n").join( |
- "main() {", |
- " assert(true);", |
- "}" |
- )); |
- assertNotNull(unit); |
- assertEquals(1, unit.getTopLevelNodes().size()); |
- DartMethodDefinition function = (DartMethodDefinition) unit.getTopLevelNodes().get(0); |
- assertNotNull(function); |
- DartStatement statement = function.getFunction().getBody().getStatements().get(0); |
- assertTrue(statement instanceof DartAssertStatement); |
- DartExpression expression = ((DartAssertStatement) statement).getCondition(); |
- assertTrue(expression instanceof DartBooleanLiteral); |
- } |
- |
- public void test_cascade_withConditionalInside() { |
- DartUnit unit = parseUnit("function.dart", Joiner.on("\n").join( |
- "class A {", |
- " var name;", |
- " foo() {}", |
- "}", |
- "", |
- "", |
- "", |
- "main() {", |
- " A a = new A();", |
- " a", |
- " ..name = true ? 'true' : 'false'", |
- " ..foo();", |
- "}" |
- )); |
- assertNotNull(unit); |
- assertEquals(2, unit.getTopLevelNodes().size()); |
- DartMethodDefinition function = (DartMethodDefinition) unit.getTopLevelNodes().get(1); |
- assertNotNull(function); |
- DartStatement statement = function.getFunction().getBody().getStatements().get(1); |
- assertTrue(statement instanceof DartExprStmt); |
- DartCascadeExpression cascade = (DartCascadeExpression) ((DartExprStmt) statement).getExpression(); |
- NodeList<DartExpression> cascadeSections = cascade.getCascadeSections(); |
- assertEquals(2, cascadeSections.size()); |
- assertEquals("..name = true ? \"true\" : \"false\"", cascadeSections.get(0).toString()); |
- assertEquals("..foo()", cascadeSections.get(1).toString()); |
- } |
- |
- public void test_functionExpression_asStatement() { |
- DartUnit unit = parseUnit("function.dart", Joiner.on("\n").join( |
- "main() {", |
- " () {};", |
- "}" |
- )); |
- assertNotNull(unit); |
- assertEquals(1, unit.getTopLevelNodes().size()); |
- DartMethodDefinition function = (DartMethodDefinition) unit.getTopLevelNodes().get(0); |
- assertNotNull(function); |
- DartStatement statement = function.getFunction().getBody().getStatements().get(0); |
- assertTrue(statement instanceof DartExprStmt); |
- DartExpression expression = ((DartExprStmt) statement).getExpression(); |
- assertTrue(expression instanceof DartFunctionExpression); |
- } |
- |
- public void test_functionExpression_inIsExpression() { |
- DartUnit unit = parseUnit("function.dart", Joiner.on("\n").join( |
- "main() {", |
- " (p) {} is String;", |
- "}" |
- )); |
- assertNotNull(unit); |
- assertEquals(1, unit.getTopLevelNodes().size()); |
- DartMethodDefinition function = (DartMethodDefinition) unit.getTopLevelNodes().get(0); |
- assertNotNull(function); |
- DartStatement statement = function.getFunction().getBody().getStatements().get(0); |
- assertTrue(statement instanceof DartExprStmt); |
- DartExpression expression = ((DartExprStmt) statement).getExpression(); |
- assertTrue(expression instanceof DartBinaryExpression); |
- DartExpression lhs = ((DartBinaryExpression) expression).getArg1(); |
- assertTrue(lhs instanceof DartFunctionExpression); |
- } |
- |
- public void test_const() { |
- DartUnit unit = parseUnit(getName() + ".dart", makeCode( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "const T1 = 1;", |
- "final T2 = 1;", |
- "class A {", |
- " const F1 = 2;", |
- " static final F2 = 2;", |
- "}")); |
- // T1 |
- { |
- DartFieldDefinition fieldDefinition = (DartFieldDefinition) unit.getTopLevelNodes().get(0); |
- DartField field = fieldDefinition.getFields().get(0); |
- assertEquals("T1", field.getName().getName()); |
- assertEquals(true, field.getModifiers().isConstant()); |
- assertEquals(false, field.getModifiers().isStatic()); |
- assertEquals(true, field.getModifiers().isFinal()); |
- } |
- // T2 |
- { |
- DartFieldDefinition fieldDefinition = (DartFieldDefinition) unit.getTopLevelNodes().get(1); |
- DartField field = fieldDefinition.getFields().get(0); |
- assertEquals("T2", field.getName().getName()); |
- assertEquals(false, field.getModifiers().isConstant()); |
- assertEquals(false, field.getModifiers().isStatic()); |
- assertEquals(true, field.getModifiers().isFinal()); |
- } |
- // A |
- { |
- DartClass classA = (DartClass) unit.getTopLevelNodes().get(2); |
- // F1 |
- { |
- DartFieldDefinition fieldDefinition = (DartFieldDefinition) classA.getMembers().get(0); |
- DartField field = fieldDefinition.getFields().get(0); |
- assertEquals("F1", field.getName().getName()); |
- assertEquals(true, field.getModifiers().isConstant()); |
- assertEquals(false, field.getModifiers().isStatic()); |
- assertEquals(true, field.getModifiers().isFinal()); |
- } |
- // F2 |
- { |
- DartFieldDefinition fieldDefinition = (DartFieldDefinition) classA.getMembers().get(1); |
- DartField field = fieldDefinition.getFields().get(0); |
- assertEquals("F2", field.getName().getName()); |
- assertEquals(false, field.getModifiers().isConstant()); |
- assertEquals(true, field.getModifiers().isStatic()); |
- assertEquals(true, field.getModifiers().isFinal()); |
- } |
- } |
- } |
- |
- public void test_constructor_named() { |
- DartUnit unit = parseUnit("test.dart", makeCode( |
- "class A {", |
- " A.named() {}", |
- "}", |
- "", |
- "class B {", |
- " factory B() = A.named;", |
- "}")); |
- assertNotNull(unit); |
- DartNode classB = unit.getTopLevelNodes().get(1); |
- assertTrue(classB instanceof DartClass); |
- DartNode member = ((DartClass) classB).getMembers().get(0); |
- assertTrue(member instanceof DartMethodDefinition); |
- DartTypeNode typeName = ((DartMethodDefinition) member).getRedirectedTypeName(); |
- assertTrue(typeName.getIdentifier() instanceof DartIdentifier); |
- DartExpression constructorName = ((DartMethodDefinition) member).getRedirectedConstructorName(); |
- assertTrue(constructorName instanceof DartIdentifier); |
- } |
- |
- /** |
- * There was bug when "identA.identB" always considered as constructor declaration. But it can be |
- * constructor only if "identA" is name of enclosing class. |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=513 |
- */ |
- public void testQualifiedReturnType() { |
- DartUnit unit = parseUnit("QualifiedReturnTypeB.dart"); |
- assertEquals( |
- Joiner.on("\n").join( |
- "// unit QualifiedReturnTypeB.dart", |
- "library test;", |
- "import \"QualifiedReturnTypeA.dart\" as pref;", |
- "class A {", |
- "", |
- " pref.A foo() {", |
- " return new pref.A();", |
- " }", |
- "}"), |
- unit.toSource().trim()); |
- DartClass classB = (DartClass) unit.getTopLevelNodes().get(0); |
- DartMethodDefinition fooMethod = (DartMethodDefinition) classB.getMembers().get(0); |
- DartTypeNode fooReturnType = fooMethod.getFunction().getReturnTypeNode(); |
- assertEquals(true, fooReturnType.getIdentifier() instanceof DartPropertyAccess); |
- } |
- |
- @Override |
- public void testStrings() { |
- DartUnit unit = parseUnit("Strings.dart"); |
- |
- // Inspect the first method and check that the strings were |
- // parsed correctly |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- DartClass clazz = (DartClass) nodes.get(0); |
- List<DartNode> members = clazz.getMembers(); |
- assertEquals(1, members.size()); |
- DartMethodDefinition m = (DartMethodDefinition) members.get(0); |
- assertEquals("method", m.getName().toString()); |
- List<DartStatement> body = m.getFunction().getBody().getStatements(); |
- |
- String[] expectedStrings = new String[] { |
- "a simple constant", |
- "a simple constant", |
- "an escaped quote \".", |
- "an escaped quote \'.", |
- "a new \n line", |
- "a new \n line", |
- " multiline 1\n multiline 2\n ", |
- " multiline 1\n multiline 2\n ", |
- "multiline 1\n multiline 2\n ", |
- "multiline 1\n multiline 2\n "}; |
- assertEquals(expectedStrings.length + 1, body.size()); |
- assertTrue(body.get(0) instanceof DartVariableStatement); |
- for (int i = 0; i < expectedStrings.length; i++) { |
- DartStatement s = body.get(i + 1); |
- assertTrue(s instanceof DartExprStmt); |
- DartExprStmt es = (DartExprStmt) s; |
- DartExpression e = es.getExpression(); |
- assertTrue(e instanceof DartBinaryExpression); |
- e = ((DartBinaryExpression) e).getArg2(); |
- assertTrue(e instanceof DartStringLiteral); |
- assertEquals(expectedStrings[i], ((DartStringLiteral) e).getValue()); |
- } |
- } |
- |
- @Override |
- public void testStringsErrors() { |
- parseUnitErrors("StringsErrorsNegativeTest.dart", |
- "Unexpected token 'ILLEGAL'", 7, 13, |
- "Unexpected token 'ILLEGAL'", 9, 9, |
- "Unexpected token 'ILLEGAL'", 11, 9); |
- } |
- |
- public void testNullAssign() { |
- String sourceCode = "= 123;"; |
- try { |
- DartSourceTest dartSrc = new DartSourceTest(getName(), sourceCode, null); |
- DartParser parser = makeParser(dartSrc, sourceCode, new DartCompilerListener.Empty()); |
- parser.parseExpression(); |
- } |
- catch(Exception e) { |
- fail("unexpected exception " + e); |
- } |
- } |
- |
- public void testFactoryInitializerError() { |
- parseUnitErrors("FactoryInitializersNegativeTest.dart", |
- "Unexpected token ':' (expected '{')", 10, 22, |
- "Unexpected token '{' (expected ';')", 10, 35); |
- } |
- |
- public void testTryCatch () { |
- DartUnit unit = parseUnit("TryCatch.dart"); |
- |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(7, nodes.size()); |
- |
- DartTryStatement tryCatch; |
- DartMethodDefinition a = (DartMethodDefinition) nodes.get(2); |
- assertEquals("a", ((DartIdentifier)a.getName()).getName()); |
- tryCatch = (DartTryStatement) a.getFunction().getBody().getStatements().get(0); |
- assertEquals(1, tryCatch.getCatchBlocks().size()); |
- assertNotNull(tryCatch.getFinallyBlock()); |
- |
- DartMethodDefinition b = (DartMethodDefinition) nodes.get(3); |
- assertEquals("b", ((DartIdentifier)b.getName()).getName()); |
- tryCatch = (DartTryStatement) b.getFunction().getBody().getStatements().get(0); |
- assertEquals(1, tryCatch.getCatchBlocks().size()); |
- assertNull(tryCatch.getFinallyBlock()); |
- |
- DartMethodDefinition c = (DartMethodDefinition) nodes.get(4); |
- assertEquals("c", ((DartIdentifier)c.getName()).getName()); |
- tryCatch = (DartTryStatement) c.getFunction().getBody().getStatements().get(0); |
- assertEquals(0, tryCatch.getCatchBlocks().size()); |
- assertNotNull(tryCatch.getFinallyBlock()); |
- |
- DartMethodDefinition d = (DartMethodDefinition) nodes.get(5); |
- assertEquals("d", ((DartIdentifier)d.getName()).getName()); |
- tryCatch = (DartTryStatement) d.getFunction().getBody().getStatements().get(0); |
- assertEquals(2, tryCatch.getCatchBlocks().size()); |
- assertNull(tryCatch.getFinallyBlock()); |
- |
- DartMethodDefinition e = (DartMethodDefinition) nodes.get(6); |
- assertEquals("e", ((DartIdentifier)e.getName()).getName()); |
- tryCatch = (DartTryStatement) e.getFunction().getBody().getStatements().get(0); |
- assertEquals(2, tryCatch.getCatchBlocks().size()); |
- assertNotNull(tryCatch.getFinallyBlock()); |
- |
- parseUnitErrors("TryCatchNegative.dart", |
- ParserErrorCode.CATCH_OR_FINALLY_EXPECTED, 8, 3); |
- } |
- |
-// public void test_tryOn_catch() { |
-// parseUnit("tryOn.dart", "f() {try {} catch (e) {}}"); |
-// } |
- |
-// public void test_tryOn_catchStack() { |
-// parseUnit("tryOn.dart", "f() {try {} catch (e, s) {}}"); |
-// } |
- |
-// public void test_tryOn_on1Catch1() { |
-// parseUnit("tryOn.dart", Joiner.on("\n").join( |
-// "class Object {}", |
-// "class E {}", |
-// "f() {try {} on E catch (e) {}}")); |
-// } |
- |
-// public void test_tryOn_on2Catch2() { |
-// parseUnit("tryOn.dart", Joiner.on("\n").join( |
-// "class Object {}", |
-// "class E1 {}", |
-// "class E2 {}", |
-// "f() {try {} on E1 catch (e1) {} on E2 catch (e2) {}}")); |
-// } |
- |
-// public void test_tryOn_on2Catch3() { |
-// parseUnit("tryOn.dart", Joiner.on("\n").join( |
-// "class Object {}", |
-// "class E1 {}", |
-// "class E2 {}", |
-// "f() {try {} on E1 catch (e1) {} on E2 catch (e2) {} catch (e3) {}}")); |
-// } |
- |
-// public void test_tryOn_on2Catch2Finally() { |
-// parseUnit("tryOn.dart", Joiner.on("\n").join( |
-// "class Object {}", |
-// "class E1 {}", |
-// "class E2 {}", |
-// "f() {try {} on E1 catch (e1) {} on E2 catch (e2) {} finally {}}")); |
-// } |
- |
- public void testArrayLiteral() { |
- DartUnit unit = parseUnit("phony_array_literal.dart", "var x = <int>[1,2,3];"); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- DartFieldDefinition f = (DartFieldDefinition)nodes.get(0); |
- DartField fieldX = f.getFields().get(0); |
- DartArrayLiteral array = (DartArrayLiteral) fieldX.getValue(); |
- assertEquals(3, array.getExpressions().size()); |
- assertEquals(1, ((DartIntegerLiteral)array.getExpressions().get(0)).getValue().intValue()); |
- assertEquals(2, ((DartIntegerLiteral)array.getExpressions().get(1)).getValue().intValue()); |
- assertEquals(3, ((DartIntegerLiteral)array.getExpressions().get(2)).getValue().intValue()); |
- } |
- |
- public void testAs() { |
- DartUnit unit = parseUnit("phony_cast.dart", "var x = 3 as int;"); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- DartFieldDefinition f = (DartFieldDefinition)nodes.get(0); |
- DartField fieldX = f.getFields().get(0); |
- DartBinaryExpression cast = (DartBinaryExpression) fieldX.getValue(); |
- assertTrue(cast.getArg1() instanceof DartIntegerLiteral); |
- assertEquals(Token.AS, cast.getOperator()); |
- assertTrue(cast.getArg2() instanceof DartTypeExpression); |
- } |
- |
- public void testMapLiteral() { |
- DartUnit unit = parseUnit("phony_map_literal.dart", "var x = <int>{'a':1,'b':2,'c':3};"); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- DartFieldDefinition f = (DartFieldDefinition)nodes.get(0); |
- DartField fieldX = f.getFields().get(0); |
- DartMapLiteral map = (DartMapLiteral) fieldX.getValue(); |
- assertEquals(3, map.getEntries().size()); |
- assertEquals(1, ((DartIntegerLiteral) (map.getEntries().get(0)).getValue()).getValue() |
- .intValue()); |
- } |
- public void testNestedParameterizedTypes1() { |
- // token >>> is handled specially |
- DartUnit unit = parseUnit ("phony_param_type1.dart", |
- Joiner.on("\n").join( |
- "class A<K> {", |
- " A<A<A<K>>> member;", |
- "}")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- } |
- |
- public void testNestedParameterizedTypes2() { |
- // token >> is handled specially |
- DartUnit unit = parseUnit ("phony_param_type1.dart", |
- Joiner.on("\n").join( |
- "class A<K> {", |
- " A<A<K>> member;", |
- "}")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- } |
- |
- public void testMethodDefinition1() { |
- DartUnit unit = parseUnit ("phony_method_definition1.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " pref.A foo() {", |
- " return new pref.A();", |
- " }", |
- "}")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- } |
- |
- public void testMultipleLabels() { |
- parseUnit ("multiple_labels.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " void foo() {", |
- " a: b: foo();", |
- " }", |
- "}")); |
- } |
- |
- public void testAdjacentStrings1() { |
- DartUnit unit = parseUnit ("phony_adjacent_strings_1.dart", |
- Joiner.on("\n").join( |
- "var a = \"\" \"\";", |
- "var b = \"1\" \"2\" \"3\";")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(2, nodes.size()); |
- DartStringLiteral varA = (DartStringLiteral)((DartFieldDefinition)nodes.get(0)) |
- .getFields().get(0).getValue(); |
- assertEquals("", varA.getValue()); |
- DartStringLiteral varB = (DartStringLiteral)((DartFieldDefinition)nodes.get(1)) |
- .getFields().get(0).getValue(); |
- assertEquals("123", varB.getValue()); |
- |
- } |
- |
- public void testAdjacentStrings2() { |
- DartUnit unit = parseUnit ("phony_adjacent_strings_2.dart", |
- Joiner.on("\n").join( |
- "var c = \"hello\" \"${world}\";", |
- "var d = \"${hello}\" \"world\";", |
- "var e = \"${hello}\" \"${world}\";")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(3, nodes.size()); |
- DartStringInterpolation varC = (DartStringInterpolation)((DartFieldDefinition)nodes.get(0)) |
- .getFields().get(0).getValue(); |
- |
- List<DartStringLiteral> strings = varC.getStrings(); |
- assertEquals(3, strings.size()); |
- assertEquals("hello", strings.get(0).getValue()); |
- assertEquals("", strings.get(1).getValue()); |
- assertEquals("", strings.get(2).getValue()); |
- List<DartExpression> expressions = varC.getExpressions(); |
- assertEquals(2, expressions.size()); |
- assertEquals("", ((DartStringLiteral)expressions.get(0)).getValue()); |
- DartIdentifier expr = (DartIdentifier)expressions.get(1); |
- assertEquals("world", expr.getName()); |
- |
- DartStringInterpolation varD = (DartStringInterpolation)((DartFieldDefinition)nodes.get(1)) |
- .getFields().get(0).getValue(); |
- strings = varD.getStrings(); |
- assertEquals(3, strings.size()); |
- assertEquals("", strings.get(0).getValue()); |
- assertEquals("", strings.get(1).getValue()); |
- assertEquals("world", strings.get(2).getValue()); |
- expressions = varD.getExpressions(); |
- assertEquals(2, expressions.size()); |
- expr = (DartIdentifier)expressions.get(0); |
- assertEquals("hello", expr.getName()); |
- assertEquals("", ((DartStringLiteral)expressions.get(1)).getValue()); |
- |
- DartStringInterpolation varE = (DartStringInterpolation)((DartFieldDefinition)nodes.get(2)) |
- .getFields().get(0).getValue(); |
- strings = varE.getStrings(); |
- assertEquals(4, strings.size()); |
- assertEquals("", strings.get(0).getValue()); |
- assertEquals("", strings.get(1).getValue()); |
- assertEquals("", strings.get(2).getValue()); |
- assertEquals("", strings.get(3).getValue()); |
- expressions = varE.getExpressions(); |
- assertEquals(3, expressions.size()); |
- expr = (DartIdentifier)expressions.get(0); |
- assertEquals("hello", expr.getName()); |
- assertEquals("", ((DartStringLiteral)expressions.get(1)).getValue()); |
- expr = (DartIdentifier)expressions.get(2); |
- assertEquals("world", expr.getName()); |
- } |
- |
- public void testAdjacentStrings3() { |
- DartUnit unit = parseUnit ("phony_adjacent_strings_2.dart", |
- Joiner.on("\n").join( |
- "var f = \"hello\" \"${world}\" \"!\";", |
- "var g = \"${hello}\" \"world\" \"!\";")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(2, nodes.size()); |
- DartStringInterpolation varF = (DartStringInterpolation)((DartFieldDefinition)nodes.get(0)) |
- .getFields().get(0).getValue(); |
- |
- List<DartStringLiteral> strings = varF.getStrings(); |
- assertEquals(4, strings.size()); |
- assertEquals("hello", strings.get(0).getValue()); |
- assertEquals("", strings.get(1).getValue()); |
- assertEquals("", strings.get(2).getValue()); |
- assertEquals("!", strings.get(3).getValue()); |
- List<DartExpression> expressions = varF.getExpressions(); |
- assertEquals(3, expressions.size()); |
- assertEquals("", ((DartStringLiteral)expressions.get(0)).getValue()); |
- DartIdentifier expr = (DartIdentifier)expressions.get(1); |
- assertEquals("world", expr.getName()); |
- assertEquals("", ((DartStringLiteral)expressions.get(2)).getValue()); |
- |
- DartStringInterpolation varG = (DartStringInterpolation)((DartFieldDefinition)nodes.get(1)) |
- .getFields().get(0).getValue(); |
- strings = varG.getStrings(); |
- assertEquals(4, strings.size()); |
- assertEquals("", strings.get(0).getValue()); |
- assertEquals("", strings.get(1).getValue()); |
- assertEquals("world", strings.get(2).getValue()); |
- assertEquals("!", strings.get(3).getValue()); |
- expressions = varG.getExpressions(); |
- assertEquals(3, expressions.size()); |
- expr = (DartIdentifier)expressions.get(0); |
- assertEquals("hello", expr.getName()); |
- assertEquals("", ((DartStringLiteral)expressions.get(1)).getValue()); |
- assertEquals("", ((DartStringLiteral)expressions.get(2)).getValue()); |
- } |
- |
- public void testPseudokeywordMethodsAndFields() { |
- DartUnit unit = parseUnit("phony_pseudokeyword_methods.dart", |
- Joiner.on("\n").join( |
- "class A { ", |
- " int get;", |
- " var set;", |
- " final operator;", |
- "}", |
- "class B {", |
- " var get = 1;", |
- " int set = 1;", |
- " final int operator = 1;", |
- "}", |
- "class C {", |
- " var get = 1;", |
- " int set = 1;", |
- " final operator = 1;", |
- "}", |
- "class D {", |
- " int get = 1;", |
- " final int set = 1;", |
- " var operator = 1;", |
- "}", |
- "class E {", |
- " int get() { }", |
- " void set() { }", |
- " operator() { }", |
- "}", |
- "class F {", |
- " operator - () { }", |
- " operator + (arg) { }", |
- " operator [] (arg) { }", |
- " operator []= (arg, arg){ }", |
- "}")); |
- |
- DartClass A = (DartClass)unit.getTopLevelNodes().get(0); |
- DartFieldDefinition A_get = (DartFieldDefinition)A.getMembers().get(0); |
- assertEquals("get", A_get.getFields().get(0).getName().getName()); |
- DartFieldDefinition A_set = (DartFieldDefinition)A.getMembers().get(1); |
- assertEquals("set", A_set.getFields().get(0).getName().getName()); |
- DartFieldDefinition A_operator = (DartFieldDefinition)A.getMembers().get(2); |
- assertEquals("operator", A_operator.getFields().get(0).getName().getName()); |
- DartClass B = (DartClass)unit.getTopLevelNodes().get(1); |
- DartFieldDefinition B_get = (DartFieldDefinition)B.getMembers().get(0); |
- assertEquals("get", B_get.getFields().get(0).getName().getName()); |
- DartFieldDefinition B_set = (DartFieldDefinition)B.getMembers().get(1); |
- assertEquals("set", B_set.getFields().get(0).getName().getName()); |
- DartFieldDefinition B_operator = (DartFieldDefinition)B.getMembers().get(2); |
- assertEquals("operator", B_operator.getFields().get(0).getName().getName()); |
- DartClass C = (DartClass)unit.getTopLevelNodes().get(2); |
- DartFieldDefinition C_get = (DartFieldDefinition)C.getMembers().get(0); |
- assertEquals("get", C_get.getFields().get(0).getName().getName()); |
- DartFieldDefinition C_set = (DartFieldDefinition)C.getMembers().get(1); |
- assertEquals("set", C_set.getFields().get(0).getName().getName()); |
- DartFieldDefinition C_operator = (DartFieldDefinition)C.getMembers().get(2); |
- assertEquals("operator", C_operator.getFields().get(0).getName().getName()); |
- DartClass D = (DartClass)unit.getTopLevelNodes().get(3); |
- DartFieldDefinition D_get = (DartFieldDefinition)D.getMembers().get(0); |
- assertEquals("get", D_get.getFields().get(0).getName().getName()); |
- DartFieldDefinition D_set = (DartFieldDefinition)D.getMembers().get(1); |
- assertEquals("set", D_set.getFields().get(0).getName().getName()); |
- DartFieldDefinition D_operator = (DartFieldDefinition)D.getMembers().get(2); |
- assertEquals("operator", D_operator.getFields().get(0).getName().getName()); |
- DartClass E = (DartClass)unit.getTopLevelNodes().get(4); |
- DartMethodDefinition E_get = (DartMethodDefinition)E.getMembers().get(0); |
- assertEquals("get", ((DartIdentifier)E_get.getName()).getName()); |
- DartMethodDefinition E_set = (DartMethodDefinition)E.getMembers().get(1); |
- assertEquals("set", ((DartIdentifier)E_set.getName()).getName()); |
- DartMethodDefinition E_operator = (DartMethodDefinition)E.getMembers().get(2); |
- assertEquals("operator", ((DartIdentifier)E_operator.getName()).getName()); |
- DartClass F = (DartClass)unit.getTopLevelNodes().get(5); |
- DartMethodDefinition F_negate = (DartMethodDefinition)F.getMembers().get(0); |
- assertEquals("-", ((DartIdentifier)F_negate.getName()).getName()); |
- DartMethodDefinition F_plus = (DartMethodDefinition)F.getMembers().get(1); |
- assertEquals("+", ((DartIdentifier)F_plus.getName()).getName()); |
- DartMethodDefinition F_access = (DartMethodDefinition)F.getMembers().get(2); |
- assertEquals("[]", ((DartIdentifier)F_access.getName()).getName()); |
- DartMethodDefinition F_access_assign = (DartMethodDefinition)F.getMembers().get(3); |
- assertEquals("[]=", ((DartIdentifier)F_access_assign.getName()).getName()); |
- } |
- |
-// public void test_string_raw_deprecated() { |
-// parseUnit("test.dart", "var s = @'abc${d}efg';", ParserErrorCode.DEPRECATED_RAW_STRING, 1, 9); |
-// } |
- |
- public void test_string_raw() { |
- String expectedValue = "abc${d}efg"; |
- DartUnit unit = parseUnit("test.dart", "var s = r'" + expectedValue + "';"); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- DartFieldDefinition definition = (DartFieldDefinition) nodes.get(0); |
- DartField field = definition.getFields().get(0); |
- DartExpression expression = field.getValue(); |
- assertTrue(expression instanceof DartStringLiteral); |
- assertEquals(expectedValue, ((DartStringLiteral) expression).getValue()); |
- } |
- |
- public void test_super_operator() { |
- DartUnit unit = parseUnit("phony_super.dart", Joiner.on("\n").join( |
- "class A {", |
- " void m() {", |
- " --super;", |
- " }", |
- "}")); |
- List<DartNode> nodes = unit.getTopLevelNodes(); |
- assertEquals(1, nodes.size()); |
- DartClass A = (DartClass) nodes.get(0); |
- DartMethodDefinition m = (DartMethodDefinition) A.getMembers().get(0); |
- DartExprStmt statement = (DartExprStmt) m.getFunction().getBody().getStatements().get(0); |
- DartUnaryExpression value = (DartUnaryExpression) statement.getExpression(); |
- assertEquals(Token.SUB, value.getOperator()); |
- DartUnaryExpression inner = (DartUnaryExpression) value.getArg(); |
- assertEquals(Token.SUB, inner.getOperator()); |
- } |
- |
- /** |
- * Typedef and interface are top level keywords that are also valid as identifiers. |
- * |
- * This test helps insure that the error recovery logic in the parser that detects |
- * top level keywords out of place doesn't break this functionality. |
- */ |
- public void testTopLevelKeywordsAsIdent() { |
- parseUnit("phony_pseudokeyword_methods.dart", |
- Joiner.on("\n").join( |
- "var interface;", |
- "bool interface;", |
- "final interface;", |
- "interface() { }", |
- "String interface() { }", |
- "interface();", |
- "var typedef;", |
- "bool typedef;", |
- "final typedef;", |
- "typedef() { }", |
- "String typedef() { }", |
- "typedef();", |
- "class A { ", |
- " var interface;", |
- " bool interface;", |
- " final interface;", |
- " interface() { }", |
- " String interface() { }", |
- " interface();", |
- " var typedef;", |
- " bool typedef;", |
- " final typedef;", |
- " typedef() { }", |
- " String typedef() { }", |
- " typedef();", |
- "}", |
- "method() {", |
- " var interface;", |
- " bool interface;", |
- " final interface;", |
- " interface() { }", |
- " String interface() { }", |
- " interface();", |
- " var typedef;", |
- " bool typedef;", |
- " final typedef;", |
- " typedef() { }", |
- " String typedef() { }", |
- " typedef();", |
- "}")); |
- } |
- |
- /** |
- * We should be able to parse "static(abstract) => 42" top-level function. |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=1197 |
- */ |
- public void test_staticAsFunctionName() { |
- DartUnit unit = parseUnit( |
- getName(), |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "static(abstract) => 42;", |
- "")); |
- assertEquals(1, unit.getTopLevelNodes().size()); |
- DartMethodDefinition method = (DartMethodDefinition) unit.getTopLevelNodes().get(0); |
- assertEquals("static", method.getName().toSource()); |
- assertEquals("abstract", method.getFunction().getParameters().get(0).getName().toSource()); |
- } |
- |
- /** |
- * The token 'super' is valid by itself (not as a qualifier or assignment selector) in only some |
- * cases. |
- */ |
- public void testLoneSuperExpression1() { |
- parseUnit("phony_lone_super_expression1.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " method() {", |
- " super;", |
- " super ? true : false;", |
- " true ? true : super;", |
- " true ? super : false;", |
- " if (super && true) { }", |
- " if (super || false) { }", |
- " }", |
- "}"), |
- ParserErrorCode.SUPER_IS_NOT_VALID_ALONE_OR_AS_A_BOOLEAN_OPERAND, 3, 5, |
- ParserErrorCode.SUPER_IS_NOT_VALID_ALONE_OR_AS_A_BOOLEAN_OPERAND, 4, 5, |
- ParserErrorCode.SUPER_IS_NOT_VALID_ALONE_OR_AS_A_BOOLEAN_OPERAND, 5, 19, |
- ParserErrorCode.SUPER_IS_NOT_VALID_ALONE_OR_AS_A_BOOLEAN_OPERAND, 6, 12, |
- ParserErrorCode.SUPER_IS_NOT_VALID_AS_A_BOOLEAN_OPERAND, 7, 9, |
- ParserErrorCode.SUPER_IS_NOT_VALID_AS_A_BOOLEAN_OPERAND, 8, 9); |
- } |
- |
- public void testLoneSuperExpression2() throws Exception { |
- parseUnit("phony_lone_super_expression1.dart", |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class Object {}", |
- "class A {", |
- " method() {", |
- " if (1 + super) { }", // error |
- " if (super + 1) { }", // ok |
- " if (1 == super) { }", // error |
- " if (super == 1) { }", // ok |
- " if (1 | super) { }", // error |
- " if (super | 1) { }", // ok |
- " if (1 < super) { }", // error |
- " if (super < 1) { }", // ok |
- " if (1 << super) { }", // error |
- " if (super << 1) { }", // ok |
- " if (1 * super) { }", // error |
- " if (super * 1) { }", // ok |
- " var f = -super;", // ok |
- " }", |
- "}"), |
- ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND, 5, 13, |
- ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND, 7, 14, |
- ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND, 9, 13, |
- ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND, 11, 13, |
- ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND, 13, 14, |
- ParserErrorCode.SUPER_CANNOT_BE_USED_AS_THE_SECOND_OPERAND, 15, 13); |
- } |
- |
- public void testBreakOutsideLoop() throws Exception { |
- parseUnit("phony_lone_super_expression1.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " method() {", |
- " while (true) { break; }", // ok |
- " break;", // bad |
- " L1: break L1;", // ok |
- " while (true) { continue; }", // ok |
- " continue;", // bad |
- " L2: continue L2;", // bad |
- " while (true) { int f() { break; }; }", // bad |
- " }", |
- "}"), |
- ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 4, 10, |
- ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 7, 13, |
- ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 8, 18, |
- ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, 9, 35); |
- } |
- |
- public void testContinueNoLabelInsideCase() throws Exception { |
- parseUnit("phony_lone_super_expression1.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " method() {", |
- " switch(1) {", |
- " case 1: continue;", // error |
- " }", |
- " while (1) {", |
- " switch(1) {", |
- " case 1: continue;", // ok, refers to the while loop. |
- " }", |
- " }", |
- " L: switch(1) {", |
- " case 1: var result = () { continue L; };", // bad |
- " }", |
- " }", |
- "}"), |
- ParserErrorCode.CONTINUE_IN_CASE_MUST_HAVE_LABEL, 4, 23, |
- ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, 12, 41); |
- } |
- |
- public void testRedundantAbruptlyTermainatedCaseStatement() throws Exception { |
- parseUnit("phony_reduntant_abruptly_terminated_case_statement.dart", |
- Joiner.on("\n").join( |
- "func () {", |
- " switch (0) {", |
- " case 0: ", |
- " return 0; ", |
- " break;", // warn dead code |
- " case 1: ", |
- " return 1; ", |
- " var foo = 1;", // warn dead code |
- " case 2:", |
- " return 2;", |
- " var bar = 2;", // warn dead code |
- " break;", // no warning here |
- " default:", |
- " return -1;", |
- " var baz = -1;", // warn dead code |
- " break;", // no warning here |
- " }", |
- "}"), |
- ParserErrorCode.UNREACHABLE_CODE_IN_CASE, 5, 6, |
- ParserErrorCode.UNREACHABLE_CODE_IN_CASE, 8, 6, |
- ParserErrorCode.UNREACHABLE_CODE_IN_CASE, 11, 6, |
- ParserErrorCode.UNREACHABLE_CODE_IN_CASE, 15, 6); |
- } |
- |
- public void testCornerCaseLabelInSwitch() throws Exception { |
- // The parser used to just accept this statement. |
- parseUnit("phony_reduntant_abruptly_terminated_case_statement.dart", |
- Joiner.on("\n").join( |
- "func () {", |
- " switch (0) {", |
- " label1: ", // no case, default or statement follows. |
- " }", |
- "}"), |
- ParserErrorCode.LABEL_NOT_FOLLOWED_BY_CASE_OR_DEFAULT, 3, 9); |
- } |
- |
- public void testBogusEscapedNewline() throws Exception { |
- parseUnit("phony_bogus_escaped_newline.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " var foo = \"not really multiline\\\n", |
- "\";", |
- "}"), |
- ParserErrorCode.ESCAPED_NEWLINE, 2, 35, |
- ParserErrorCode.UNEXPECTED_TOKEN, 2, 13, |
- ParserErrorCode.EXPECTED_TOKEN, 4, 1); |
- } |
- |
- public void testLabelledCaseStatements() throws Exception { |
- parseUnit("phony_labelled_case_statements.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " switch(1) {", |
- " A: case 0:", |
- " B: C: case 1:", |
- " break;", |
- " }", |
- "}")); |
- } |
- |
- public void testRedirectingConstructorBody() throws Exception { |
- parseUnit("phony_test_redirecting_constructor_body.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " A.c() {}", // OK |
- " A.d() : this.c();", // OK |
- " A(): this.b() {}", // body not allowed |
- "}"), |
- ParserErrorCode.REDIRECTING_CONSTRUCTOR_CANNOT_HAVE_A_BODY, 4, 18); |
- } |
- |
- public void test_missingFactoryBody() throws Exception { |
- parseUnit("phony_test_missing_factory_body.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " factory A.c();", // error - no body |
- " A() {}", |
- "}"), |
- ParserErrorCode.EXPECTED_FUNCTION_STATEMENT_BODY, 2, 16); |
- } |
- |
- public void test_factoryAbstractStatic() throws Exception { |
- parseUnit("phony_test_factory_not_abstract.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " A() {}", |
- " factory A.named1() { return new A();}", |
- " static factory A.named2() { return new A();}", |
- "}"), |
- ParserErrorCode.FACTORY_CANNOT_BE_STATIC, 4, 10); |
- } |
- |
- public void test_factoryInInterface() throws Exception { |
- parseUnit("phony_test_factory_in_interface.dart", |
- Joiner.on("\n").join( |
- "interface A {", |
- " factory A();", |
- "}"), |
- ParserErrorCode.DEPRECATED_INTERFACE, 1, 1, |
- ParserErrorCode.FACTORY_MEMBER_IN_INTERFACE, 2, 3, |
- ParserErrorCode.EXPECTED_FUNCTION_STATEMENT_BODY, 2, 14); |
- } |
- |
- public void test_localVariable_const() { |
- DartUnit unit = parseUnit("constVar.dart", makeCode( |
- "main() {", |
- " const v = 1;", |
- "}")); |
- assertNotNull(unit); |
- DartNode firstNode = unit.getTopLevelNodes().get(0); |
- assertTrue(firstNode instanceof DartMethodDefinition); |
- DartStatement statement = ((DartMethodDefinition) firstNode).getFunction().getBody().getStatements().get(0); |
- assertTrue(((DartVariableStatement) statement).getModifiers().isConstant()); |
- } |
- |
- public void test_localVariable_final_prefixedType() { |
- DartUnit unit = parseUnit("finalVar.dart", makeCode( |
- "main() {", |
- " final p.T v = 1;", |
- "}")); |
- assertNotNull(unit); |
- DartNode firstNode = unit.getTopLevelNodes().get(0); |
- assertTrue(firstNode instanceof DartMethodDefinition); |
- DartStatement statement = ((DartMethodDefinition) firstNode).getFunction().getBody().getStatements().get(0); |
- DartVariableStatement variableStatement = (DartVariableStatement) statement; |
- assertTrue(variableStatement.getModifiers().isFinal()); |
- assertEquals("v", variableStatement.getVariables().get(0).getVariableName()); |
- } |
- |
- public void test_metadata_identifier() { |
- String code = makeCode( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "const int annotation = 0;", |
- "class A {", |
- " m0() {}", |
- " @annotation", |
- " m1() {}", |
- "}", |
- ""); |
- DartUnit unit = parseUnit(getName() + ".dart", code); |
- DartClass classA = (DartClass) unit.getTopLevelNodes().get(1); |
- |
- DartMethodDefinition method0 = (DartMethodDefinition) classA.getMembers().get(0); |
- assertEquals("m0", method0.getName().toSource()); |
- assertEquals(0, method0.getMetadata().size()); |
- |
- DartMethodDefinition method1 = (DartMethodDefinition) classA.getMembers().get(1); |
- assertEquals("m1", method1.getName().toSource()); |
- assertEquals(1, method1.getMetadata().size()); |
- DartAnnotation metadata = method1.getMetadata().get(0); |
- assertNotNull(metadata); |
- DartExpression name = metadata.getName(); |
- assertTrue(name instanceof DartIdentifier); |
- assertEquals("annotation", name.toSource()); |
- assertEquals(0, metadata.getArguments().size()); |
- } |
- |
- public void test_metadata_localVariable() { |
- String code = makeCode( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "const annotation = 0;", |
- "class A {", |
- " test() {", |
- " @annotation", |
- " var v = 0;", |
- " }", |
- "}", |
- ""); |
- DartUnit unit = parseUnit(getName() + ".dart", code); |
- DartClass classA = (DartClass) unit.getTopLevelNodes().get(1); |
- |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(0); |
- assertEquals("test", method.getName().toSource()); |
- assertEquals(0, method.getMetadata().size()); |
- |
- DartVariableStatement statement = (DartVariableStatement) method.getFunction().getBody().getStatements().get(0); |
- DartVariable variable = statement.getVariables().get(0); |
- assertEquals("v", variable.getName().toSource()); |
- assertEquals(1, variable.getMetadata().size()); |
- DartAnnotation metadata = variable.getMetadata().get(0); |
- assertNotNull(metadata); |
- DartExpression name = metadata.getName(); |
- assertTrue(name instanceof DartIdentifier); |
- assertEquals("annotation", name.toSource()); |
- assertEquals(0, metadata.getArguments().size()); |
- } |
- |
- public void test_metadata_constructor() { |
- String code = makeCode( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class A {", |
- " const A();", |
- "}", |
- "", |
- "class B {", |
- " m0() {}", |
- " @A()", |
- " m1() {}", |
- "}", |
- ""); |
- DartUnit unit = parseUnit(getName() + ".dart", code); |
- DartClass classB = (DartClass) unit.getTopLevelNodes().get(1); |
- |
- DartMethodDefinition method0 = (DartMethodDefinition) classB.getMembers().get(0); |
- assertEquals("m0", method0.getName().toSource()); |
- assertEquals(0, method0.getMetadata().size()); |
- |
- DartMethodDefinition method1 = (DartMethodDefinition) classB.getMembers().get(1); |
- assertEquals("m1", method1.getName().toSource()); |
- assertEquals(1, method1.getMetadata().size()); |
- } |
- |
- public void test_metadata_deprecated() { |
- String code = makeCode( |
- "class A {", |
- " m0() {}", |
- " @deprecated", |
- " m1() {}", |
- "}", |
- ""); |
- DartUnit unit = parseUnit(getName() + ".dart", code); |
- // A |
- { |
- DartClass classA = (DartClass) unit.getTopLevelNodes().get(0); |
- // m0() |
- { |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(0); |
- assertEquals("m0", method.getName().toSource()); |
- assertEquals(false, method.getObsoleteMetadata().isDeprecated()); |
- } |
- // m1() |
- { |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(1); |
- assertEquals("m1", method.getName().toSource()); |
- assertEquals(true, method.getObsoleteMetadata().isDeprecated()); |
- } |
- } |
- } |
- |
- public void test_metadata_override() { |
- String code = makeCode( |
- "class A {", |
- " m0() {}", |
- " @override", |
- " m1() {}", |
- " /** Leading DartDoc comment */", |
- " @override", |
- " m2() {}", |
- " @override", |
- " /** Trailing DartDoc comment */", |
- " m3() {}", |
- "}", |
- ""); |
- DartUnit unit = parseUnit(getName() + ".dart", code); |
- // A |
- { |
- DartClass classA = (DartClass) unit.getTopLevelNodes().get(0); |
- // m0() |
- { |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(0); |
- assertEquals("m0", method.getName().toSource()); |
- assertEquals(false, method.getObsoleteMetadata().isOverride()); |
- assertNull(method.getDartDoc()); |
- } |
- // m1() |
- { |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(1); |
- assertEquals("m1", method.getName().toSource()); |
- assertEquals(true, method.getObsoleteMetadata().isOverride()); |
- assertNull(method.getDartDoc()); |
- } |
- // m2() |
- { |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(2); |
- assertEquals("m2", method.getName().toSource()); |
- assertEquals(true, method.getObsoleteMetadata().isOverride()); |
- { |
- DartComment dartDoc = method.getDartDoc(); |
- assertNotNull(dartDoc); |
- assertEquals("/** Leading DartDoc comment */", getNodeSource(code, dartDoc)); |
- } |
- } |
- // m3() |
- { |
- DartMethodDefinition method = (DartMethodDefinition) classA.getMembers().get(3); |
- assertEquals("m3", method.getName().toSource()); |
- assertEquals(true, method.getObsoleteMetadata().isOverride()); |
- { |
- DartComment dartDoc = method.getDartDoc(); |
- assertNotNull(dartDoc); |
- assertEquals("/** Trailing DartDoc comment */", getNodeSource(code, dartDoc)); |
- } |
- } |
- } |
- } |
- |
- public void test_operators_valid() throws Exception { |
- parseUnit("operators.dart", |
- Joiner.on("\n").join( |
- "class C {", |
- " operator <(v) {}", |
- " operator >(v) {}", |
- " operator <=(v) {}", |
- " operator >=(v) {}", |
- " operator ==(v) {}", |
- " operator -() {}", |
- " operator -(v) {}", |
- " operator +(v) {}", |
- " operator /(v) {}", |
- " operator ~/(v) {}", |
- " operator *(v) {}", |
- " operator %(v) {}", |
- " operator |(v) {}", |
- " operator ^(v) {}", |
- " operator &(v) {}", |
- " operator <<(v) {}", |
- " operator >>(v) {}", |
- " operator [](i) {}", |
- " operator []=(i, v) {}", |
- " operator ~() {}", |
- "}")); |
- } |
- |
- public void test_positionalDefaultValue() throws Exception { |
- parseUnit("phony_test_abstract_var.dart", |
- Joiner.on("\n").join( |
- "method(arg=1) {", |
- "}"), |
- ParserErrorCode.DEFAULT_POSITIONAL_PARAMETER, 1, 8); |
- } |
- |
- public void test_abstractInInterface() throws Exception { |
- parseUnit("phony_test_abstract_in_interface.dart", |
- Joiner.on("\n").join( |
- "interface A {", |
- " var foo;", |
- " bar();", |
- "}"), |
- ParserErrorCode.DEPRECATED_INTERFACE, 1, 1); |
- } |
- |
- public void test_voidParameterField() throws Exception { |
- parseUnit("phony_test_abstract_in_interface.dart", |
- Joiner.on("\n").join( |
- "method(void arg) { }", |
- "void field;", |
- "class C {", |
- " method(void arg) { }", |
- " void field;", |
- "}"), |
- ParserErrorCode.VOID_PARAMETER, 1, 8, |
- ParserErrorCode.VOID_FIELD, 2, 1, |
- ParserErrorCode.VOID_PARAMETER, 4, 10, |
- ParserErrorCode.VOID_FIELD, 5, 3); |
- } |
- |
- public void test_topLevelVariable_const() { |
- DartUnit unit = parseUnit("constVar.dart", "const v = 1;"); |
- assertNotNull(unit); |
- DartNode firstNode = unit.getTopLevelNodes().get(0); |
- assertTrue(firstNode instanceof DartFieldDefinition); |
- DartField field = ((DartFieldDefinition) firstNode).getFields().get(0); |
- assertTrue(field.getModifiers().isConstant()); |
- } |
- |
- public void test_unexpectedTypeArgument() throws Exception { |
- // This is valid code that was previously rejected. |
- // Invoking a named constructor in a prefixed library should work. |
- parseUnit("phony_test_unexpected_type_argument.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " new prefix.Type.named<T>();", |
- "}")); |
- } |
- |
- public void test_staticOperator() throws Exception { |
- parseUnit("phony_static_operator.dart", |
- Joiner.on("\n").join( |
- "class C {", |
- " static operator +(arg) {}", |
- "}"), |
- ParserErrorCode.OPERATOR_CANNOT_BE_STATIC, 2, 10); |
- } |
- |
- public void test_nonFinalStaticMemberInInterface() throws Exception { |
- parseUnit("phony_non_final_static_member_in_interface.dart", |
- Joiner.on("\n").join( |
- "interface I {", |
- " static foo();", |
- " static var bar;", |
- "}"), |
- ParserErrorCode.DEPRECATED_INTERFACE, 1, 1, |
- ParserErrorCode.NON_FINAL_STATIC_MEMBER_IN_INTERFACE, 2, 3, |
- ParserErrorCode.NON_FINAL_STATIC_MEMBER_IN_INTERFACE, 3, 3); |
- } |
- |
- public void test_invalidOperatorChaining() throws Exception { |
- parseUnit("phony_invalid_operator_chaining.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " if (a < b < c) {}", |
- " if (a is b is c) {}", |
- "}"), |
- ParserErrorCode.INVALID_OPERATOR_CHAINING, 2, 11, |
- ParserErrorCode.INVALID_OPERATOR_CHAINING, 3, 12); |
- } |
- |
- public void test_expectedArrayOrMapLiteral() throws Exception { |
- parseUnit("phony_expected_array_or_map_literal.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " var a = <int>;", |
- "}"), |
- ParserErrorCode.EXPECTED_ARRAY_OR_MAP_LITERAL, 2, 9, |
- ParserErrorCode.EXPECTED_TOKEN, 2, 15); |
- } |
- |
- public void test_abstractMethod_withoutModifier() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "class C {", |
- " m(a, b, c);", |
- "}")); |
- } |
- |
- public void test_argumentDefinitionTest() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "class C {", |
- " m([p = 0]) {", |
- " return ?p;", |
- " }", |
- "}")); |
- } |
- |
- public void test_assignToNonAssignable() throws Exception { |
- parseUnit("phony_assign_to_non_assignable.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " 1 + 2 = 3;", |
- "}"), |
- ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSIGNABLE, 2, 7); |
- } |
- |
- public void test_forComplexVariable() throws Exception { |
- parseUnit("phony_for_complex_variable.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " for (foo + 1 in a) { }", |
- "}"), |
- ParserErrorCode.FOR_IN_WITH_COMPLEX_VARIABLE, 2, 8); |
- } |
- |
- public void test_forMultipleVariable() throws Exception { |
- parseUnit("phony_for_multiple_variable.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " for (var foo, bar in a) { }", |
- "}"), |
- ParserErrorCode.FOR_IN_WITH_MULTIPLE_VARIABLES, 2, 17); |
- } |
- |
- public void test_formalParameters_field() throws Exception { |
- DartUnit unit = parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "class A {", |
- " final foo;", |
- " A(this.foo) {}", |
- "}")); |
- DartClass classNode = (DartClass) unit.getTopLevelNodes().get(0); |
- DartMethodDefinition methodNode = (DartMethodDefinition) classNode.getMembers().get(1); |
- DartParameter parameterNode = methodNode.getFunction().getParameters().get(0); |
- assertTrue(parameterNode.getName() instanceof DartPropertyAccess); |
- DartPropertyAccess accessNode = (DartPropertyAccess) parameterNode.getName(); |
- assertEquals(4, accessNode.getQualifier().getSourceInfo().getLength()); |
- } |
- |
- public void test_formalParameters_named() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method({var a : 1, var b : 2}) {", |
- "}")); |
- } |
- |
- public void test_formalParameters_named_missingRightBracket() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method({var a : 1) {", |
- "}"), |
- ParserErrorCode.MISSING_NAMED_PARAMETER_END, 1, 18); |
- } |
- |
- public void test_formalParameters_named_wrongSeparator() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method({var a = 1}) {", |
- "}"), |
- ParserErrorCode.INVALID_SEPARATOR_FOR_NAMED, 1, 13); |
- } |
- |
- public void test_formalParameters_optional() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method([var a = 1, var b = 2]) {", |
- "}")); |
- } |
- |
- public void test_formalParameters_optional_missingRightBrace() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method([var a = 1) {", |
- "}"), |
- ParserErrorCode.MISSING_OPTIONAL_PARAMETER_END, 1, 18); |
- } |
- |
- public void test_formalParameters_optional_wrongSeparator() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method([var a : 1]) {", |
- "}"), |
- ParserErrorCode.INVALID_SEPARATOR_FOR_OPTIONAL, 1, 13); |
- } |
- |
- public void test_formalParameters_positional() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method(var a, var b) {", |
- "}")); |
- } |
- |
- public void test_formalParameters_positional_named() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method(var a, var b, {var c : 3, var d : 4}) {", |
- "}")); |
- } |
- |
- public void test_formalParameters_positional_optional() throws Exception { |
- parseUnit("formalParameters.dart", |
- Joiner.on("\n").join( |
- "method(var a, var b, [var c = 3, var d = 4]) {", |
- "}")); |
- } |
- |
- public void test_forVariableInitializer() throws Exception { |
- parseUnit("phony_for_multiple_variable.dart", |
- Joiner.on("\n").join( |
- "method() {", |
- " for (var foo = 1 in a) { }", |
- "}"), |
- ParserErrorCode.FOR_IN_WITH_VARIABLE_INITIALIZER, 2, 18); |
- } |
- |
- public void test_forIn_withConst() throws Exception { |
- parseUnit("test.dart", |
- Joiner.on("\n").join( |
- "main() {", |
- " for (const v in a) { }", |
- "}")); |
- } |
- |
- public void test_varInFunctionType() throws Exception { |
- parseUnit("phony_var_in_function_type.dart", |
- "typedef func(var arg());", |
- ParserErrorCode.FUNCTION_TYPED_PARAMETER_IS_VAR, 1, 18); |
- } |
- |
- public void test_finalInFunctionType() throws Exception { |
- parseUnit("phony_var_in_function_type.dart", |
- "typedef func(final arg());", |
- ParserErrorCode.FUNCTION_TYPED_PARAMETER_IS_FINAL, 1, 20); |
- } |
- |
- public void test_export_withoutLibraryDirective() { |
- parseUnit("test.dart", Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "export 'Lib.dart';", |
- ""), |
- ParserErrorCode.EXPORT_WITHOUT_LIBRARY_DIRECTIVE, 2, 1); |
- } |
- |
- public void test_unicodeNormalizedFormC_inString() throws Exception { |
- byte bytes[] = new byte[] { |
- (byte) 0x76, |
- (byte) 0x61, |
- (byte) 0x72, |
- (byte) 0x20, |
- (byte) 0x73, |
- (byte) 0x3D, |
- (byte) 0x27, |
- (byte) 0x41, |
- (byte) 0xCC, |
- (byte) 0x8A, |
- (byte) 0x27, |
- (byte) 0x3B}; |
- String source = new String(bytes, "UTF-8"); |
- DartParserRunner parserRunner = parseSource(source); |
- assertErrors( |
- parserRunner.getErrors(), |
- errEx(ParserErrorCode.INVALID_UNICODE_NORMALIZATION, 1, 8, 1)); |
- } |
-} |