Index: compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
index 2d48ed53f2c1b3eb49af255a8a15a861fb582d0e..0da5e8d488d02a531142b3db51c078a55b0f8b14 100644 |
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
@@ -718,6 +718,20 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase { |
errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 1, 7, 1)); |
} |
+ public void test_warnAbstract_onConcreteClassDeclaration_hasUnimplemented_mixin() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "abstract class A {", |
+ " foo();", |
+ "}", |
+ "class B extends Object with A {", |
+ "}", |
+ ""); |
+ assertErrors( |
+ result.getErrors(), |
+ errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 5, 7, 1)); |
+ } |
+ |
/** |
* There was bug that implementing setter still caused warning. |
* <p> |
@@ -6170,4 +6184,134 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase { |
assertNotNull(expectedElement); |
assertSame(nameInInvocation.getElement(), expectedElement); |
} |
+ |
+ public void test_mixin_1() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "class A {", |
+ " foo() {}", |
+ "}", |
+ "class B extends Object with A {", // no unimplemented methods warning |
+ "}", |
+ "main() {", |
+ " B b = new B();", |
+ " A a = b;", // no 'not assignable' warning |
+ "}", |
+ ""); |
+ assertErrors(result.getErrors()); |
+ } |
+ |
+ public void test_mixin_dontAddSupertypes() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "class A {", |
+ " methodA() {}", |
+ "}", |
+ "class B extends A {", |
+ " methodB() {}", |
+ "}", |
+ "class C extends Object with B {", |
+ "}", |
+ "main() {", |
+ " C c = new C();", |
+ " A a = c;", // 'not assignable' warning - mixing is only "B" content |
+ " B b = c;", // OK |
+ " c.methodB();", // OK |
+ " c.methodA();", // 'no such member' warning - mixing is only "B" content |
+ "}", |
+ ""); |
+ assertErrors( |
+ result.getErrors(), |
+ errEx(TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE, 12, 9, 1), |
+ errEx(TypeErrorCode.INTERFACE_HAS_NO_METHOD_NAMED, 15, 5, 7)); |
+ } |
+ |
+ public void test_mixin_dontAddSupertypes2() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "abstract class A {", |
+ " methodA();", |
+ "}", |
+ "abstract class B implements A {", |
+ " methodB() {}", |
+ "}", |
+ "class C extends Object with B {", // no unimplemented methods warning |
+ "}", |
+ "main() {", |
+ " C c = new C();", |
+ " A a = c;", // 'not assignable' warning - mixing is only "B" content |
+ " B b = c;", // OK |
+ " c.methodB();", // OK |
+ " c.methodA();", // 'no such member' warning - mixing is only "B" content |
+ "}", |
+ ""); |
+ assertErrors( |
+ result.getErrors(), |
+ errEx(TypeErrorCode.TYPE_NOT_ASSIGNMENT_COMPATIBLE, 12, 9, 1), |
+ errEx(TypeErrorCode.INTERFACE_HAS_NO_METHOD_NAMED, 15, 5, 7)); |
+ } |
+ |
+ public void test_mixin_dontAddSupertypes3() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "class A {", |
+ " foo() {}", |
+ "}", |
+ "class B extends A {", |
+ "}", |
+ "abstract class C {", |
+ " foo();", |
+ "}", |
+ "class D extends C with B {", // "foo" is not implemented, because NOT inherited from A |
+ "}", |
+ ""); |
+ assertErrors( |
+ result.getErrors(), |
+ errEx(TypeErrorCode.CONTRETE_CLASS_WITH_UNIMPLEMENTED_MEMBERS, 10, 7, 1)); |
+ } |
+ |
+ public void test_mixin_dontLookSupertype_getter() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "class A {", |
+ " get fA => 42;", |
+ "}", |
+ "class B extends A {", |
+ " get fB => 42;", |
+ "}", |
+ "class C extends Object with B {", |
+ "}", |
+ "main() {", |
+ " C c = new C();", |
+ " print(c.fB);", |
+ " print(c.fA);", |
+ "}", |
+ ""); |
+ assertErrors( |
+ result.getErrors(), |
+ errEx(TypeErrorCode.NOT_A_MEMBER_OF, 13, 11, 2)); |
+ } |
+ |
+ public void test_mixin_dontLookSupertype_setter() throws Exception { |
+ AnalyzeLibraryResult result = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "class A {", |
+ " set fA(x) {}", |
+ "}", |
+ "class B extends A {", |
+ " set fB(x) {}", |
+ "}", |
+ "class C extends Object with B {", |
+ "}", |
+ "main() {", |
+ " C c = new C();", |
+ " c.fB = 1;", |
+ " c.fA = 2;", |
+ "}", |
+ ""); |
+ assertErrors( |
+ result.getErrors(), |
+ errEx(TypeErrorCode.NOT_A_MEMBER_OF, 13, 5, 2)); |
+ } |
+ |
} |