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

Side by Side 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, 3 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 unified diff | Download patch
« no previous file with comments | « pkg/kernel/lib/src/incremental_class_hierarchy.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'package:kernel/ast.dart'; 5 import 'package:kernel/ast.dart';
6 import 'package:kernel/class_hierarchy.dart'; 6 import 'package:kernel/class_hierarchy.dart';
7 import 'package:kernel/core_types.dart'; 7 import 'package:kernel/core_types.dart';
8 import 'package:kernel/src/incremental_class_hierarchy.dart'; 8 import 'package:kernel/src/incremental_class_hierarchy.dart';
9 import 'package:kernel/testing/mock_sdk_program.dart'; 9 import 'package:kernel/testing/mock_sdk_program.dart';
10 import 'package:kernel/text/ast_to_text.dart'; 10 import 'package:kernel/text/ast_to_text.dart';
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 Class addImplementsClass(String name, List<Class> implements_) { 123 Class addImplementsClass(String name, List<Class> implements_) {
124 return addClass(new Class( 124 return addClass(new Class(
125 name: name, 125 name: name,
126 supertype: objectSuper, 126 supertype: objectSuper,
127 implementedTypes: implements_.map((c) => c.asThisSupertype).toList())); 127 implementedTypes: implements_.map((c) => c.asThisSupertype).toList()));
128 } 128 }
129 129
130 ClassHierarchy createClassHierarchy(Program program); 130 ClassHierarchy createClassHierarchy(Program program);
131 131
132 Procedure newEmptyGetter(String name, 132 Procedure newEmptyGetter(String name,
133 {DartType returnType: const DynamicType()}) { 133 {DartType returnType: const DynamicType(), bool isAbstract: false}) {
134 var body = new Block([new ReturnStatement(new NullLiteral())]); 134 var body =
135 isAbstract ? null : new Block([new ReturnStatement(new NullLiteral())]);
135 return new Procedure(new Name(name), ProcedureKind.Getter, 136 return new Procedure(new Name(name), ProcedureKind.Getter,
136 new FunctionNode(body, returnType: returnType)); 137 new FunctionNode(body, returnType: returnType));
137 } 138 }
138 139
139 Procedure newEmptyMethod(String name, {bool isAbstract: false}) { 140 Procedure newEmptyMethod(String name, {bool isAbstract: false}) {
140 var body = isAbstract ? null : new Block([]); 141 var body = isAbstract ? null : new Block([]);
141 return new Procedure(new Name(name), ProcedureKind.Method, 142 return new Procedure(new Name(name), ProcedureKind.Method,
142 new FunctionNode(body, returnType: const VoidType()), 143 new FunctionNode(body, returnType: const VoidType()),
143 isAbstract: isAbstract); 144 isAbstract: isAbstract);
144 } 145 }
145 146
146 Procedure newEmptySetter(String name, 147 Procedure newEmptySetter(String name,
147 {bool abstract: false, DartType type: const DynamicType()}) { 148 {bool isAbstract: false, DartType type: const DynamicType()}) {
148 var body = abstract ? null : new Block([]); 149 var body = isAbstract ? null : new Block([]);
149 return new Procedure( 150 return new Procedure(
150 new Name(name), 151 new Name(name),
151 ProcedureKind.Setter, 152 ProcedureKind.Setter,
152 new FunctionNode(body, 153 new FunctionNode(body,
153 returnType: const VoidType(), 154 returnType: const VoidType(),
154 positionalParameters: [new VariableDeclaration('_', type: type)])); 155 positionalParameters: [new VariableDeclaration('_', type: type)]));
155 } 156 }
156 157
157 void setUp() { 158 void setUp() {
158 // Start with mock SDK libraries. 159 // Start with mock SDK libraries.
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 expect(hierarchy.getInterfaceMember(b, aMethodName), aMethod); 916 expect(hierarchy.getInterfaceMember(b, aMethodName), aMethod);
916 expect(hierarchy.getInterfaceMember(b, bMethodName), bMethod); 917 expect(hierarchy.getInterfaceMember(b, bMethodName), bMethod);
917 expect(hierarchy.getInterfaceMember(b, aSetterName, setter: true), aSetter); 918 expect(hierarchy.getInterfaceMember(b, aSetterName, setter: true), aSetter);
918 expect(hierarchy.getInterfaceMember(b, bSetterName, setter: true), bSetter); 919 expect(hierarchy.getInterfaceMember(b, bSetterName, setter: true), bSetter);
919 expect(hierarchy.getInterfaceMember(c, aMethodName), aMethod); 920 expect(hierarchy.getInterfaceMember(c, aMethodName), aMethod);
920 expect(hierarchy.getInterfaceMember(c, bMethodName), bMethod); 921 expect(hierarchy.getInterfaceMember(c, bMethodName), bMethod);
921 expect(hierarchy.getInterfaceMember(c, aSetterName, setter: true), aSetter); 922 expect(hierarchy.getInterfaceMember(c, aSetterName, setter: true), aSetter);
922 expect(hierarchy.getInterfaceMember(c, bSetterName, setter: true), bSetter); 923 expect(hierarchy.getInterfaceMember(c, bSetterName, setter: true), bSetter);
923 } 924 }
924 925
926 void test_getInterfaceMembers_in_class() {
927 var method = newEmptyMethod('method');
928 var getter = newEmptyGetter('getter');
929 var setter = newEmptySetter('setter');
930 var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
931 var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
932 var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
933 var nonFinalField = new Field(new Name('nonFinalField'));
934 var finalField = new Field(new Name('finalField'), isFinal: true);
935 var a = addClass(new Class(
936 isAbstract: true,
937 name: 'A',
938 supertype: objectSuper,
939 fields: [
940 nonFinalField,
941 finalField
942 ],
943 procedures: [
944 method,
945 getter,
946 setter,
947 abstractMethod,
948 abstractGetter,
949 abstractSetter
950 ]));
951
952 _assertTestLibraryText('''
953 abstract class A {
954 field dynamic nonFinalField;
955 final field dynamic finalField;
956 method method() → void {}
957 get getter() → dynamic {
958 return null;
959 }
960 set setter(dynamic _) → void {}
961 abstract method abstractMethod() → void;
962 get abstractGetter() → dynamic;
963 set abstractSetter(dynamic _) → void;
964 }
965 ''');
966
967 expect(
968 hierarchy.getInterfaceMembers(a),
969 unorderedEquals([
970 method,
971 getter,
972 abstractMethod,
973 abstractGetter,
974 nonFinalField,
975 finalField
976 ]));
977 expect(hierarchy.getInterfaceMembers(a, setters: true),
978 unorderedEquals([setter, abstractSetter, nonFinalField]));
979 }
980
981 void test_getInterfaceMembers_inherited_or_mixed_in() {
982 var method = newEmptyMethod('method');
983 var getter = newEmptyGetter('getter');
984 var setter = newEmptySetter('setter');
985 var abstractMethod = newEmptyMethod('abstractMethod', isAbstract: true);
986 var abstractGetter = newEmptyGetter('abstractGetter', isAbstract: true);
987 var abstractSetter = newEmptySetter('abstractSetter', isAbstract: true);
988 var nonFinalField = new Field(new Name('nonFinalField'));
989 var finalField = new Field(new Name('finalField'), isFinal: true);
990
991 var a = addClass(new Class(name: 'A', supertype: objectSuper, fields: [
992 nonFinalField,
993 finalField
994 ], procedures: [
995 method,
996 getter,
997 setter,
998 abstractMethod,
999 abstractGetter,
1000 abstractSetter
1001 ]));
1002 var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
1003 var c = addClass(new Class(
1004 isAbstract: true,
1005 name: 'C',
1006 supertype: objectSuper,
1007 implementedTypes: [a.asThisSupertype]));
1008 var d = addClass(new Class(
1009 name: 'D', supertype: objectSuper, mixedInType: a.asThisSupertype));
1010
1011 _assertTestLibraryText('''
1012 class A {
1013 field dynamic nonFinalField;
1014 final field dynamic finalField;
1015 method method() → void {}
1016 get getter() → dynamic {
1017 return null;
1018 }
1019 set setter(dynamic _) → void {}
1020 abstract method abstractMethod() → void;
1021 get abstractGetter() → dynamic;
1022 set abstractSetter(dynamic _) → void;
1023 }
1024 class B extends self::A {}
1025 abstract class C implements self::A {}
1026 class D = core::Object with self::A {}
1027 ''');
1028
1029 var expectedGetters = [
1030 method,
1031 getter,
1032 abstractMethod,
1033 abstractGetter,
1034 nonFinalField,
1035 finalField
1036 ];
1037 expect(hierarchy.getInterfaceMembers(b), unorderedEquals(expectedGetters));
1038 var expectedSetters = [setter, abstractSetter, nonFinalField];
1039 expect(hierarchy.getInterfaceMembers(b, setters: true),
1040 unorderedEquals(expectedSetters));
1041 expect(hierarchy.getInterfaceMembers(c), unorderedEquals(expectedGetters));
1042 expect(hierarchy.getInterfaceMembers(c, setters: true),
1043 unorderedEquals(expectedSetters));
1044 expect(hierarchy.getInterfaceMembers(d), unorderedEquals(expectedGetters));
1045 expect(hierarchy.getInterfaceMembers(d, setters: true),
1046 unorderedEquals(expectedSetters));
1047 }
1048
1049 void test_getInterfaceMembers_multiple() {
1050 var method_a = newEmptyMethod('method');
1051 var getter_a = newEmptyGetter('getter');
1052 var setter_a = newEmptySetter('setter');
1053 var nonFinalField_a = new Field(new Name('nonFinalField'));
1054 var finalField_a = new Field(new Name('finalField'), isFinal: true);
1055 var method_b = newEmptyMethod('method');
1056 var getter_b = newEmptyGetter('getter');
1057 var setter_b = newEmptySetter('setter');
1058 var nonFinalField_b = new Field(new Name('nonFinalField'));
1059 var finalField_b = new Field(new Name('finalField'), isFinal: true);
1060
1061 var a = addClass(new Class(
1062 name: 'A',
1063 supertype: objectSuper,
1064 fields: [nonFinalField_a, finalField_a],
1065 procedures: [method_a, getter_a, setter_a]));
1066 var b = addClass(new Class(
1067 name: 'B',
1068 supertype: objectSuper,
1069 fields: [nonFinalField_b, finalField_b],
1070 procedures: [method_b, getter_b, setter_b]));
1071 var c = addClass(new Class(
1072 isAbstract: true,
1073 name: 'C',
1074 supertype: objectSuper,
1075 implementedTypes: [a.asThisSupertype, b.asThisSupertype]));
1076
1077 _assertTestLibraryText('''
1078 class A {
1079 field dynamic nonFinalField;
1080 final field dynamic finalField;
1081 method method() → void {}
1082 get getter() → dynamic {
1083 return null;
1084 }
1085 set setter(dynamic _) → void {}
1086 }
1087 class B {
1088 field dynamic nonFinalField;
1089 final field dynamic finalField;
1090 method method() → void {}
1091 get getter() → dynamic {
1092 return null;
1093 }
1094 set setter(dynamic _) → void {}
1095 }
1096 abstract class C implements self::A, self::B {}
1097 ''');
1098
1099 expect(
1100 hierarchy.getInterfaceMembers(c),
1101 unorderedEquals([
1102 method_a,
1103 getter_a,
1104 nonFinalField_a,
1105 finalField_a,
1106 method_b,
1107 getter_b,
1108 nonFinalField_b,
1109 finalField_b
1110 ]));
1111 expect(
1112 hierarchy.getInterfaceMembers(c, setters: true),
1113 unorderedEquals(
1114 [setter_a, nonFinalField_a, setter_b, nonFinalField_b]));
1115 }
1116
1117 void test_getInterfaceMembers_shadowed() {
1118 var method_a = newEmptyMethod('method');
1119 var nonShadowedMethod_a = newEmptyMethod('nonShadowedMethod');
1120 var getter_a = newEmptyGetter('getter');
1121 var setter_a = newEmptySetter('setter');
1122 var nonShadowedSetter_a = newEmptySetter('nonShadowedSetter');
1123 var nonFinalField_a = new Field(new Name('nonFinalField'));
1124 var finalField_a = new Field(new Name('finalField'), isFinal: true);
1125 var method_b = newEmptyMethod('method');
1126 var getter_b = newEmptyGetter('getter');
1127 var setter_b = newEmptySetter('setter');
1128 var nonFinalField_b = new Field(new Name('nonFinalField'));
1129 var finalField_b = new Field(new Name('finalField'), isFinal: true);
1130
1131 var a = addClass(new Class(name: 'A', supertype: objectSuper, fields: [
1132 nonFinalField_a,
1133 finalField_a
1134 ], procedures: [
1135 method_a,
1136 nonShadowedMethod_a,
1137 getter_a,
1138 setter_a,
1139 nonShadowedSetter_a
1140 ]));
1141 var b = addClass(new Class(
1142 name: 'B',
1143 supertype: a.asThisSupertype,
1144 fields: [nonFinalField_b, finalField_b],
1145 procedures: [method_b, getter_b, setter_b]));
1146
1147 _assertTestLibraryText('''
1148 class A {
1149 field dynamic nonFinalField;
1150 final field dynamic finalField;
1151 method method() → void {}
1152 method nonShadowedMethod() → void {}
1153 get getter() → dynamic {
1154 return null;
1155 }
1156 set setter(dynamic _) → void {}
1157 set nonShadowedSetter(dynamic _) → void {}
1158 }
1159 class B extends self::A {
1160 field dynamic nonFinalField;
1161 final field dynamic finalField;
1162 method method() → void {}
1163 get getter() → dynamic {
1164 return null;
1165 }
1166 set setter(dynamic _) → void {}
1167 }
1168 ''');
1169
1170 expect(
1171 hierarchy.getInterfaceMembers(b),
1172 unorderedEquals([
1173 nonShadowedMethod_a,
1174 method_b,
1175 getter_b,
1176 nonFinalField_b,
1177 finalField_b
1178 ]));
1179 expect(hierarchy.getInterfaceMembers(b, setters: true),
1180 unorderedEquals([nonShadowedSetter_a, setter_b, nonFinalField_b]));
1181 }
1182
925 void test_getOrderedClasses() { 1183 void test_getOrderedClasses() {
926 var a = addClass(new Class(name: 'A', supertype: objectSuper)); 1184 var a = addClass(new Class(name: 'A', supertype: objectSuper));
927 var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype)); 1185 var b = addClass(new Class(name: 'B', supertype: a.asThisSupertype));
928 var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype)); 1186 var c = addClass(new Class(name: 'C', supertype: b.asThisSupertype));
929 1187
930 void assertOrderOfClasses(List<Class> unordered, List<Class> expected) { 1188 void assertOrderOfClasses(List<Class> unordered, List<Class> expected) {
931 var ordered = hierarchy.getOrderedClasses(unordered); 1189 var ordered = hierarchy.getOrderedClasses(unordered);
932 expect(ordered, expected); 1190 expect(ordered, expected);
933 } 1191 }
934 1192
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 actualText = actualText.replaceAll(' extends core::Object', ''); 1300 actualText = actualText.replaceAll(' extends core::Object', '');
1043 1301
1044 if (actualText != expectedText) { 1302 if (actualText != expectedText) {
1045 print('-------- Actual --------'); 1303 print('-------- Actual --------');
1046 print(actualText + '------------------------'); 1304 print(actualText + '------------------------');
1047 } 1305 }
1048 1306
1049 expect(actualText, expectedText); 1307 expect(actualText, expectedText);
1050 } 1308 }
1051 } 1309 }
OLDNEW
« 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