| Index: compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
|
| diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
|
| index 5ce4d3691657b0bc64b0cee307bb1852e9d23007..5c89a78bb8c9cda9c4aa3d9ea75a40b92cc60dc3 100644
|
| --- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
|
| +++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java
|
| @@ -109,7 +109,7 @@ public class ResolverTest extends ResolverTestCase {
|
| }
|
|
|
| /**
|
| - * interface IA extends ID factory B {}
|
| + * interface IA extends ID default B {}
|
| * interface IB extends IA {}
|
| * interface IC extends IA, IB {}
|
| * interface ID extends IB {}
|
| @@ -117,7 +117,7 @@ public class ResolverTest extends ResolverTestCase {
|
| * class B {}
|
| */
|
| public void testGetSubtypesWithInterfaceCycles() {
|
| - DartClass ia = makeInterface("IA", makeTypes("ID"), makeType("B"));
|
| + DartClass ia = makeInterface("IA", makeTypes("ID"), makeDefault("B"));
|
| DartClass ib = makeInterface("IB", makeTypes("IA"), null);
|
| DartClass ic = makeInterface("IC", makeTypes("IA", "IB"), null);
|
| DartClass id = makeInterface("ID", makeTypes("IB"), null);
|
| @@ -148,6 +148,7 @@ public class ResolverTest extends ResolverTestCase {
|
| assertHasSubtypes(elementID, elementIA, elementIB, elementIC, elementID, elementA);
|
| assertHasSubtypes(elementA, elementA);
|
| assertHasSubtypes(elementB, elementB);
|
| + assert(elementIA.getDefaultClass().getElement().getName().equals("B"));
|
| }
|
|
|
| /**
|
| @@ -309,116 +310,290 @@ public class ResolverTest extends ResolverTestCase {
|
| ResolverErrorCode.NO_SUCH_TYPE_CONSTRUCTOR);
|
| }
|
|
|
| - public void testFactoryTypeArgs1() {
|
| +
|
| + public void testDefaultTypeArgs1() {
|
| // Type arguments match
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| "interface int {}",
|
| - "interface A<T> factory B {",
|
| + "interface A<T> default B<T> {",
|
| " A();",
|
| "}",
|
| - "class B implements A {",
|
| - " A<T>() {}",
|
| + "class B<T> implements A<T> {",
|
| + " B() {}",
|
| "}"));
|
| }
|
|
|
| - public void testFactoryTypeArgs2() {
|
| + public void testDefaultTypeArgs2() {
|
| // Type arguments match
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| - "interface A<T> factory B {",
|
| + "interface A<T> default B<T> {",
|
| "}",
|
| - "class B {",
|
| - " factory A<T>.construct () {}",
|
| + "class B<T> {",
|
| + " factory A.construct () {}",
|
| "}"));
|
| }
|
|
|
| - public void testFactoryTypeArgs3() {
|
| + public void testDefaultTypeArgs3() {
|
| // Type arguments match
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| - "interface A<T> factory B {",
|
| + "interface A<T> default B<T> {",
|
| "}",
|
| - "class B {",
|
| - " B<T>() {}",
|
| + "class B<T> {",
|
| + " B() {}",
|
| + "}"));
|
| + }
|
| +
|
| + public void testDefaultTypeArgs4() {
|
| + // Type arguments match
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface A<T> default B<T> {",
|
| + "}",
|
| + "class B<T> implements A<T> {",
|
| + " B() {}",
|
| "}"));
|
| }
|
|
|
| - public void testFactoryTypeArgsNew() {
|
| + public void testDefaultTypeArgs5() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B {",
|
| + "}",
|
| + "class B<T> {",
|
| + "}"));
|
| + }
|
| +
|
| + public void testDefaultTypeArgs6() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B {",
|
| + "}",
|
| + "class B<T extends int> {",
|
| + "}"));
|
| + }
|
| +
|
| + public void testDefaultTypeArgs7() {
|
| + // Example from spec v0.6
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object{}",
|
| + "interface Hashable {}",
|
| + "class HashMapImplementation<K extends Hashable, V> {",
|
| + "}",
|
| + "interface Map<K, V> default HashMapImplementation<K extends Hashable, V> {",
|
| + "}"));
|
| + }
|
| +
|
| + public void testDefaultTypeArgs8() {
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object{}",
|
| + "interface A<K,V> default B<K, V extends K> {",
|
| + "}",
|
| + "class B<K, V extends K> {",
|
| + "}"));
|
| + }
|
| +
|
| + public void testDefaultTypeArgs9() {
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object{}",
|
| + "interface List<T> {}",
|
| + "interface A<K,V> default B<K, V extends List<K>> {}",
|
| + "class B<K, V extends List<K>> {",
|
| + "}"));
|
| + }
|
| +
|
| +
|
| + public void testDefaultTypeArgsNew() {
|
| // Invoke constructor in factory method with type args
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| "interface int {}",
|
| - "interface A<T> factory B {",
|
| - " A<T>();",
|
| + "interface A<T> default B<T> {",
|
| + " B();",
|
| "}",
|
| "class C<T> implements A<T> {}",
|
| - "class B {",
|
| - " factory A<T>() { return new C<T>();}",
|
| + "class B<T> {",
|
| + " factory B() { return new C<T>();}",
|
| "}"));
|
| }
|
|
|
| - public void testFactoryBadTypeArgsNew() {
|
| + public void testFactoryBadTypeArgs1() {
|
| // Invoke constructor in factory method with (wrong) type args
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| "interface int {}",
|
| - "interface A<T> factory B {",
|
| - " A<T>();",
|
| + "interface A<T> default B<T> {",
|
| + " A();",
|
| "}",
|
| "class C<T> implements A<T> {}",
|
| - "class B {",
|
| - " factory A<T>() { return new C<K>();}",
|
| + "class B<T> {",
|
| + " factory A() { return new C<K>();}",
|
| "}"),
|
| ResolverErrorCode.NO_SUCH_TYPE);
|
| }
|
|
|
| - public void disabledBadFactoryTypeArgs1() {
|
| - // Type arguments don't match
|
| + public void testFactoryBadTypeArgs2() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| - "interface A<T> factory B {",
|
| - " A<T>();",
|
| + "interface int {}",
|
| + "interface A<T> default B {",
|
| + " A();",
|
| "}",
|
| + "class C<T> implements A<T> {}",
|
| "class B {",
|
| - " A<T>() {}",
|
| + " factory A() { return new C<int>();}",
|
| "}"),
|
| - ResolverErrorCode.FACTORY_CONSTRUCTOR_TYPE_ARGS_DO_NOT_MATCH);
|
| + ResolverErrorCode.DEFAULT_CLASS_MUST_HAVE_SAME_TYPE_PARAMS);
|
| }
|
|
|
| - public void disabledBadFactoryTypeArgs2() {
|
| - // Type arguments match
|
| + public void testFactoryBadTypeArgs3() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| - "interface A<T> factory B {",
|
| + "interface int {}",
|
| + "interface A<T> default B<K> {",
|
| + " A();",
|
| "}",
|
| - "class B {",
|
| - " factory A<T>.construct () {}",
|
| + "class C<T> implements A<T> {}",
|
| + "class B<T> {",
|
| + " factory A() { return new C<T>();}",
|
| "}"),
|
| - ResolverErrorCode.FACTORY_CONSTRUCTOR_TYPE_ARGS_DO_NOT_MATCH);
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
|
| }
|
|
|
| - public void disabledBadFactoryTypeArgs3() {
|
| - // Type arguments match
|
| + public void testFactoryBadTypeArgs4() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| - "interface A<T> factory B {",
|
| - " A<T>();",
|
| + "interface int {}",
|
| + "interface A<T> default B<T> {",
|
| + " A();",
|
| "}",
|
| - "class B implements A {",
|
| - " B() {}",
|
| + "class C<T> implements A<T> {}",
|
| + "class B<K> {",
|
| + " factory A() { return new C<K>();}",
|
| "}"),
|
| - ResolverErrorCode.FACTORY_CONSTRUCTOR_TYPE_ARGS_DO_NOT_MATCH);
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY,
|
| + ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH);
|
| }
|
|
|
| - public void disabledNonConstructorMethodTypeArgs() {
|
| - // Type arguments match
|
| + public void testFactoryBadTypeArgs5() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| resolveAndTest(Joiner.on("\n").join(
|
| "class Object {}",
|
| - "class A {",
|
| - " foo<T>() {}",
|
| + "interface int {}",
|
| + "interface A<T> default B<T,L> {",
|
| + " A();",
|
| + "}",
|
| + "class C<T> implements A<T> {}",
|
| + "class B<T> {",
|
| + " factory A() { return new C<T>();}",
|
| + "}"),
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
|
| + }
|
| +
|
| + public void testFactoryBadTypeArgs6() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B<K> {",
|
| + " A();",
|
| + "}",
|
| + "class C<T> implements A<T> {}",
|
| + "class B<K> {",
|
| + " factory A() { return new C<K>();}",
|
| + "}"),
|
| + ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH);
|
| + }
|
| +
|
| + public void testFactoryBadTypeArgs7() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T,K> default B<T,K> {",
|
| + " A();",
|
| + "}",
|
| + "class C<T,K> implements A<T,K> {}",
|
| + "class B<K,T> {",
|
| + " factory A() { return new C<int, Object>();}",
|
| + "}"),
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY,
|
| + ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH,
|
| + ResolverErrorCode.TYPE_VARIABLE_DOES_NOT_MATCH);
|
| + }
|
| +
|
| + public void testFactoryBadTypeArgs8() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B<T> {",
|
| + " A();",
|
| + "}",
|
| + "class B<T extends int> {",
|
| + " A() {}",
|
| + "}"),
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
|
| + }
|
| +
|
| + public void testFactoryBadTypeArgs9() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B<T extends int> {",
|
| + " A();",
|
| + "}",
|
| + "class B<T> {",
|
| + " A() {}",
|
| + "}"),
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
|
| + }
|
| +
|
| + public void testFactoryBadTypeArgs11() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default Bogus {",
|
| + "}",
|
| + "class B<T> {",
|
| + "}"),
|
| + ResolverErrorCode.NO_SUCH_TYPE);
|
| + }
|
| +
|
| + public void testFactoryBadTypeArgs10() {
|
| + // Invoke constructor in factory method with (wrong) type args
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B {",
|
| + " A();",
|
| + "}",
|
| + "class B {",
|
| + " A() {}",
|
| "}"),
|
| - ResolverErrorCode.TYPE_ARGS_ONLY_ON_CONSTRUCTORS);
|
| + ResolverErrorCode.DEFAULT_CLASS_MUST_HAVE_SAME_TYPE_PARAMS);
|
| + }
|
| + public void testBadDefaultTypeArgs11() {
|
| + // Example from spec v0.6
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object{}",
|
| + "interface Hashable {}",
|
| + "class HashMapImplementation<K extends Hashable, V> {",
|
| + "}",
|
| + "interface Map<K, V> default HashMapImplementation<K, V> {",
|
| + "}"),
|
| + ResolverErrorCode.TYPE_PARAMETERS_MUST_MATCH_EXACTLY);
|
| }
|
|
|
| public void testBadGenerativeConstructor1() {
|
| @@ -550,12 +725,25 @@ public class ResolverTest extends ResolverTestCase {
|
| public void testNewExpression5() {
|
| // More cowbell. (Foo<T> isn't a type yet)
|
| resolveAndTest(Joiner.on("\n").join(
|
| - "class Object {}",
|
| - "class Foo<T> { }",
|
| - "class B {",
|
| - " foo() { return new Foo<T>(); }",
|
| - "}"),
|
| - ResolverErrorCode.NO_SUCH_TYPE);
|
| + "class Object {}",
|
| + "class Foo<T> { }",
|
| + "class B {",
|
| + " foo() { return new Foo<T>(); }",
|
| + "}"),
|
| + ResolverErrorCode.NO_SUCH_TYPE);
|
| + }
|
| +
|
| + public void testNewExpression6() {
|
| + resolveAndTest(Joiner.on("\n").join(
|
| + "class Object {}",
|
| + "interface int {}",
|
| + "interface A<T> default B<T> {",
|
| + " A.construct(); ",
|
| + "}",
|
| + "class B<T> implements A<T> {",
|
| + " B() { }",
|
| + " factory B.construct() { return new B<T>(); }",
|
| + "}"));
|
| }
|
|
|
| public void test_noSuchType_field() throws Exception {
|
|
|