| Index: pkg/kernel/test/class_hierarchy_test.dart
|
| diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
|
| index 2c0fbd026b3d5f7cc2fd44542fb4fa273ed76a29..054cbd5dae4fa2682512469e78fa06f5087a753e 100644
|
| --- a/pkg/kernel/test/class_hierarchy_test.dart
|
| +++ b/pkg/kernel/test/class_hierarchy_test.dart
|
| @@ -130,8 +130,9 @@ abstract class _ClassHierarchyTest {
|
| ClassHierarchy createClassHierarchy(Program program);
|
|
|
| Procedure newEmptyGetter(String name,
|
| - {DartType returnType: const DynamicType()}) {
|
| - var body = new Block([new ReturnStatement(new NullLiteral())]);
|
| + {DartType returnType: const DynamicType(), bool isAbstract: false}) {
|
| + var body =
|
| + isAbstract ? null : new Block([new ReturnStatement(new NullLiteral())]);
|
| return new Procedure(new Name(name), ProcedureKind.Getter,
|
| new FunctionNode(body, returnType: returnType));
|
| }
|
| @@ -144,8 +145,8 @@ abstract class _ClassHierarchyTest {
|
| }
|
|
|
| Procedure newEmptySetter(String name,
|
| - {bool abstract: false, DartType type: const DynamicType()}) {
|
| - var body = abstract ? null : new Block([]);
|
| + {bool isAbstract: false, DartType type: const DynamicType()}) {
|
| + var body = isAbstract ? null : new Block([]);
|
| return new Procedure(
|
| new Name(name),
|
| ProcedureKind.Setter,
|
| @@ -922,6 +923,263 @@ class C implements self::B {}
|
| expect(hierarchy.getInterfaceMember(c, bSetterName, setter: true), bSetter);
|
| }
|
|
|
| + void test_getInterfaceMembers_in_class() {
|
| + var method = newEmptyMethod('method');
|
| + var getter = newEmptyGetter('getter');
|
| + var setter = newEmptySetter('setter');
|
| + var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
|
| + var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
|
| + var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
|
| + var nonFinalField = new Field(new Name('nonFinalField'));
|
| + var finalField = new Field(new Name('finalField'), isFinal: true);
|
| + var a = addClass(new Class(
|
| + isAbstract: true,
|
| + name: 'A',
|
| + supertype: objectSuper,
|
| + fields: [
|
| + nonFinalField,
|
| + finalField
|
| + ],
|
| + procedures: [
|
| + method,
|
| + getter,
|
| + setter,
|
| + abstractMethod,
|
| + abstractGetter,
|
| + abstractSetter
|
| + ]));
|
| +
|
| + _assertTestLibraryText('''
|
| +abstract class A {
|
| + field dynamic nonFinalField;
|
| + final field dynamic finalField;
|
| + method method() → void {}
|
| + get getter() → dynamic {
|
| + return null;
|
| + }
|
| + set setter(dynamic _) → void {}
|
| + abstract method abstractMethod() → void;
|
| + get abstractGetter() → dynamic;
|
| + set abstractSetter(dynamic _) → void;
|
| +}
|
| +''');
|
| +
|
| + expect(
|
| + hierarchy.getInterfaceMembers(a),
|
| + unorderedEquals([
|
| + method,
|
| + getter,
|
| + abstractMethod,
|
| + abstractGetter,
|
| + nonFinalField,
|
| + finalField
|
| + ]));
|
| + expect(hierarchy.getInterfaceMembers(a, setters: true),
|
| + unorderedEquals([setter, abstractSetter, nonFinalField]));
|
| + }
|
| +
|
| + void test_getInterfaceMembers_inherited_or_mixed_in() {
|
| + var method = newEmptyMethod('method');
|
| + var getter = newEmptyGetter('getter');
|
| + var setter = newEmptySetter('setter');
|
| + var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
|
| + var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
|
| + var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
|
| + var nonFinalField = new Field(new Name('nonFinalField'));
|
| + var finalField = new Field(new Name('finalField'), isFinal: true);
|
| +
|
| + var a = addClass(new Class(name: 'A', supertype: objectSuper, fields: [
|
| + nonFinalField,
|
| + finalField
|
| + ], procedures: [
|
| + method,
|
| + getter,
|
| + setter,
|
| + abstractMethod,
|
| + abstractGetter,
|
| + abstractSetter
|
| + ]));
|
| + var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
|
| + var c = addClass(new Class(
|
| + isAbstract: true,
|
| + name: 'C',
|
| + supertype: objectSuper,
|
| + implementedTypes: [a.asThisSupertype]));
|
| + var d = addClass(new Class(
|
| + name: 'D', supertype: objectSuper, mixedInType: a.asThisSupertype));
|
| +
|
| + _assertTestLibraryText('''
|
| +class A {
|
| + field dynamic nonFinalField;
|
| + final field dynamic finalField;
|
| + method method() → void {}
|
| + get getter() → dynamic {
|
| + return null;
|
| + }
|
| + set setter(dynamic _) → void {}
|
| + abstract method abstractMethod() → void;
|
| + get abstractGetter() → dynamic;
|
| + set abstractSetter(dynamic _) → void;
|
| +}
|
| +class B extends self::A {}
|
| +abstract class C implements self::A {}
|
| +class D = core::Object with self::A {}
|
| +''');
|
| +
|
| + var expectedGetters = [
|
| + method,
|
| + getter,
|
| + abstractMethod,
|
| + abstractGetter,
|
| + nonFinalField,
|
| + finalField
|
| + ];
|
| + expect(hierarchy.getInterfaceMembers(b), unorderedEquals(expectedGetters));
|
| + var expectedSetters = [setter, abstractSetter, nonFinalField];
|
| + expect(hierarchy.getInterfaceMembers(b, setters: true),
|
| + unorderedEquals(expectedSetters));
|
| + expect(hierarchy.getInterfaceMembers(c), unorderedEquals(expectedGetters));
|
| + expect(hierarchy.getInterfaceMembers(c, setters: true),
|
| + unorderedEquals(expectedSetters));
|
| + expect(hierarchy.getInterfaceMembers(d), unorderedEquals(expectedGetters));
|
| + expect(hierarchy.getInterfaceMembers(d, setters: true),
|
| + unorderedEquals(expectedSetters));
|
| + }
|
| +
|
| + void test_getInterfaceMembers_multiple() {
|
| + var method_a = newEmptyMethod('method');
|
| + var getter_a = newEmptyGetter('getter');
|
| + var setter_a = newEmptySetter('setter');
|
| + var nonFinalField_a = new Field(new Name('nonFinalField'));
|
| + var finalField_a = new Field(new Name('finalField'), isFinal: true);
|
| + var method_b = newEmptyMethod('method');
|
| + var getter_b = newEmptyGetter('getter');
|
| + var setter_b = newEmptySetter('setter');
|
| + var nonFinalField_b = new Field(new Name('nonFinalField'));
|
| + var finalField_b = new Field(new Name('finalField'), isFinal: true);
|
| +
|
| + var a = addClass(new Class(
|
| + name: 'A',
|
| + supertype: objectSuper,
|
| + fields: [nonFinalField_a, finalField_a],
|
| + procedures: [method_a, getter_a, setter_a]));
|
| + var b = addClass(new Class(
|
| + name: 'B',
|
| + supertype: objectSuper,
|
| + fields: [nonFinalField_b, finalField_b],
|
| + procedures: [method_b, getter_b, setter_b]));
|
| + var c = addClass(new Class(
|
| + isAbstract: true,
|
| + name: 'C',
|
| + supertype: objectSuper,
|
| + implementedTypes: [a.asThisSupertype, b.asThisSupertype]));
|
| +
|
| + _assertTestLibraryText('''
|
| +class A {
|
| + field dynamic nonFinalField;
|
| + final field dynamic finalField;
|
| + method method() → void {}
|
| + get getter() → dynamic {
|
| + return null;
|
| + }
|
| + set setter(dynamic _) → void {}
|
| +}
|
| +class B {
|
| + field dynamic nonFinalField;
|
| + final field dynamic finalField;
|
| + method method() → void {}
|
| + get getter() → dynamic {
|
| + return null;
|
| + }
|
| + set setter(dynamic _) → void {}
|
| +}
|
| +abstract class C implements self::A, self::B {}
|
| +''');
|
| +
|
| + expect(
|
| + hierarchy.getInterfaceMembers(c),
|
| + unorderedEquals([
|
| + method_a,
|
| + getter_a,
|
| + nonFinalField_a,
|
| + finalField_a,
|
| + method_b,
|
| + getter_b,
|
| + nonFinalField_b,
|
| + finalField_b
|
| + ]));
|
| + expect(
|
| + hierarchy.getInterfaceMembers(c, setters: true),
|
| + unorderedEquals(
|
| + [setter_a, nonFinalField_a, setter_b, nonFinalField_b]));
|
| + }
|
| +
|
| + void test_getInterfaceMembers_shadowed() {
|
| + var method_a = newEmptyMethod('method');
|
| + var nonShadowedMethod_a = newEmptyMethod('nonShadowedMethod');
|
| + var getter_a = newEmptyGetter('getter');
|
| + var setter_a = newEmptySetter('setter');
|
| + var nonShadowedSetter_a = newEmptySetter('nonShadowedSetter');
|
| + var nonFinalField_a = new Field(new Name('nonFinalField'));
|
| + var finalField_a = new Field(new Name('finalField'), isFinal: true);
|
| + var method_b = newEmptyMethod('method');
|
| + var getter_b = newEmptyGetter('getter');
|
| + var setter_b = newEmptySetter('setter');
|
| + var nonFinalField_b = new Field(new Name('nonFinalField'));
|
| + var finalField_b = new Field(new Name('finalField'), isFinal: true);
|
| +
|
| + var a = addClass(new Class(name: 'A', supertype: objectSuper, fields: [
|
| + nonFinalField_a,
|
| + finalField_a
|
| + ], procedures: [
|
| + method_a,
|
| + nonShadowedMethod_a,
|
| + getter_a,
|
| + setter_a,
|
| + nonShadowedSetter_a
|
| + ]));
|
| + var b = addClass(new Class(
|
| + name: 'B',
|
| + supertype: a.asThisSupertype,
|
| + fields: [nonFinalField_b, finalField_b],
|
| + procedures: [method_b, getter_b, setter_b]));
|
| +
|
| + _assertTestLibraryText('''
|
| +class A {
|
| + field dynamic nonFinalField;
|
| + final field dynamic finalField;
|
| + method method() → void {}
|
| + method nonShadowedMethod() → void {}
|
| + get getter() → dynamic {
|
| + return null;
|
| + }
|
| + set setter(dynamic _) → void {}
|
| + set nonShadowedSetter(dynamic _) → void {}
|
| +}
|
| +class B extends self::A {
|
| + field dynamic nonFinalField;
|
| + final field dynamic finalField;
|
| + method method() → void {}
|
| + get getter() → dynamic {
|
| + return null;
|
| + }
|
| + set setter(dynamic _) → void {}
|
| +}
|
| +''');
|
| +
|
| + expect(
|
| + hierarchy.getInterfaceMembers(b),
|
| + unorderedEquals([
|
| + nonShadowedMethod_a,
|
| + method_b,
|
| + getter_b,
|
| + nonFinalField_b,
|
| + finalField_b
|
| + ]));
|
| + expect(hierarchy.getInterfaceMembers(b, setters: true),
|
| + unorderedEquals([nonShadowedSetter_a, setter_b, nonFinalField_b]));
|
| + }
|
| +
|
| void test_getOrderedClasses() {
|
| var a = addClass(new Class(name: 'A', supertype: objectSuper));
|
| var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
|
|
|