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

Side by Side Diff: pkg/compiler/lib/src/kernel/world_builder.dart

Issue 2797173004: Remove use of Element in ResolutionEnqueuerListener. (Closed)
Patch Set: Created 3 years, 8 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/compiler/lib/src/kernel/elements.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 library dart2js.kernel.world_builder; 5 library dart2js.kernel.world_builder;
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/backend_api.dart'; 10 import '../common/backend_api.dart';
11 import '../compile_time_constants.dart'; 11 import '../compile_time_constants.dart';
12 import '../constants/constant_system.dart'; 12 import '../constants/constant_system.dart';
13 import '../constants/constructors.dart'; 13 import '../constants/constructors.dart';
14 import '../constants/evaluation.dart'; 14 import '../constants/evaluation.dart';
15 import '../constants/expressions.dart'; 15 import '../constants/expressions.dart';
16 import '../constants/values.dart'; 16 import '../constants/values.dart';
17 import '../common_elements.dart'; 17 import '../common_elements.dart';
18 import '../elements/elements.dart'; 18 import '../elements/elements.dart';
19 import '../elements/entities.dart'; 19 import '../elements/entities.dart';
20 import '../elements/types.dart'; 20 import '../elements/types.dart';
21 import '../js_backend/backend_helpers.dart'; 21 import '../js_backend/backend_helpers.dart';
22 import '../js_backend/constant_system_javascript.dart'; 22 import '../js_backend/constant_system_javascript.dart';
23 import '../js_backend/no_such_method_registry.dart'; 23 import '../js_backend/no_such_method_registry.dart';
24 import '../native/native.dart' as native; 24 import '../native/native.dart' as native;
25 import '../native/resolver.dart'; 25 import '../native/resolver.dart';
26 import '../universe/call_structure.dart';
26 import 'element_adapter.dart'; 27 import 'element_adapter.dart';
27 import 'elements.dart'; 28 import 'elements.dart';
28 29
29 part 'native_class_resolver.dart'; 30 part 'native_class_resolver.dart';
30 part 'no_such_method_resolver.dart'; 31 part 'no_such_method_resolver.dart';
31 32
32 /// World builder used for creating elements and types corresponding to Kernel 33 /// World builder used for creating elements and types corresponding to Kernel
33 /// IR nodes. 34 /// IR nodes.
34 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. 35 // TODO(johnniwinther): Implement [ResolutionWorldBuilder].
35 class KernelWorldBuilder extends KernelElementAdapterMixin { 36 class KernelWorldBuilder extends KernelElementAdapterMixin {
(...skipping 12 matching lines...) Expand all
48 49
49 /// List of class environments by `KClass.classIndex`. This is used for 50 /// List of class environments by `KClass.classIndex`. This is used for
50 /// fast lookup into class members. 51 /// fast lookup into class members.
51 List<KClassEnv> _classEnvs = <KClassEnv>[]; 52 List<KClassEnv> _classEnvs = <KClassEnv>[];
52 53
53 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; 54 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{};
54 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; 55 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{};
55 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = 56 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap =
56 <ir.TypeParameter, KTypeVariable>{}; 57 <ir.TypeParameter, KTypeVariable>{};
57 58
59 // TODO(johnniwinther): Change this to a list of 'KMemberData' class if we
60 // need more data for members.
61 List<ir.Member> _memberList = <ir.Member>[];
62
58 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; 63 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{};
59 // TODO(johnniwinther): Change this to a list of 'KConstructorData' class
60 // holding the [ConstantConstructor] if we need more data for constructors.
61 List<ir.Member> _constructorList = <ir.Member>[];
62 Map<KConstructor, ConstantConstructor> _constructorConstantMap = 64 Map<KConstructor, ConstantConstructor> _constructorConstantMap =
63 <KConstructor, ConstantConstructor>{}; 65 <KConstructor, ConstantConstructor>{};
64 66
65 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; 67 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{};
66 68
67 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; 69 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{};
68 // TODO(johnniwinther): Change this to a list of 'KFieldData' class
69 // holding the [ConstantExpression] if we need more data for fields.
70 List<ir.Field> _fieldList = <ir.Field>[];
71 Map<KField, ConstantExpression> _fieldConstantMap = 70 Map<KField, ConstantExpression> _fieldConstantMap =
72 <KField, ConstantExpression>{}; 71 <KField, ConstantExpression>{};
73 72
74 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = 73 Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
75 <ir.TreeNode, KLocalFunction>{}; 74 <ir.TreeNode, KLocalFunction>{};
76 75
77 KernelWorldBuilder(this.reporter, ir.Program program) 76 KernelWorldBuilder(this.reporter, ir.Program program)
78 : _env = new KEnv(program) { 77 : _env = new KEnv(program) {
79 _elementEnvironment = new KernelElementEnvironment(this); 78 _elementEnvironment = new KernelElementEnvironment(this);
80 _commonElements = new CommonElementsImpl(_elementEnvironment); 79 _commonElements = new CommonElementsImpl(_elementEnvironment);
(...skipping 24 matching lines...) Expand all
105 @override 104 @override
106 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; 105 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder;
107 106
108 LibraryEntity lookupLibrary(Uri uri) { 107 LibraryEntity lookupLibrary(Uri uri) {
109 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); 108 KLibraryEnv libraryEnv = _env.lookupLibrary(uri);
110 return _getLibrary(libraryEnv.library, libraryEnv); 109 return _getLibrary(libraryEnv.library, libraryEnv);
111 } 110 }
112 111
113 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { 112 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) {
114 return _libraryMap.putIfAbsent(node, () { 113 return _libraryMap.putIfAbsent(node, () {
115 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(node.importUri)); 114 Uri canonicalUri = node.importUri;
115 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri));
116 String name = node.name; 116 String name = node.name;
117 if (name == null) { 117 if (name == null) {
118 // Use the file name as script name. 118 // Use the file name as script name.
119 String path = node.importUri.path; 119 String path = canonicalUri.path;
120 name = path.substring(path.lastIndexOf('/') + 1); 120 name = path.substring(path.lastIndexOf('/') + 1);
121 } 121 }
122 return new KLibrary(_libraryMap.length, name); 122 return new KLibrary(_libraryMap.length, name, canonicalUri);
123 }); 123 });
124 } 124 }
125 125
126 MemberEntity lookupLibraryMember(KLibrary library, String name, 126 MemberEntity lookupLibraryMember(KLibrary library, String name,
127 {bool setter: false}) { 127 {bool setter: false}) {
128 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; 128 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
129 ir.Member member = libraryEnv.lookupMember(name, setter: setter); 129 ir.Member member = libraryEnv.lookupMember(name, setter: setter);
130 return member != null ? getMember(member) : null; 130 return member != null ? getMember(member) : null;
131 } 131 }
132 132
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 return new KTypeVariable(_getMethod(procedure), node.name, index); 187 return new KTypeVariable(_getMethod(procedure), node.name, index);
188 } 188 }
189 } 189 }
190 } 190 }
191 throw new UnsupportedError('Unsupported type parameter type node $node.'); 191 throw new UnsupportedError('Unsupported type parameter type node $node.');
192 }); 192 });
193 } 193 }
194 194
195 KConstructor _getConstructor(ir.Member node) { 195 KConstructor _getConstructor(ir.Member node) {
196 return _constructorMap.putIfAbsent(node, () { 196 return _constructorMap.putIfAbsent(node, () {
197 int constructorIndex = _constructorList.length; 197 int memberIndex = _memberList.length;
198 KConstructor constructor; 198 KConstructor constructor;
199 KClass enclosingClass = _getClass(node.enclosingClass); 199 KClass enclosingClass = _getClass(node.enclosingClass);
200 Name name = getName(node.name); 200 Name name = getName(node.name);
201 bool isExternal = node.isExternal; 201 bool isExternal = node.isExternal;
202 if (node is ir.Constructor) { 202 if (node is ir.Constructor) {
203 constructor = new KGenerativeConstructor( 203 constructor = new KGenerativeConstructor(
204 constructorIndex, enclosingClass, name, 204 memberIndex, enclosingClass, name,
205 isExternal: isExternal); 205 isExternal: isExternal, isConst: node.isConst);
206 } else if (node is ir.Procedure) {
207 constructor = new KFactoryConstructor(memberIndex, enclosingClass, name,
208 isExternal: isExternal, isConst: node.isConst);
206 } else { 209 } else {
207 constructor = new KFactoryConstructor( 210 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
208 constructorIndex, enclosingClass, name, 211 throw new SpannableAssertionFailure(
209 isExternal: isExternal); 212 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
210 } 213 }
211 _constructorList.add(node); 214 _memberList.add(node);
212 return constructor; 215 return constructor;
213 }); 216 });
214 } 217 }
215 218
216 KFunction _getMethod(ir.Procedure node) { 219 KFunction _getMethod(ir.Procedure node) {
217 return _methodMap.putIfAbsent(node, () { 220 return _methodMap.putIfAbsent(node, () {
221 int memberIndex = _memberList.length;
218 KLibrary library; 222 KLibrary library;
219 KClass enclosingClass; 223 KClass enclosingClass;
220 if (node.enclosingClass != null) { 224 if (node.enclosingClass != null) {
221 enclosingClass = _getClass(node.enclosingClass); 225 enclosingClass = _getClass(node.enclosingClass);
222 library = enclosingClass.library; 226 library = enclosingClass.library;
223 } else { 227 } else {
224 library = _getLibrary(node.enclosingLibrary); 228 library = _getLibrary(node.enclosingLibrary);
225 } 229 }
226 Name name = getName(node.name); 230 Name name = getName(node.name);
227 bool isStatic = node.isStatic; 231 bool isStatic = node.isStatic;
228 bool isExternal = node.isExternal; 232 bool isExternal = node.isExternal;
233 KFunction function;
229 switch (node.kind) { 234 switch (node.kind) {
230 case ir.ProcedureKind.Factory: 235 case ir.ProcedureKind.Factory:
231 throw new UnsupportedError("Cannot create method from factory."); 236 throw new UnsupportedError("Cannot create method from factory.");
232 case ir.ProcedureKind.Getter: 237 case ir.ProcedureKind.Getter:
233 return new KGetter(library, enclosingClass, name, 238 function = new KGetter(memberIndex, library, enclosingClass, name,
234 isStatic: isStatic, isExternal: isExternal); 239 isStatic: isStatic, isExternal: isExternal);
240 break;
235 case ir.ProcedureKind.Method: 241 case ir.ProcedureKind.Method:
236 case ir.ProcedureKind.Operator: 242 case ir.ProcedureKind.Operator:
237 return new KMethod(library, enclosingClass, name, 243 function = new KMethod(memberIndex, library, enclosingClass, name,
238 isStatic: isStatic, isExternal: isExternal); 244 isStatic: isStatic, isExternal: isExternal);
245 break;
239 case ir.ProcedureKind.Setter: 246 case ir.ProcedureKind.Setter:
240 return new KSetter(library, enclosingClass, getName(node.name).setter, 247 function = new KSetter(
248 memberIndex, library, enclosingClass, getName(node.name).setter,
241 isStatic: isStatic, isExternal: isExternal); 249 isStatic: isStatic, isExternal: isExternal);
250 break;
242 } 251 }
252 _memberList.add(node);
253 return function;
243 }); 254 });
244 } 255 }
245 256
246 KField _getField(ir.Field node) { 257 KField _getField(ir.Field node) {
247 return _fieldMap.putIfAbsent(node, () { 258 return _fieldMap.putIfAbsent(node, () {
248 int fieldIndex = _fieldList.length; 259 int memberIndex = _memberList.length;
249 KLibrary library; 260 KLibrary library;
250 KClass enclosingClass; 261 KClass enclosingClass;
251 if (node.enclosingClass != null) { 262 if (node.enclosingClass != null) {
252 enclosingClass = _getClass(node.enclosingClass); 263 enclosingClass = _getClass(node.enclosingClass);
253 library = enclosingClass.library; 264 library = enclosingClass.library;
254 } else { 265 } else {
255 library = _getLibrary(node.enclosingLibrary); 266 library = _getLibrary(node.enclosingLibrary);
256 } 267 }
257 Name name = getName(node.name); 268 Name name = getName(node.name);
258 bool isStatic = node.isStatic; 269 bool isStatic = node.isStatic;
259 _fieldList.add(node); 270 _memberList.add(node);
260 return new KField(fieldIndex, library, enclosingClass, name, 271 return new KField(memberIndex, library, enclosingClass, name,
261 isStatic: isStatic, isAssignable: node.isMutable); 272 isStatic: isStatic,
273 isAssignable: node.isMutable,
274 isConst: node.isConst);
262 }); 275 });
263 } 276 }
264 277
265 KLocalFunction _getLocal(ir.TreeNode node) { 278 KLocalFunction _getLocal(ir.TreeNode node) {
266 return _localFunctionMap.putIfAbsent(node, () { 279 return _localFunctionMap.putIfAbsent(node, () {
267 MemberEntity memberContext; 280 MemberEntity memberContext;
268 Entity executableContext; 281 Entity executableContext;
269 ir.TreeNode parent = node.parent; 282 ir.TreeNode parent = node.parent;
270 while (parent != null) { 283 while (parent != null) {
271 if (parent is ir.Member) { 284 if (parent is ir.Member) {
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 } 406 }
394 } 407 }
395 throw new UnsupportedError("Unexpected member: $node"); 408 throw new UnsupportedError("Unexpected member: $node");
396 } 409 }
397 410
398 @override 411 @override
399 FunctionEntity getConstructor(ir.Member node) => _getConstructor(node); 412 FunctionEntity getConstructor(ir.Member node) => _getConstructor(node);
400 413
401 ConstantConstructor _getConstructorConstant(KConstructor constructor) { 414 ConstantConstructor _getConstructorConstant(KConstructor constructor) {
402 return _constructorConstantMap.putIfAbsent(constructor, () { 415 return _constructorConstantMap.putIfAbsent(constructor, () {
403 ir.Member node = _constructorList[constructor.constructorIndex]; 416 ir.Member node = _memberList[constructor.memberIndex];
404 if (node is ir.Constructor && node.isConst) { 417 if (node is ir.Constructor && node.isConst) {
405 return new Constantifier(this).computeConstantConstructor(node); 418 return new Constantifier(this).computeConstantConstructor(node);
406 } 419 }
407 throw new SpannableAssertionFailure( 420 throw new SpannableAssertionFailure(
408 constructor, 421 constructor,
409 "Unexpected constructor $constructor in " 422 "Unexpected constructor $constructor in "
410 "KernelWorldBuilder._getConstructorConstant"); 423 "KernelWorldBuilder._getConstructorConstant");
411 }); 424 });
412 } 425 }
413 426
414 ConstantExpression _getFieldConstant(KField field) { 427 ConstantExpression _getFieldConstant(KField field) {
415 return _fieldConstantMap.putIfAbsent(field, () { 428 return _fieldConstantMap.putIfAbsent(field, () {
416 ir.Field node = _fieldList[field.fieldIndex]; 429 ir.Field node = _memberList[field.memberIndex];
417 if (node.isConst) { 430 if (node.isConst) {
418 return new Constantifier(this).visit(node.initializer); 431 return new Constantifier(this).visit(node.initializer);
419 } 432 }
420 throw new SpannableAssertionFailure( 433 throw new SpannableAssertionFailure(
421 field, 434 field,
422 "Unexpected field $field in " 435 "Unexpected field $field in "
423 "KernelWorldBuilder._getConstructorConstant"); 436 "KernelWorldBuilder._getConstructorConstant");
424 }); 437 });
425 } 438 }
426 } 439 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 ClassEntity cls, List<DartType> typeArguments) { 562 ClassEntity cls, List<DartType> typeArguments) {
550 return new InterfaceType(cls, typeArguments); 563 return new InterfaceType(cls, typeArguments);
551 } 564 }
552 565
553 @override 566 @override
554 bool isSubtype(DartType a, DartType b) { 567 bool isSubtype(DartType a, DartType b) {
555 throw new UnimplementedError('KernelElementEnvironment.isSubtype'); 568 throw new UnimplementedError('KernelElementEnvironment.isSubtype');
556 } 569 }
557 570
558 @override 571 @override
572 FunctionType getFunctionType(KFunction function) {
573 throw new UnimplementedError('KernelElementEnvironment.getFunctionType');
574 }
575
576 @override
559 ConstructorEntity lookupConstructor(ClassEntity cls, String name, 577 ConstructorEntity lookupConstructor(ClassEntity cls, String name,
560 {bool required: false}) { 578 {bool required: false}) {
561 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name); 579 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name);
562 if (constructor == null && required) { 580 if (constructor == null && required) {
563 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 581 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
564 "The constructor $name was not found in class '${cls.name}'."); 582 "The constructor $name was not found in class '${cls.name}'.");
565 } 583 }
566 return constructor; 584 return constructor;
567 } 585 }
568 586
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 638
621 @override 639 @override
622 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { 640 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
623 LibraryEntity library = worldBuilder.lookupLibrary(uri); 641 LibraryEntity library = worldBuilder.lookupLibrary(uri);
624 if (library == null && required) { 642 if (library == null && required) {
625 throw new SpannableAssertionFailure( 643 throw new SpannableAssertionFailure(
626 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); 644 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
627 } 645 }
628 return library; 646 return library;
629 } 647 }
648
649 @override
650 CallStructure getCallStructure(KFunction function) {
651 ir.Member member = worldBuilder._memberList[function.memberIndex];
652 ir.FunctionNode functionNode;
653 if (member is ir.Procedure) {
654 functionNode = member.function;
655 } else if (member is ir.Constructor) {
656 functionNode = member.function;
657 } else {
658 throw new SpannableAssertionFailure(
659 function, "Unexpected function node ${member} for $function.");
660 }
661 return new CallStructure(
662 functionNode.positionalParameters.length +
663 functionNode.namedParameters.length,
664 functionNode.namedParameters.map((d) => d.name).toList());
665 }
666
667 @override
668 bool isDeferredLoadLibraryGetter(KMember member) {
669 // TODO(johnniwinther): Support these.
670 return false;
671 }
630 } 672 }
631 673
632 /// Visitor that converts kernel dart types into [DartType]. 674 /// Visitor that converts kernel dart types into [DartType].
633 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { 675 class DartTypeConverter extends ir.DartTypeVisitor<DartType> {
634 final KernelWorldBuilder elementAdapter; 676 final KernelWorldBuilder elementAdapter;
635 bool topLevel = true; 677 bool topLevel = true;
636 678
637 DartTypeConverter(this.elementAdapter); 679 DartTypeConverter(this.elementAdapter);
638 680
639 DartType convert(ir.DartType type) { 681 DartType convert(ir.DartType type) {
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
844 } 886 }
845 887
846 InterfaceType getMixinTypeForClass(KClass cls) { 888 InterfaceType getMixinTypeForClass(KClass cls) {
847 KClassEnv env = builder._classEnvs[cls.classIndex]; 889 KClassEnv env = builder._classEnvs[cls.classIndex];
848 ir.Supertype mixedInType = env.cls.mixedInType; 890 ir.Supertype mixedInType = env.cls.mixedInType;
849 if (mixedInType == null) return null; 891 if (mixedInType == null) return null;
850 return builder.createInterfaceType( 892 return builder.createInterfaceType(
851 mixedInType.classNode, mixedInType.typeArguments); 893 mixedInType.classNode, mixedInType.typeArguments);
852 } 894 }
853 } 895 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/elements.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698