Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(712)

Unified Diff: pkg/kernel/test/class_hierarchy_test.dart

Issue 3003913002: Expose getInterfaceMembers method through ClassHierarchy. (Closed)
Patch Set: Address code review comments Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/kernel/lib/src/incremental_class_hierarchy.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
« no previous file with comments | « pkg/kernel/lib/src/incremental_class_hierarchy.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698