| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |