| Index: compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
|
| diff --git a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
|
| index 8ff0774f66f750bd379ed55d6dc33e2e6aa80d1d..ff2fb5ab23ab9182df4d614231b8c5aae26312fb 100644
|
| --- a/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
|
| +++ b/compiler/javatests/com/google/dart/compiler/resolver/NegativeResolverTest.java
|
| @@ -3,13 +3,14 @@
|
| // BSD-style license that can be found in the LICENSE file.
|
| package com.google.dart.compiler.resolver;
|
|
|
| +import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
|
| +import static com.google.dart.compiler.common.ErrorExpectation.errEx;
|
| +
|
| import com.google.dart.compiler.CompilerTestCase;
|
| import com.google.dart.compiler.DartCompilationError;
|
| import com.google.dart.compiler.ast.DartThisExpression;
|
| import com.google.dart.compiler.ast.DartUnit;
|
| import com.google.dart.compiler.common.ErrorExpectation;
|
| -import static com.google.dart.compiler.common.ErrorExpectation.errEx;
|
| -import static com.google.dart.compiler.common.ErrorExpectation.assertErrors;
|
| import com.google.dart.compiler.testing.TestCompilerContext;
|
|
|
| import java.util.ArrayList;
|
| @@ -52,12 +53,16 @@ public class NegativeResolverTest extends CompilerTestCase {
|
| }
|
|
|
| private void resolve(DartUnit unit) {
|
| + unit.addTopLevelNode(ResolverTestCase.makeClass("bool", null));
|
| + unit.addTopLevelNode(ResolverTestCase.makeClass("num", null));
|
| + unit.addTopLevelNode(ResolverTestCase.makeClass("double", null));
|
| unit.addTopLevelNode(ResolverTestCase.makeClass("int", null));
|
| unit.addTopLevelNode(ResolverTestCase.makeClass("Object", null));
|
| + unit.addTopLevelNode(ResolverTestCase.makeClass("Null", null));
|
| unit.addTopLevelNode(ResolverTestCase.makeClass("String", null));
|
| unit.addTopLevelNode(ResolverTestCase.makeClass("Function", null));
|
| - unit.addTopLevelNode(ResolverTestCase.makeClass("List", null, "T"));
|
| - unit.addTopLevelNode(ResolverTestCase.makeClass("Map", null, "K", "V"));
|
| + unit.addTopLevelNode(ResolverTestCase.makeInterface("List", "T"));
|
| + unit.addTopLevelNode(ResolverTestCase.makeInterface("Map", "K", "V"));
|
| ResolverTestCase.resolve(unit, getContext());
|
| }
|
|
|
| @@ -220,20 +225,53 @@ public class NegativeResolverTest extends CompilerTestCase {
|
| public void testNameConflict_field_field() {
|
| checkSourceErrors(
|
| makeCode(
|
| - "class ClassDeclarationWithLongEnoughNameToForceLineSplitting {",
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A {",
|
| " var foo;",
|
| " var foo;",
|
| "}"),
|
| - errEx(ResolverErrorCode.DUPLICATE_MEMBER, 2, 7, 3),
|
| - errEx(ResolverErrorCode.DUPLICATE_MEMBER, 3, 7, 3));
|
| + errEx(ResolverErrorCode.DUPLICATE_MEMBER, 3, 7, 3),
|
| + errEx(ResolverErrorCode.DUPLICATE_MEMBER, 4, 7, 3));
|
| }
|
|
|
| public void testCall1() {
|
| checkNumErrors("StaticInstanceCallNegativeTest.dart", 1);
|
| }
|
|
|
| - public void testClassExtendsInterfaceNegativeTest() {
|
| - checkNumErrors("ClassExtendsInterfaceNegativeTest.dart", 1);
|
| + /**
|
| + * Section 7.8: It is a compile-time error if the extends clause of a class C includes a type
|
| + * expression that does not denote a class available in the lexical scope of C.
|
| + */
|
| + public void test_classExtendsInterface() {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "interface I {}",
|
| + "class A extends I {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.NOT_A_CLASS, 3, 17, 1));
|
| + }
|
| +
|
| + /**
|
| + * Class can implement class, this causes implementation of an implicit interface.
|
| + */
|
| + public void test_classImplementsClass() {
|
| + checkSourceErrors(makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A {}",
|
| + "class B implements A {",
|
| + "}"));
|
| + }
|
| +
|
| + /**
|
| + * Interface can extend class, this causes implementation of an implicit interface.
|
| + */
|
| + public void test_interfaceExtendsClass() {
|
| + checkSourceErrors(makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A {}",
|
| + "interface B extends A {",
|
| + "}"));
|
| }
|
|
|
| public void tesClassImplementsUnknownInterfaceNegativeTest() {
|
| @@ -903,4 +941,117 @@ public class NegativeResolverTest extends CompilerTestCase {
|
| }
|
| };
|
| }
|
| +
|
| + public void test_blackListed_Dynamic() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends Dynamic {",
|
| + "}",
|
| + "class B implements Dynamic {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 7),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 7));
|
| + assertEquals("'Dynamic' can not be used as superclass", errors.get(0).getMessage());
|
| + assertEquals("'Dynamic' can not be used as superinterface", errors.get(1).getMessage());
|
| + }
|
| +
|
| + public void test_blackListed_Function() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends Function {",
|
| + "}",
|
| + "class B implements Function {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 8),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 8));
|
| + }
|
| +
|
| + public void test_blackListed_bool() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends bool {",
|
| + "}",
|
| + "class B implements bool {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 4),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 4));
|
| + assertEquals("'bool' can not be used as superclass", errors.get(0).getMessage());
|
| + assertEquals("'bool' can not be used as superinterface", errors.get(1).getMessage());
|
| + }
|
| +
|
| + public void test_blackListed_int() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends int {",
|
| + "}",
|
| + "class B implements int {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 3),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 3));
|
| + }
|
| +
|
| + public void test_blackListed_double() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends double {",
|
| + "}",
|
| + "class B implements double {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 6),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 6));
|
| + }
|
| +
|
| + public void test_blackListed_num() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends num {",
|
| + "}",
|
| + "class B implements num {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 3),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 3));
|
| + }
|
| +
|
| + public void test_blackListed_String() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class A extends String {",
|
| + "}",
|
| + "class B implements String {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_EXTENDS, 2, 17, 6),
|
| + errEx(ResolverErrorCode.BLACK_LISTED_IMPLEMENTS, 4, 20, 6));
|
| + }
|
| +
|
| + public void test_noSuchType_classImplements() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class MyClass implements Unknown {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.NO_SUCH_TYPE, 2, 26, 7));
|
| + }
|
| +
|
| + public void test_noSuchType_classImplementsTypeVariable() throws Exception {
|
| + checkSourceErrors(
|
| + makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class MyClass<E> implements E {",
|
| + "}"),
|
| + errEx(ResolverErrorCode.NOT_A_CLASS_OR_INTERFACE, 2, 29, 1));
|
| + }
|
| +
|
| + public void test_explicitDynamicTypeArgument() throws Exception {
|
| + checkSourceErrors(makeCode(
|
| + "// filler filler filler filler filler filler filler filler filler filler",
|
| + "class MyClass implements Map<Object, Dynamic> {",
|
| + "}"));
|
| + }
|
| }
|
|
|