| 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 library dart2js.kernel.element_map; | 5 library dart2js.kernel.element_map; |
| 6 | 6 |
| 7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
| 8 | 8 |
| 9 import '../common.dart'; | 9 import '../common.dart'; |
| 10 import '../common/names.dart' show Identifiers; | 10 import '../common/names.dart' show Identifiers; |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 ClassEntity cls = getMember(context).enclosingClass; | 354 ClassEntity cls = getMember(context).enclosingClass; |
| 355 IndexedClass superclass = _getSuperType(cls)?.element; | 355 IndexedClass superclass = _getSuperType(cls)?.element; |
| 356 while (superclass != null) { | 356 while (superclass != null) { |
| 357 ClassEnv env = _classEnvs[superclass.classIndex]; | 357 ClassEnv env = _classEnvs[superclass.classIndex]; |
| 358 ir.Member superMember = env.lookupMember(name.name, setter: setter); | 358 ir.Member superMember = env.lookupMember(name.name, setter: setter); |
| 359 if (superMember != null) { | 359 if (superMember != null) { |
| 360 return getMember(superMember); | 360 return getMember(superMember); |
| 361 } | 361 } |
| 362 superclass = _getSuperType(superclass)?.element; | 362 superclass = _getSuperType(superclass)?.element; |
| 363 } | 363 } |
| 364 throw new SpannableAssertionFailure( | 364 throw failedAt(cls, "No super method member found for ${name} in $cls."); |
| 365 cls, "No super method member found for ${name} in $cls."); | |
| 366 } | 365 } |
| 367 | 366 |
| 368 @override | 367 @override |
| 369 ConstructorEntity getConstructor(ir.Member node) => _getConstructor(node); | 368 ConstructorEntity getConstructor(ir.Member node) => _getConstructor(node); |
| 370 | 369 |
| 371 ConstructorEntity _getConstructor(ir.Member node); | 370 ConstructorEntity _getConstructor(ir.Member node); |
| 372 | 371 |
| 373 ConstructorEntity getSuperConstructor( | 372 ConstructorEntity getSuperConstructor( |
| 374 ir.Constructor sourceNode, ir.Member targetNode) { | 373 ir.Constructor sourceNode, ir.Member targetNode) { |
| 375 ConstructorEntity source = getConstructor(sourceNode); | 374 ConstructorEntity source = getConstructor(sourceNode); |
| 376 ClassEntity sourceClass = source.enclosingClass; | 375 ClassEntity sourceClass = source.enclosingClass; |
| 377 ConstructorEntity target = getConstructor(targetNode); | 376 ConstructorEntity target = getConstructor(targetNode); |
| 378 ClassEntity targetClass = target.enclosingClass; | 377 ClassEntity targetClass = target.enclosingClass; |
| 379 IndexedClass superClass = _getSuperType(sourceClass)?.element; | 378 IndexedClass superClass = _getSuperType(sourceClass)?.element; |
| 380 if (superClass == targetClass) { | 379 if (superClass == targetClass) { |
| 381 return target; | 380 return target; |
| 382 } | 381 } |
| 383 ClassEnv env = _classEnvs[superClass.classIndex]; | 382 ClassEnv env = _classEnvs[superClass.classIndex]; |
| 384 ir.Member member = env.lookupConstructor(target.name); | 383 ir.Member member = env.lookupConstructor(target.name); |
| 385 if (member != null) { | 384 if (member != null) { |
| 386 return getConstructor(member); | 385 return getConstructor(member); |
| 387 } | 386 } |
| 388 throw new SpannableAssertionFailure( | 387 throw failedAt(source, "Super constructor for $source not found."); |
| 389 source, "Super constructor for $source not found."); | |
| 390 } | 388 } |
| 391 | 389 |
| 392 @override | 390 @override |
| 393 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); | 391 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); |
| 394 | 392 |
| 395 FunctionEntity _getMethod(ir.Procedure node); | 393 FunctionEntity _getMethod(ir.Procedure node); |
| 396 | 394 |
| 397 @override | 395 @override |
| 398 FieldEntity getField(ir.Field node) => _getField(node); | 396 FieldEntity getField(ir.Field node) => _getField(node); |
| 399 | 397 |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 bool isFromEnvironment = isExternal && | 761 bool isFromEnvironment = isExternal && |
| 764 name.text == 'fromEnvironment' && | 762 name.text == 'fromEnvironment' && |
| 765 const ['int', 'bool', 'String'].contains(enclosingClass.name); | 763 const ['int', 'bool', 'String'].contains(enclosingClass.name); |
| 766 constructor = createFactoryConstructor(memberIndex, enclosingClass, | 764 constructor = createFactoryConstructor(memberIndex, enclosingClass, |
| 767 name, _getParameterStructure(functionNode), | 765 name, _getParameterStructure(functionNode), |
| 768 isExternal: isExternal, | 766 isExternal: isExternal, |
| 769 isConst: node.isConst, | 767 isConst: node.isConst, |
| 770 isFromEnvironmentConstructor: isFromEnvironment); | 768 isFromEnvironmentConstructor: isFromEnvironment); |
| 771 } else { | 769 } else { |
| 772 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. | 770 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. |
| 773 throw new SpannableAssertionFailure( | 771 throw failedAt( |
| 774 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); | 772 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); |
| 775 } | 773 } |
| 776 _memberData.add(new ConstructorData(node, functionNode)); | 774 _memberData.add(new ConstructorData(node, functionNode)); |
| 777 _memberList.add(constructor); | 775 _memberList.add(constructor); |
| 778 return constructor; | 776 return constructor; |
| 779 }); | 777 }); |
| 780 } | 778 } |
| 781 | 779 |
| 782 FunctionEntity _getMethod(ir.Procedure node) { | 780 FunctionEntity _getMethod(ir.Procedure node) { |
| 783 return _methodMap.putIfAbsent(node, () { | 781 return _methodMap.putIfAbsent(node, () { |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1178 } | 1176 } |
| 1179 | 1177 |
| 1180 @override | 1178 @override |
| 1181 DartType getUnaliasedType(DartType type) => type; | 1179 DartType getUnaliasedType(DartType type) => type; |
| 1182 | 1180 |
| 1183 @override | 1181 @override |
| 1184 ConstructorEntity lookupConstructor(ClassEntity cls, String name, | 1182 ConstructorEntity lookupConstructor(ClassEntity cls, String name, |
| 1185 {bool required: false}) { | 1183 {bool required: false}) { |
| 1186 ConstructorEntity constructor = elementMap.lookupConstructor(cls, name); | 1184 ConstructorEntity constructor = elementMap.lookupConstructor(cls, name); |
| 1187 if (constructor == null && required) { | 1185 if (constructor == null && required) { |
| 1188 throw new SpannableAssertionFailure( | 1186 throw failedAt( |
| 1189 CURRENT_ELEMENT_SPANNABLE, | 1187 CURRENT_ELEMENT_SPANNABLE, |
| 1190 "The constructor '$name' was not found in class '${cls.name}' " | 1188 "The constructor '$name' was not found in class '${cls.name}' " |
| 1191 "in library ${cls.library.canonicalUri}."); | 1189 "in library ${cls.library.canonicalUri}."); |
| 1192 } | 1190 } |
| 1193 return constructor; | 1191 return constructor; |
| 1194 } | 1192 } |
| 1195 | 1193 |
| 1196 @override | 1194 @override |
| 1197 MemberEntity lookupClassMember(ClassEntity cls, String name, | 1195 MemberEntity lookupClassMember(ClassEntity cls, String name, |
| 1198 {bool setter: false, bool required: false}) { | 1196 {bool setter: false, bool required: false}) { |
| 1199 MemberEntity member = | 1197 MemberEntity member = |
| 1200 elementMap.lookupClassMember(cls, name, setter: setter); | 1198 elementMap.lookupClassMember(cls, name, setter: setter); |
| 1201 if (member == null && required) { | 1199 if (member == null && required) { |
| 1202 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 1200 throw failedAt(CURRENT_ELEMENT_SPANNABLE, |
| 1203 "The member '$name' was not found in ${cls.name}."); | 1201 "The member '$name' was not found in ${cls.name}."); |
| 1204 } | 1202 } |
| 1205 return member; | 1203 return member; |
| 1206 } | 1204 } |
| 1207 | 1205 |
| 1208 @override | 1206 @override |
| 1209 ClassEntity getSuperClass(ClassEntity cls, | 1207 ClassEntity getSuperClass(ClassEntity cls, |
| 1210 {bool skipUnnamedMixinApplications: false}) { | 1208 {bool skipUnnamedMixinApplications: false}) { |
| 1211 ClassEntity superclass = elementMap._getSuperType(cls)?.element; | 1209 ClassEntity superclass = elementMap._getSuperType(cls)?.element; |
| 1212 if (skipUnnamedMixinApplications) { | 1210 if (skipUnnamedMixinApplications) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1251 LibraryEntity library, void f(MemberEntity member)) { | 1249 LibraryEntity library, void f(MemberEntity member)) { |
| 1252 elementMap._forEachLibraryMember(library, f); | 1250 elementMap._forEachLibraryMember(library, f); |
| 1253 } | 1251 } |
| 1254 | 1252 |
| 1255 @override | 1253 @override |
| 1256 MemberEntity lookupLibraryMember(LibraryEntity library, String name, | 1254 MemberEntity lookupLibraryMember(LibraryEntity library, String name, |
| 1257 {bool setter: false, bool required: false}) { | 1255 {bool setter: false, bool required: false}) { |
| 1258 MemberEntity member = | 1256 MemberEntity member = |
| 1259 elementMap.lookupLibraryMember(library, name, setter: setter); | 1257 elementMap.lookupLibraryMember(library, name, setter: setter); |
| 1260 if (member == null && required) { | 1258 if (member == null && required) { |
| 1261 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 1259 failedAt(CURRENT_ELEMENT_SPANNABLE, |
| 1262 "The member '${name}' was not found in library '${library.name}'."); | 1260 "The member '${name}' was not found in library '${library.name}'."); |
| 1263 } | 1261 } |
| 1264 return member; | 1262 return member; |
| 1265 } | 1263 } |
| 1266 | 1264 |
| 1267 @override | 1265 @override |
| 1268 ClassEntity lookupClass(LibraryEntity library, String name, | 1266 ClassEntity lookupClass(LibraryEntity library, String name, |
| 1269 {bool required: false}) { | 1267 {bool required: false}) { |
| 1270 ClassEntity cls = elementMap.lookupClass(library, name); | 1268 ClassEntity cls = elementMap.lookupClass(library, name); |
| 1271 if (cls == null && required) { | 1269 if (cls == null && required) { |
| 1272 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, | 1270 failedAt(CURRENT_ELEMENT_SPANNABLE, |
| 1273 "The class '$name' was not found in library '${library.name}'."); | 1271 "The class '$name' was not found in library '${library.name}'."); |
| 1274 } | 1272 } |
| 1275 return cls; | 1273 return cls; |
| 1276 } | 1274 } |
| 1277 | 1275 |
| 1278 @override | 1276 @override |
| 1279 void forEachClass(LibraryEntity library, void f(ClassEntity cls)) { | 1277 void forEachClass(LibraryEntity library, void f(ClassEntity cls)) { |
| 1280 elementMap._forEachClass(library, f); | 1278 elementMap._forEachClass(library, f); |
| 1281 } | 1279 } |
| 1282 | 1280 |
| 1283 @override | 1281 @override |
| 1284 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { | 1282 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { |
| 1285 LibraryEntity library = elementMap.lookupLibrary(uri); | 1283 LibraryEntity library = elementMap.lookupLibrary(uri); |
| 1286 if (library == null && required) { | 1284 if (library == null && required) { |
| 1287 throw new SpannableAssertionFailure( | 1285 failedAt(CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); |
| 1288 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); | |
| 1289 } | 1286 } |
| 1290 return library; | 1287 return library; |
| 1291 } | 1288 } |
| 1292 | 1289 |
| 1293 @override | 1290 @override |
| 1294 bool isDeferredLoadLibraryGetter(MemberEntity member) { | 1291 bool isDeferredLoadLibraryGetter(MemberEntity member) { |
| 1295 // TODO(redemption): Support these. | 1292 // TODO(redemption): Support these. |
| 1296 return false; | 1293 return false; |
| 1297 } | 1294 } |
| 1298 | 1295 |
| (...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2009 if (data.constructorBody != null) { | 2006 if (data.constructorBody != null) { |
| 2010 f(data.constructorBody); | 2007 f(data.constructorBody); |
| 2011 } | 2008 } |
| 2012 }); | 2009 }); |
| 2013 } | 2010 } |
| 2014 | 2011 |
| 2015 String getDeferredUri(ir.LibraryDependency node) { | 2012 String getDeferredUri(ir.LibraryDependency node) { |
| 2016 throw new UnimplementedError('JsKernelToElementMap.getDeferredUri'); | 2013 throw new UnimplementedError('JsKernelToElementMap.getDeferredUri'); |
| 2017 } | 2014 } |
| 2018 } | 2015 } |
| OLD | NEW |