| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 library members_test; | 5 library members_test; |
| 6 | 6 |
| 7 import 'package:expect/expect.dart'; | 7 import 'package:expect/expect.dart'; |
| 8 import "package:async_helper/async_helper.dart"; | 8 import "package:async_helper/async_helper.dart"; |
| 9 import 'type_test_helper.dart'; | 9 import 'type_test_helper.dart'; |
| 10 import 'package:compiler/src/elements/resolution_types.dart'; | 10 import 'package:compiler/src/elements/resolution_types.dart'; |
| 11 import "package:compiler/src/elements/elements.dart" | 11 import "package:compiler/src/elements/elements.dart" |
| 12 show Element, ClassElement, MemberSignature, Name, PublicName, Member; | 12 show Element, ClassElement, MemberSignature, Name, PublicName, Member; |
| 13 import "package:compiler/src/resolution/class_members.dart" | 13 import "package:compiler/src/resolution/class_members.dart" |
| 14 show MembersCreator, DeclaredMember, ErroneousMember, SyntheticMember; | 14 show MembersCreator, DeclaredMember, ErroneousMember, SyntheticMember; |
| 15 | 15 |
| 16 void main() { | 16 void main() { |
| 17 testClassMembers(); | 17 testClassMembers(); |
| 18 testInterfaceMembers(); | 18 testInterfaceMembers(); |
| 19 testClassVsInterfaceMembers(); | 19 testClassVsInterfaceMembers(); |
| 20 testMixinMembers(); | 20 testMixinMembers(); |
| 21 testMixinMembersWithoutImplements(); | 21 testMixinMembersWithoutImplements(); |
| 22 } | 22 } |
| 23 | 23 |
| 24 MemberSignature getMember(InterfaceType cls, String name, | 24 MemberSignature getMember(ResolutionInterfaceType cls, String name, |
| 25 {bool isSetter: false, int checkType: CHECK_INTERFACE}) { | 25 {bool isSetter: false, int checkType: CHECK_INTERFACE}) { |
| 26 Name memberName = new Name(name, cls.element.library, isSetter: isSetter); | 26 Name memberName = new Name(name, cls.element.library, isSetter: isSetter); |
| 27 MemberSignature member = checkType == CHECK_CLASS | 27 MemberSignature member = checkType == CHECK_CLASS |
| 28 ? cls.element.lookupClassMember(memberName) | 28 ? cls.element.lookupClassMember(memberName) |
| 29 : cls.element.lookupInterfaceMember(memberName); | 29 : cls.element.lookupInterfaceMember(memberName); |
| 30 if (member != null) { | 30 if (member != null) { |
| 31 Expect.equals(memberName, member.name); | 31 Expect.equals(memberName, member.name); |
| 32 } | 32 } |
| 33 return member; | 33 return member; |
| 34 } | 34 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 59 * to be synthesized for the corresponding members found on the type is | 59 * to be synthesized for the corresponding members found on the type is |
| 60 * [synthesizedFrom] or or [erroneousFrom], respectively. | 60 * [synthesizedFrom] or or [erroneousFrom], respectively. |
| 61 * Otherwise, if [declarer] is `null`, the declarer is checked to be [cls], and | 61 * Otherwise, if [declarer] is `null`, the declarer is checked to be [cls], and |
| 62 * if [declarer] is not `null`, the declarer is checked to be [declarer]. | 62 * if [declarer] is not `null`, the declarer is checked to be [declarer]. |
| 63 * If [type] is `null` it is checked that the type of the member is also the | 63 * If [type] is `null` it is checked that the type of the member is also the |
| 64 * member type, otherwise the type is checked to be [type]. | 64 * member type, otherwise the type is checked to be [type]. |
| 65 * | 65 * |
| 66 * If [isClassMember] is `true` it is checked that the member is also a class | 66 * If [isClassMember] is `true` it is checked that the member is also a class |
| 67 * member. | 67 * member. |
| 68 */ | 68 */ |
| 69 MemberSignature checkMember(InterfaceType cls, String name, | 69 MemberSignature checkMember(ResolutionInterfaceType cls, String name, |
| 70 {bool isStatic: false, | 70 {bool isStatic: false, |
| 71 bool isSetter: false, | 71 bool isSetter: false, |
| 72 bool isGetter: false, | 72 bool isGetter: false, |
| 73 InterfaceType declarer, | 73 ResolutionInterfaceType declarer, |
| 74 DartType type, | 74 ResolutionDartType type, |
| 75 FunctionType functionType, | 75 ResolutionFunctionType functionType, |
| 76 InterfaceType inheritedFrom, | 76 ResolutionInterfaceType inheritedFrom, |
| 77 List<InterfaceType> synthesizedFrom, | 77 List<ResolutionInterfaceType> synthesizedFrom, |
| 78 List<InterfaceType> erroneousFrom, | 78 List<ResolutionInterfaceType> erroneousFrom, |
| 79 int checkType: ALSO_CLASS_MEMBER}) { | 79 int checkType: ALSO_CLASS_MEMBER}) { |
| 80 String memberKind = checkType == CHECK_CLASS ? 'class' : 'interface'; | 80 String memberKind = checkType == CHECK_CLASS ? 'class' : 'interface'; |
| 81 MemberSignature member = | 81 MemberSignature member = |
| 82 getMember(cls, name, isSetter: isSetter, checkType: checkType); | 82 getMember(cls, name, isSetter: isSetter, checkType: checkType); |
| 83 Expect.isNotNull(member, "No $memberKind member '$name' in $cls."); | 83 Expect.isNotNull(member, "No $memberKind member '$name' in $cls."); |
| 84 Name memberName = member.name; | 84 Name memberName = member.name; |
| 85 if (checkType == ALSO_CLASS_MEMBER) { | 85 if (checkType == ALSO_CLASS_MEMBER) { |
| 86 MemberSignature classMember = cls.element.lookupClassMember(memberName); | 86 MemberSignature classMember = cls.element.lookupClassMember(memberName); |
| 87 Expect.isNotNull(classMember, "No class member '$memberName' in $cls."); | 87 Expect.isNotNull(classMember, "No class member '$memberName' in $cls."); |
| 88 Expect.equals(member, classMember); | 88 Expect.equals(member, classMember); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 106 "to interface members."); | 106 "to interface members."); |
| 107 if (synthesizedFrom != null) { | 107 if (synthesizedFrom != null) { |
| 108 Expect.isTrue( | 108 Expect.isTrue( |
| 109 member is SyntheticMember, "Member '$member' is not synthesized."); | 109 member is SyntheticMember, "Member '$member' is not synthesized."); |
| 110 } else { | 110 } else { |
| 111 Expect.isTrue( | 111 Expect.isTrue( |
| 112 member is ErroneousMember, "Member '$member' is not erroneous."); | 112 member is ErroneousMember, "Member '$member' is not erroneous."); |
| 113 } | 113 } |
| 114 Set<MemberSignature> members = new Set<MemberSignature>(); | 114 Set<MemberSignature> members = new Set<MemberSignature>(); |
| 115 List from = synthesizedFrom != null ? synthesizedFrom : erroneousFrom; | 115 List from = synthesizedFrom != null ? synthesizedFrom : erroneousFrom; |
| 116 for (InterfaceType type in from) { | 116 for (ResolutionInterfaceType type in from) { |
| 117 DeclaredMember inheritedMember = | 117 DeclaredMember inheritedMember = |
| 118 type.element.lookupInterfaceMember(memberName); | 118 type.element.lookupInterfaceMember(memberName); |
| 119 Expect.isNotNull(inheritedMember); | 119 Expect.isNotNull(inheritedMember); |
| 120 members.add(inheritedMember.inheritFrom(type)); | 120 members.add(inheritedMember.inheritFrom(type)); |
| 121 } | 121 } |
| 122 Expect.setEquals(members, member.declarations); | 122 Expect.setEquals(members, member.declarations); |
| 123 } else if (declarer != null) { | 123 } else if (declarer != null) { |
| 124 DeclaredMember declared = member; | 124 DeclaredMember declared = member; |
| 125 Expect.equals( | 125 Expect.equals( |
| 126 declarer, | 126 declarer, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 143 Expect.equals(member.type, member.functionType, | 143 Expect.equals(member.type, member.functionType, |
| 144 "Unexpected type of $memberKind member '$member'."); | 144 "Unexpected type of $memberKind member '$member'."); |
| 145 } | 145 } |
| 146 Expect.equals(functionType, member.functionType, | 146 Expect.equals(functionType, member.functionType, |
| 147 "Unexpected member type of $memberKind member '$member'."); | 147 "Unexpected member type of $memberKind member '$member'."); |
| 148 } | 148 } |
| 149 } | 149 } |
| 150 return member; | 150 return member; |
| 151 } | 151 } |
| 152 | 152 |
| 153 void checkMemberCount(InterfaceType cls, int expectedCount, | 153 void checkMemberCount(ResolutionInterfaceType cls, int expectedCount, |
| 154 {bool interfaceMembers: true}) { | 154 {bool interfaceMembers: true}) { |
| 155 int count = 0; | 155 int count = 0; |
| 156 if (interfaceMembers) { | 156 if (interfaceMembers) { |
| 157 cls.element.forEachInterfaceMember((_) => count++); | 157 cls.element.forEachInterfaceMember((_) => count++); |
| 158 } else { | 158 } else { |
| 159 cls.element.forEachClassMember((_) => count++); | 159 cls.element.forEachClassMember((_) => count++); |
| 160 } | 160 } |
| 161 Expect.equals(expectedCount, count); | 161 Expect.equals(expectedCount, count); |
| 162 } | 162 } |
| 163 | 163 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 184 void method(T t) {} | 184 void method(T t) {} |
| 185 static staticMethod() {} | 185 static staticMethod() {} |
| 186 toString([T t]) {} | 186 toString([T t]) {} |
| 187 } | 187 } |
| 188 class C<S> extends B<S> {} | 188 class C<S> extends B<S> {} |
| 189 class D extends C<int> {} | 189 class D extends C<int> {} |
| 190 class E extends D {} | 190 class E extends D {} |
| 191 """, | 191 """, |
| 192 useMockCompiler: false) | 192 useMockCompiler: false) |
| 193 .then((env) { | 193 .then((env) { |
| 194 InterfaceType bool_ = env['bool']; | 194 ResolutionInterfaceType bool_ = env['bool']; |
| 195 InterfaceType String_ = env['String']; | 195 ResolutionInterfaceType String_ = env['String']; |
| 196 InterfaceType num_ = env['num']; | 196 ResolutionInterfaceType num_ = env['num']; |
| 197 InterfaceType int_ = env['int']; | 197 ResolutionInterfaceType int_ = env['int']; |
| 198 DynamicType dynamic_ = env['dynamic']; | 198 ResolutionDynamicType dynamic_ = env['dynamic']; |
| 199 VoidType void_ = env['void']; | 199 ResolutionVoidType void_ = env['void']; |
| 200 InterfaceType Type_ = env['Type']; | 200 ResolutionInterfaceType Type_ = env['Type']; |
| 201 InterfaceType Invocation_ = env['Invocation']; | 201 ResolutionInterfaceType Invocation_ = env['Invocation']; |
| 202 | 202 |
| 203 InterfaceType Object_ = env['Object']; | 203 ResolutionInterfaceType Object_ = env['Object']; |
| 204 checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: true); | 204 checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: true); |
| 205 checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: false); | 205 checkMemberCount(Object_, 5 /*declared*/, interfaceMembers: false); |
| 206 | 206 |
| 207 checkMember(Object_, '==', | 207 checkMember(Object_, '==', |
| 208 functionType: env.functionType(bool_, [dynamic_])); | 208 functionType: env.functionType(bool_, [dynamic_])); |
| 209 checkMember(Object_, 'hashCode', | 209 checkMember(Object_, 'hashCode', |
| 210 isGetter: true, | 210 isGetter: true, |
| 211 type: int_, | 211 type: int_, |
| 212 functionType: env.functionType(int_, [])); | 212 functionType: env.functionType(int_, [])); |
| 213 checkMember(Object_, 'noSuchMethod', | 213 checkMember(Object_, 'noSuchMethod', |
| 214 functionType: env.functionType(dynamic_, [Invocation_])); | 214 functionType: env.functionType(dynamic_, [Invocation_])); |
| 215 checkMember(Object_, 'runtimeType', | 215 checkMember(Object_, 'runtimeType', |
| 216 isGetter: true, | 216 isGetter: true, |
| 217 type: Type_, | 217 type: Type_, |
| 218 functionType: env.functionType(Type_, [])); | 218 functionType: env.functionType(Type_, [])); |
| 219 checkMember(Object_, 'toString', | 219 checkMember(Object_, 'toString', |
| 220 functionType: env.functionType(String_, [])); | 220 functionType: env.functionType(String_, [])); |
| 221 | 221 |
| 222 InterfaceType A = env['A']; | 222 ResolutionInterfaceType A = env['A']; |
| 223 MembersCreator.computeAllClassMembers(env.resolution, A.element); | 223 MembersCreator.computeAllClassMembers(env.resolution, A.element); |
| 224 | 224 |
| 225 checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/, | 225 checkMemberCount(A, 5 /*inherited*/ + 9 /*non-static declared*/, |
| 226 interfaceMembers: true); | 226 interfaceMembers: true); |
| 227 checkMemberCount( | 227 checkMemberCount( |
| 228 A, | 228 A, |
| 229 5 /*inherited*/ + | 229 5 /*inherited*/ + |
| 230 9 /*non-abstract declared*/ + | 230 9 /*non-abstract declared*/ + |
| 231 3 /* abstract declared */, | 231 3 /* abstract declared */, |
| 232 interfaceMembers: false); | 232 interfaceMembers: false); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 checkMember(A, 'method', functionType: env.functionType(dynamic_, [])); | 282 checkMember(A, 'method', functionType: env.functionType(dynamic_, [])); |
| 283 checkMember(A, 'abstractMethod', | 283 checkMember(A, 'abstractMethod', |
| 284 functionType: env.functionType(dynamic_, [])); | 284 functionType: env.functionType(dynamic_, [])); |
| 285 checkMember(A, 'staticMethod', | 285 checkMember(A, 'staticMethod', |
| 286 checkType: CHECK_CLASS, | 286 checkType: CHECK_CLASS, |
| 287 isStatic: true, | 287 isStatic: true, |
| 288 functionType: env.functionType(dynamic_, [])); | 288 functionType: env.functionType(dynamic_, [])); |
| 289 | 289 |
| 290 ClassElement B = env.getElement('B'); | 290 ClassElement B = env.getElement('B'); |
| 291 MembersCreator.computeAllClassMembers(env.resolution, B); | 291 MembersCreator.computeAllClassMembers(env.resolution, B); |
| 292 InterfaceType B_this = B.thisType; | 292 ResolutionInterfaceType B_this = B.thisType; |
| 293 TypeVariableType B_T = B_this.typeArguments.first; | 293 ResolutionTypeVariableType B_T = B_this.typeArguments.first; |
| 294 checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/, | 294 checkMemberCount(B_this, 4 /*inherited*/ + 4 /*non-static declared*/, |
| 295 interfaceMembers: true); | 295 interfaceMembers: true); |
| 296 checkMemberCount(B_this, 4 /*inherited*/ + 5 /*declared*/, | 296 checkMemberCount(B_this, 4 /*inherited*/ + 5 /*declared*/, |
| 297 interfaceMembers: false); | 297 interfaceMembers: false); |
| 298 | 298 |
| 299 checkMember(B_this, '==', inheritedFrom: Object_); | 299 checkMember(B_this, '==', inheritedFrom: Object_); |
| 300 checkMember(B_this, 'hashCode', inheritedFrom: Object_); | 300 checkMember(B_this, 'hashCode', inheritedFrom: Object_); |
| 301 checkMember(B_this, 'noSuchMethod', inheritedFrom: Object_); | 301 checkMember(B_this, 'noSuchMethod', inheritedFrom: Object_); |
| 302 checkMember(B_this, 'runtimeType', inheritedFrom: Object_); | 302 checkMember(B_this, 'runtimeType', inheritedFrom: Object_); |
| 303 | 303 |
| 304 checkMember(B_this, 'field', | 304 checkMember(B_this, 'field', |
| 305 isGetter: true, type: B_T, functionType: env.functionType(B_T, [])); | 305 isGetter: true, type: B_T, functionType: env.functionType(B_T, [])); |
| 306 checkMember(B_this, 'field', | 306 checkMember(B_this, 'field', |
| 307 isSetter: true, | 307 isSetter: true, |
| 308 type: B_T, | 308 type: B_T, |
| 309 functionType: env.functionType(void_, [B_T])); | 309 functionType: env.functionType(void_, [B_T])); |
| 310 checkMember(B_this, 'method', | 310 checkMember(B_this, 'method', |
| 311 functionType: env.functionType(void_, [B_T])); | 311 functionType: env.functionType(void_, [B_T])); |
| 312 checkMember(B_this, 'staticMethod', | 312 checkMember(B_this, 'staticMethod', |
| 313 checkType: CHECK_CLASS, | 313 checkType: CHECK_CLASS, |
| 314 isStatic: true, | 314 isStatic: true, |
| 315 functionType: env.functionType(dynamic_, [])); | 315 functionType: env.functionType(dynamic_, [])); |
| 316 checkMember(B_this, 'toString', | 316 checkMember(B_this, 'toString', |
| 317 functionType: | 317 functionType: |
| 318 env.functionType(dynamic_, [], optionalParameters: [B_T])); | 318 env.functionType(dynamic_, [], optionalParameters: [B_T])); |
| 319 | 319 |
| 320 ClassElement C = env.getElement('C'); | 320 ClassElement C = env.getElement('C'); |
| 321 MembersCreator.computeAllClassMembers(env.resolution, C); | 321 MembersCreator.computeAllClassMembers(env.resolution, C); |
| 322 InterfaceType C_this = C.thisType; | 322 ResolutionInterfaceType C_this = C.thisType; |
| 323 TypeVariableType C_S = C_this.typeArguments.first; | 323 ResolutionTypeVariableType C_S = C_this.typeArguments.first; |
| 324 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true); | 324 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: true); |
| 325 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: false); | 325 checkMemberCount(C_this, 8 /*inherited*/, interfaceMembers: false); |
| 326 InterfaceType B_S = instantiate(B, [C_S]); | 326 ResolutionInterfaceType B_S = instantiate(B, [C_S]); |
| 327 | 327 |
| 328 checkMember(C_this, '==', inheritedFrom: Object_); | 328 checkMember(C_this, '==', inheritedFrom: Object_); |
| 329 checkMember(C_this, 'hashCode', inheritedFrom: Object_); | 329 checkMember(C_this, 'hashCode', inheritedFrom: Object_); |
| 330 checkMember(C_this, 'noSuchMethod', inheritedFrom: Object_); | 330 checkMember(C_this, 'noSuchMethod', inheritedFrom: Object_); |
| 331 checkMember(C_this, 'runtimeType', inheritedFrom: Object_); | 331 checkMember(C_this, 'runtimeType', inheritedFrom: Object_); |
| 332 | 332 |
| 333 checkMember(C_this, 'field', | 333 checkMember(C_this, 'field', |
| 334 isGetter: true, | 334 isGetter: true, |
| 335 declarer: B_S, | 335 declarer: B_S, |
| 336 type: C_S, | 336 type: C_S, |
| 337 functionType: env.functionType(C_S, [])); | 337 functionType: env.functionType(C_S, [])); |
| 338 checkMember(C_this, 'field', | 338 checkMember(C_this, 'field', |
| 339 isSetter: true, | 339 isSetter: true, |
| 340 declarer: B_S, | 340 declarer: B_S, |
| 341 type: C_S, | 341 type: C_S, |
| 342 functionType: env.functionType(void_, [C_S])); | 342 functionType: env.functionType(void_, [C_S])); |
| 343 checkMember(C_this, 'method', | 343 checkMember(C_this, 'method', |
| 344 declarer: B_S, functionType: env.functionType(void_, [C_S])); | 344 declarer: B_S, functionType: env.functionType(void_, [C_S])); |
| 345 checkMember(C_this, 'toString', | 345 checkMember(C_this, 'toString', |
| 346 declarer: B_S, | 346 declarer: B_S, |
| 347 functionType: | 347 functionType: |
| 348 env.functionType(dynamic_, [], optionalParameters: [C_S])); | 348 env.functionType(dynamic_, [], optionalParameters: [C_S])); |
| 349 | 349 |
| 350 InterfaceType D = env['D']; | 350 ResolutionInterfaceType D = env['D']; |
| 351 MembersCreator.computeAllClassMembers(env.resolution, D.element); | 351 MembersCreator.computeAllClassMembers(env.resolution, D.element); |
| 352 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true); | 352 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: true); |
| 353 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false); | 353 checkMemberCount(D, 8 /*inherited*/, interfaceMembers: false); |
| 354 InterfaceType B_int = instantiate(B, [int_]); | 354 ResolutionInterfaceType B_int = instantiate(B, [int_]); |
| 355 | 355 |
| 356 checkMember(D, '==', inheritedFrom: Object_); | 356 checkMember(D, '==', inheritedFrom: Object_); |
| 357 checkMember(D, 'hashCode', inheritedFrom: Object_); | 357 checkMember(D, 'hashCode', inheritedFrom: Object_); |
| 358 checkMember(D, 'noSuchMethod', inheritedFrom: Object_); | 358 checkMember(D, 'noSuchMethod', inheritedFrom: Object_); |
| 359 checkMember(D, 'runtimeType', inheritedFrom: Object_); | 359 checkMember(D, 'runtimeType', inheritedFrom: Object_); |
| 360 | 360 |
| 361 checkMember(D, 'field', | 361 checkMember(D, 'field', |
| 362 isGetter: true, | 362 isGetter: true, |
| 363 declarer: B_int, | 363 declarer: B_int, |
| 364 type: int_, | 364 type: int_, |
| 365 functionType: env.functionType(int_, [])); | 365 functionType: env.functionType(int_, [])); |
| 366 checkMember(D, 'field', | 366 checkMember(D, 'field', |
| 367 isSetter: true, | 367 isSetter: true, |
| 368 declarer: B_int, | 368 declarer: B_int, |
| 369 type: int_, | 369 type: int_, |
| 370 functionType: env.functionType(void_, [int_])); | 370 functionType: env.functionType(void_, [int_])); |
| 371 checkMember(D, 'method', | 371 checkMember(D, 'method', |
| 372 declarer: B_int, functionType: env.functionType(void_, [int_])); | 372 declarer: B_int, functionType: env.functionType(void_, [int_])); |
| 373 checkMember(D, 'toString', | 373 checkMember(D, 'toString', |
| 374 declarer: B_int, | 374 declarer: B_int, |
| 375 functionType: | 375 functionType: |
| 376 env.functionType(dynamic_, [], optionalParameters: [int_])); | 376 env.functionType(dynamic_, [], optionalParameters: [int_])); |
| 377 | 377 |
| 378 InterfaceType E = env['E']; | 378 ResolutionInterfaceType E = env['E']; |
| 379 MembersCreator.computeAllClassMembers(env.resolution, E.element); | 379 MembersCreator.computeAllClassMembers(env.resolution, E.element); |
| 380 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true); | 380 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: true); |
| 381 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false); | 381 checkMemberCount(E, 8 /*inherited*/, interfaceMembers: false); |
| 382 | 382 |
| 383 checkMember(E, '==', inheritedFrom: Object_); | 383 checkMember(E, '==', inheritedFrom: Object_); |
| 384 checkMember(E, 'hashCode', inheritedFrom: Object_); | 384 checkMember(E, 'hashCode', inheritedFrom: Object_); |
| 385 checkMember(E, 'noSuchMethod', inheritedFrom: Object_); | 385 checkMember(E, 'noSuchMethod', inheritedFrom: Object_); |
| 386 checkMember(E, 'runtimeType', inheritedFrom: Object_); | 386 checkMember(E, 'runtimeType', inheritedFrom: Object_); |
| 387 | 387 |
| 388 checkMember(E, 'field', | 388 checkMember(E, 'field', |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 set setter2(num _); | 443 set setter2(num _); |
| 444 void set setter3(int _); | 444 void set setter3(int _); |
| 445 getterAndMethod(); | 445 getterAndMethod(); |
| 446 } | 446 } |
| 447 abstract class C { | 447 abstract class C { |
| 448 int method3(); | 448 int method3(); |
| 449 num method4(); | 449 num method4(); |
| 450 } | 450 } |
| 451 abstract class D implements A, B, C {} | 451 abstract class D implements A, B, C {} |
| 452 """).then((env) { | 452 """).then((env) { |
| 453 DynamicType dynamic_ = env['dynamic']; | 453 ResolutionDynamicType dynamic_ = env['dynamic']; |
| 454 VoidType void_ = env['void']; | 454 ResolutionVoidType void_ = env['void']; |
| 455 InterfaceType num_ = env['num']; | 455 ResolutionInterfaceType num_ = env['num']; |
| 456 InterfaceType int_ = env['int']; | 456 ResolutionInterfaceType int_ = env['int']; |
| 457 | 457 |
| 458 InterfaceType A = env['A']; | 458 ResolutionInterfaceType A = env['A']; |
| 459 InterfaceType B = env['B']; | 459 ResolutionInterfaceType B = env['B']; |
| 460 InterfaceType C = env['C']; | 460 ResolutionInterfaceType C = env['C']; |
| 461 InterfaceType D = env['D']; | 461 ResolutionInterfaceType D = env['D']; |
| 462 | 462 |
| 463 // Ensure that members have been computed on all classes. | 463 // Ensure that members have been computed on all classes. |
| 464 MembersCreator.computeAllClassMembers(env.resolution, D.element); | 464 MembersCreator.computeAllClassMembers(env.resolution, D.element); |
| 465 | 465 |
| 466 // A: num method1() | 466 // A: num method1() |
| 467 // B: int method1() | 467 // B: int method1() |
| 468 // D: dynamic method1() -- synthesized from A and B. | 468 // D: dynamic method1() -- synthesized from A and B. |
| 469 checkMember(D, 'method1', | 469 checkMember(D, 'method1', |
| 470 synthesizedFrom: [A, B], | 470 synthesizedFrom: [A, B], |
| 471 functionType: env.functionType(dynamic_, []), | 471 functionType: env.functionType(dynamic_, []), |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 class A { | 613 class A { |
| 614 method1() {} | 614 method1() {} |
| 615 method2() {} | 615 method2() {} |
| 616 } | 616 } |
| 617 abstract class B { | 617 abstract class B { |
| 618 method1(); | 618 method1(); |
| 619 method2(a); | 619 method2(a); |
| 620 } | 620 } |
| 621 abstract class C extends A implements B {} | 621 abstract class C extends A implements B {} |
| 622 """).then((env) { | 622 """).then((env) { |
| 623 DynamicType dynamic_ = env['dynamic']; | 623 ResolutionDynamicType dynamic_ = env['dynamic']; |
| 624 VoidType void_ = env['void']; | 624 ResolutionVoidType void_ = env['void']; |
| 625 InterfaceType num_ = env['num']; | 625 ResolutionInterfaceType num_ = env['num']; |
| 626 InterfaceType int_ = env['int']; | 626 ResolutionInterfaceType int_ = env['int']; |
| 627 | 627 |
| 628 InterfaceType A = env['A']; | 628 ResolutionInterfaceType A = env['A']; |
| 629 InterfaceType B = env['B']; | 629 ResolutionInterfaceType B = env['B']; |
| 630 InterfaceType C = env['C']; | 630 ResolutionInterfaceType C = env['C']; |
| 631 | 631 |
| 632 // Ensure that members have been computed on all classes. | 632 // Ensure that members have been computed on all classes. |
| 633 MembersCreator.computeAllClassMembers(env.resolution, C.element); | 633 MembersCreator.computeAllClassMembers(env.resolution, C.element); |
| 634 | 634 |
| 635 // A: method1() | 635 // A: method1() |
| 636 // B: method1() | 636 // B: method1() |
| 637 // C class: method1() -- inherited from A. | 637 // C class: method1() -- inherited from A. |
| 638 // C interface: dynamic method1() -- synthesized from A and B. | 638 // C interface: dynamic method1() -- synthesized from A and B. |
| 639 MemberSignature interfaceMember = checkMember(C, 'method1', | 639 MemberSignature interfaceMember = checkMember(C, 'method1', |
| 640 checkType: CHECK_INTERFACE, | 640 checkType: CHECK_INTERFACE, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 667 method3(T a) {} | 667 method3(T a) {} |
| 668 method4(T a) {} | 668 method4(T a) {} |
| 669 } | 669 } |
| 670 abstract class B<S> { | 670 abstract class B<S> { |
| 671 method1(); | 671 method1(); |
| 672 method2(a); | 672 method2(a); |
| 673 method3(S a) {} | 673 method3(S a) {} |
| 674 } | 674 } |
| 675 abstract class C<U, V> extends Object with A<U> implements B<V> {} | 675 abstract class C<U, V> extends Object with A<U> implements B<V> {} |
| 676 """).then((env) { | 676 """).then((env) { |
| 677 DynamicType dynamic_ = env['dynamic']; | 677 ResolutionDynamicType dynamic_ = env['dynamic']; |
| 678 VoidType void_ = env['void']; | 678 ResolutionVoidType void_ = env['void']; |
| 679 InterfaceType num_ = env['num']; | 679 ResolutionInterfaceType num_ = env['num']; |
| 680 InterfaceType int_ = env['int']; | 680 ResolutionInterfaceType int_ = env['int']; |
| 681 | 681 |
| 682 ClassElement A = env.getElement('A'); | 682 ClassElement A = env.getElement('A'); |
| 683 ClassElement B = env.getElement('B'); | 683 ClassElement B = env.getElement('B'); |
| 684 ClassElement C = env.getElement('C'); | 684 ClassElement C = env.getElement('C'); |
| 685 InterfaceType C_this = C.thisType; | 685 ResolutionInterfaceType C_this = C.thisType; |
| 686 TypeVariableType C_U = C_this.typeArguments[0]; | 686 ResolutionTypeVariableType C_U = C_this.typeArguments[0]; |
| 687 TypeVariableType C_V = C_this.typeArguments[1]; | 687 ResolutionTypeVariableType C_V = C_this.typeArguments[1]; |
| 688 InterfaceType A_U = instantiate(A, [C_U]); | 688 ResolutionInterfaceType A_U = instantiate(A, [C_U]); |
| 689 InterfaceType B_V = instantiate(B, [C_V]); | 689 ResolutionInterfaceType B_V = instantiate(B, [C_V]); |
| 690 | 690 |
| 691 // Ensure that members have been computed on all classes. | 691 // Ensure that members have been computed on all classes. |
| 692 MembersCreator.computeAllClassMembers(env.resolution, C); | 692 MembersCreator.computeAllClassMembers(env.resolution, C); |
| 693 | 693 |
| 694 // A: method1() | 694 // A: method1() |
| 695 // B: method1() | 695 // B: method1() |
| 696 // C class: method1() -- inherited from A. | 696 // C class: method1() -- inherited from A. |
| 697 // C interface: dynamic method1() -- synthesized from A and B. | 697 // C interface: dynamic method1() -- synthesized from A and B. |
| 698 MemberSignature interfaceMember = checkMember(C_this, 'method1', | 698 MemberSignature interfaceMember = checkMember(C_this, 'method1', |
| 699 checkType: CHECK_INTERFACE, | 699 checkType: CHECK_INTERFACE, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 | 739 |
| 740 void testMixinMembersWithoutImplements() { | 740 void testMixinMembersWithoutImplements() { |
| 741 asyncTest(() => TypeEnvironment.create(r""" | 741 asyncTest(() => TypeEnvironment.create(r""" |
| 742 abstract class A { | 742 abstract class A { |
| 743 m(); | 743 m(); |
| 744 } | 744 } |
| 745 abstract class B implements A { | 745 abstract class B implements A { |
| 746 } | 746 } |
| 747 abstract class C extends Object with B {} | 747 abstract class C extends Object with B {} |
| 748 """).then((env) { | 748 """).then((env) { |
| 749 DynamicType dynamic_ = env['dynamic']; | 749 ResolutionDynamicType dynamic_ = env['dynamic']; |
| 750 VoidType void_ = env['void']; | 750 ResolutionVoidType void_ = env['void']; |
| 751 InterfaceType num_ = env['num']; | 751 ResolutionInterfaceType num_ = env['num']; |
| 752 InterfaceType int_ = env['int']; | 752 ResolutionInterfaceType int_ = env['int']; |
| 753 | 753 |
| 754 InterfaceType A = env['A']; | 754 ResolutionInterfaceType A = env['A']; |
| 755 InterfaceType B = env['B']; | 755 ResolutionInterfaceType B = env['B']; |
| 756 InterfaceType C = env['C']; | 756 ResolutionInterfaceType C = env['C']; |
| 757 | 757 |
| 758 // Ensure that members have been computed on all classes. | 758 // Ensure that members have been computed on all classes. |
| 759 MembersCreator.computeAllClassMembers(env.resolution, C.element); | 759 MembersCreator.computeAllClassMembers(env.resolution, C.element); |
| 760 | 760 |
| 761 checkMember(C, 'm', | 761 checkMember(C, 'm', |
| 762 checkType: NO_CLASS_MEMBER, | 762 checkType: NO_CLASS_MEMBER, |
| 763 inheritedFrom: A, | 763 inheritedFrom: A, |
| 764 functionType: env.functionType(dynamic_, [])); | 764 functionType: env.functionType(dynamic_, [])); |
| 765 })); | 765 })); |
| 766 } | 766 } |
| OLD | NEW |