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

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

Issue 2829033002: Rename KernelWorldBuilder to KernelElementBuilder (Closed)
Patch Set: Rename to KernelToElementMap Created 3 years, 7 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 | « no previous file | pkg/compiler/lib/src/kernel/native_basic_data.dart » ('j') | 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.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/resolution.dart'; 10 import '../common/resolution.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';
(...skipping 13 matching lines...) Expand all
29 import '../universe/world_builder.dart'; 29 import '../universe/world_builder.dart';
30 import '../util/util.dart' show Link, LinkBuilder; 30 import '../util/util.dart' show Link, LinkBuilder;
31 import 'element_adapter.dart'; 31 import 'element_adapter.dart';
32 import 'elements.dart'; 32 import 'elements.dart';
33 33
34 part 'native_basic_data.dart'; 34 part 'native_basic_data.dart';
35 part 'native_class_resolver.dart'; 35 part 'native_class_resolver.dart';
36 part 'no_such_method_resolver.dart'; 36 part 'no_such_method_resolver.dart';
37 part 'types.dart'; 37 part 'types.dart';
38 38
39 /// World builder used for creating elements and types corresponding to Kernel 39 /// Element builder used for creating elements and types corresponding to Kernel
40 /// IR nodes. 40 /// IR nodes.
41 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. 41 class KernelToElementMap extends KernelElementAdapterMixin {
42 class KernelWorldBuilder extends KernelElementAdapterMixin {
43 CommonElements _commonElements; 42 CommonElements _commonElements;
44 native.BehaviorBuilder _nativeBehaviorBuilder; 43 native.BehaviorBuilder _nativeBehaviorBuilder;
45 final DiagnosticReporter reporter; 44 final DiagnosticReporter reporter;
46 ElementEnvironment _elementEnvironment; 45 ElementEnvironment _elementEnvironment;
47 DartTypeConverter _typeConverter; 46 DartTypeConverter _typeConverter;
48 KernelConstantEnvironment _constantEnvironment; 47 KernelConstantEnvironment _constantEnvironment;
49 _KernelDartTypes _types; 48 _KernelDartTypes _types;
50 49
51 /// Library environment. Used for fast lookup. 50 /// Library environment. Used for fast lookup.
52 KEnv _env; 51 _KEnv _env;
53 52
54 /// List of library environments by `KLibrary.libraryIndex`. This is used for 53 /// List of library environments by `KLibrary.libraryIndex`. This is used for
55 /// fast lookup into library classes and members. 54 /// fast lookup into library classes and members.
56 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; 55 List<_KLibraryEnv> _libraryEnvs = <_KLibraryEnv>[];
57 56
58 /// List of class environments by `KClass.classIndex`. This is used for 57 /// List of class environments by `KClass.classIndex`. This is used for
59 /// fast lookup into class members. 58 /// fast lookup into class members.
60 List<KClassEnv> _classEnvs = <KClassEnv>[]; 59 List<_KClassEnv> _classEnvs = <_KClassEnv>[];
61 60
62 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{}; 61 Map<ir.Library, KLibrary> _libraryMap = <ir.Library, KLibrary>{};
63 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{}; 62 Map<ir.Class, KClass> _classMap = <ir.Class, KClass>{};
64 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap = 63 Map<ir.TypeParameter, KTypeVariable> _typeVariableMap =
65 <ir.TypeParameter, KTypeVariable>{}; 64 <ir.TypeParameter, KTypeVariable>{};
66 65
67 // TODO(johnniwinther): Change this to a list of 'KMemberData' class if we 66 // TODO(johnniwinther): Change this to a list of 'KMemberData' class if we
68 // need more data for members. 67 // need more data for members.
69 List<ir.Member> _memberList = <ir.Member>[]; 68 List<ir.Member> _memberList = <ir.Member>[];
70 69
71 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{}; 70 Map<ir.Member, KConstructor> _constructorMap = <ir.Member, KConstructor>{};
72 Map<KConstructor, ConstantConstructor> _constructorConstantMap = 71 Map<KConstructor, ConstantConstructor> _constructorConstantMap =
73 <KConstructor, ConstantConstructor>{}; 72 <KConstructor, ConstantConstructor>{};
74 73
75 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{}; 74 Map<ir.Procedure, KFunction> _methodMap = <ir.Procedure, KFunction>{};
76 75
77 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{}; 76 Map<ir.Field, KField> _fieldMap = <ir.Field, KField>{};
78 Map<KField, ConstantExpression> _fieldConstantMap = 77 Map<KField, ConstantExpression> _fieldConstantMap =
79 <KField, ConstantExpression>{}; 78 <KField, ConstantExpression>{};
80 79
81 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = 80 Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
82 <ir.TreeNode, KLocalFunction>{}; 81 <ir.TreeNode, KLocalFunction>{};
83 82
84 KernelWorldBuilder(this.reporter, ir.Program program) 83 KernelToElementMap(this.reporter, ir.Program program)
85 : _env = new KEnv(program) { 84 : _env = new _KEnv(program) {
86 _elementEnvironment = new KernelElementEnvironment(this); 85 _elementEnvironment = new KernelElementEnvironment(this);
87 _commonElements = new CommonElements(_elementEnvironment); 86 _commonElements = new CommonElements(_elementEnvironment);
88 _constantEnvironment = new KernelConstantEnvironment(this); 87 _constantEnvironment = new KernelConstantEnvironment(this);
89 _nativeBehaviorBuilder = 88 _nativeBehaviorBuilder =
90 new KernelBehaviorBuilder(_commonElements, _constantEnvironment); 89 new KernelBehaviorBuilder(_commonElements, _constantEnvironment);
91 _types = new _KernelDartTypes(this); 90 _types = new _KernelDartTypes(this);
92 _typeConverter = new DartTypeConverter(this); 91 _typeConverter = new DartTypeConverter(this);
93 } 92 }
94 93
95 KMethod get _mainFunction { 94 KMethod get _mainFunction {
96 return _env.program.mainMethod != null 95 return _env.program.mainMethod != null
97 ? _getMethod(_env.program.mainMethod) 96 ? _getMethod(_env.program.mainMethod)
98 : null; 97 : null;
99 } 98 }
100 99
101 KLibrary get _mainLibrary { 100 KLibrary get _mainLibrary {
102 return _env.program.mainMethod != null 101 return _env.program.mainMethod != null
103 ? _getLibrary(_env.program.mainMethod.enclosingLibrary) 102 ? _getLibrary(_env.program.mainMethod.enclosingLibrary)
104 : null; 103 : null;
105 } 104 }
106 105
107 Iterable<LibraryEntity> get _libraries { 106 Iterable<LibraryEntity> get _libraries {
108 if (_env.length != _libraryMap.length) { 107 if (_env.length != _libraryMap.length) {
109 // Create a [KLibrary] for each library. 108 // Create a [KLibrary] for each library.
110 _env.forEachLibrary((KLibraryEnv env) { 109 _env.forEachLibrary((_KLibraryEnv env) {
111 _getLibrary(env.library, env); 110 _getLibrary(env.library, env);
112 }); 111 });
113 } 112 }
114 return _libraryMap.values; 113 return _libraryMap.values;
115 } 114 }
116 115
117 @override 116 @override
118 CommonElements get commonElements => _commonElements; 117 CommonElements get commonElements => _commonElements;
119 118
120 @override 119 @override
121 ElementEnvironment get elementEnvironment => _elementEnvironment; 120 ElementEnvironment get elementEnvironment => _elementEnvironment;
122 121
123 ConstantEnvironment get constantEnvironment => _constantEnvironment; 122 ConstantEnvironment get constantEnvironment => _constantEnvironment;
124 123
125 DartTypes get types => _types; 124 DartTypes get types => _types;
126 125
127 @override 126 @override
128 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; 127 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder;
129 128
130 LibraryEntity lookupLibrary(Uri uri) { 129 LibraryEntity lookupLibrary(Uri uri) {
131 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); 130 _KLibraryEnv libraryEnv = _env.lookupLibrary(uri);
132 return _getLibrary(libraryEnv.library, libraryEnv); 131 return _getLibrary(libraryEnv.library, libraryEnv);
133 } 132 }
134 133
135 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { 134 KLibrary _getLibrary(ir.Library node, [_KLibraryEnv libraryEnv]) {
136 return _libraryMap.putIfAbsent(node, () { 135 return _libraryMap.putIfAbsent(node, () {
137 Uri canonicalUri = node.importUri; 136 Uri canonicalUri = node.importUri;
138 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri)); 137 _libraryEnvs.add(libraryEnv ?? _env.lookupLibrary(canonicalUri));
139 String name = node.name; 138 String name = node.name;
140 if (name == null) { 139 if (name == null) {
141 // Use the file name as script name. 140 // Use the file name as script name.
142 String path = canonicalUri.path; 141 String path = canonicalUri.path;
143 name = path.substring(path.lastIndexOf('/') + 1); 142 name = path.substring(path.lastIndexOf('/') + 1);
144 } 143 }
145 return new KLibrary(_libraryMap.length, name, canonicalUri); 144 return new KLibrary(_libraryMap.length, name, canonicalUri);
146 }); 145 });
147 } 146 }
148 147
149 MemberEntity lookupLibraryMember(KLibrary library, String name, 148 MemberEntity lookupLibraryMember(KLibrary library, String name,
150 {bool setter: false}) { 149 {bool setter: false}) {
151 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; 150 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
152 ir.Member member = libraryEnv.lookupMember(name, setter: setter); 151 ir.Member member = libraryEnv.lookupMember(name, setter: setter);
153 return member != null ? getMember(member) : null; 152 return member != null ? getMember(member) : null;
154 } 153 }
155 154
156 ClassEntity lookupClass(KLibrary library, String name) { 155 ClassEntity lookupClass(KLibrary library, String name) {
157 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; 156 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
158 KClassEnv classEnv = libraryEnv.lookupClass(name); 157 _KClassEnv classEnv = libraryEnv.lookupClass(name);
159 if (classEnv != null) { 158 if (classEnv != null) {
160 return _getClass(classEnv.cls, classEnv); 159 return _getClass(classEnv.cls, classEnv);
161 } 160 }
162 return null; 161 return null;
163 } 162 }
164 163
165 void _forEachClass(KLibrary library, void f(ClassEntity cls)) { 164 void _forEachClass(KLibrary library, void f(ClassEntity cls)) {
166 KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex]; 165 _KLibraryEnv libraryEnv = _libraryEnvs[library.libraryIndex];
167 libraryEnv.forEachClass((KClassEnv classEnv) { 166 libraryEnv.forEachClass((_KClassEnv classEnv) {
168 f(_getClass(classEnv.cls, classEnv)); 167 f(_getClass(classEnv.cls, classEnv));
169 }); 168 });
170 } 169 }
171 170
172 MemberEntity lookupClassMember(KClass cls, String name, 171 MemberEntity lookupClassMember(KClass cls, String name,
173 {bool setter: false}) { 172 {bool setter: false}) {
174 KClassEnv classEnv = _classEnvs[cls.classIndex]; 173 _KClassEnv classEnv = _classEnvs[cls.classIndex];
175 ir.Member member = classEnv.lookupMember(name, setter: setter); 174 ir.Member member = classEnv.lookupMember(name, setter: setter);
176 return member != null ? getMember(member) : null; 175 return member != null ? getMember(member) : null;
177 } 176 }
178 177
179 ConstructorEntity lookupConstructor(KClass cls, String name) { 178 ConstructorEntity lookupConstructor(KClass cls, String name) {
180 KClassEnv classEnv = _classEnvs[cls.classIndex]; 179 _KClassEnv classEnv = _classEnvs[cls.classIndex];
181 ir.Member member = classEnv.lookupConstructor(name); 180 ir.Member member = classEnv.lookupConstructor(name);
182 return member != null ? getConstructor(member) : null; 181 return member != null ? getConstructor(member) : null;
183 } 182 }
184 183
185 KClass _getClass(ir.Class node, [KClassEnv classEnv]) { 184 KClass _getClass(ir.Class node, [_KClassEnv classEnv]) {
186 return _classMap.putIfAbsent(node, () { 185 return _classMap.putIfAbsent(node, () {
187 KLibrary library = _getLibrary(node.enclosingLibrary); 186 KLibrary library = _getLibrary(node.enclosingLibrary);
188 if (classEnv == null) { 187 if (classEnv == null) {
189 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name); 188 classEnv = _libraryEnvs[library.libraryIndex].lookupClass(node.name);
190 } 189 }
191 _classEnvs.add(classEnv); 190 _classEnvs.add(classEnv);
192 return new KClass(library, _classMap.length, node.name, 191 return new KClass(library, _classMap.length, node.name,
193 isAbstract: node.isAbstract); 192 isAbstract: node.isAbstract);
194 }); 193 });
195 } 194 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 List<DartType> getDartTypes(List<ir.DartType> types) { 378 List<DartType> getDartTypes(List<ir.DartType> types) {
380 // TODO(johnniwinther): Add the type argument to the list literal when we 379 // TODO(johnniwinther): Add the type argument to the list literal when we
381 // no longer use resolution types. 380 // no longer use resolution types.
382 List<DartType> list = /*<DartType>*/ []; 381 List<DartType> list = /*<DartType>*/ [];
383 types.forEach((ir.DartType type) { 382 types.forEach((ir.DartType type) {
384 list.add(getDartType(type)); 383 list.add(getDartType(type));
385 }); 384 });
386 return list; 385 return list;
387 } 386 }
388 387
389 void _ensureThisAndRawType(KClass cls, KClassEnv env) { 388 void _ensureThisAndRawType(KClass cls, _KClassEnv env) {
390 if (env.thisType == null) { 389 if (env.thisType == null) {
391 ir.Class node = env.cls; 390 ir.Class node = env.cls;
392 // TODO(johnniwinther): Add the type argument to the list literal when we 391 // TODO(johnniwinther): Add the type argument to the list literal when we
393 // no longer use resolution types. 392 // no longer use resolution types.
394 if (node.typeParameters.isEmpty) { 393 if (node.typeParameters.isEmpty) {
395 env.thisType = 394 env.thisType =
396 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []); 395 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []);
397 } else { 396 } else {
398 env.thisType = new InterfaceType( 397 env.thisType = new InterfaceType(
399 cls, 398 cls,
400 new List/*<DartType>*/ .generate(node.typeParameters.length, 399 new List/*<DartType>*/ .generate(node.typeParameters.length,
401 (int index) { 400 (int index) {
402 return new TypeVariableType( 401 return new TypeVariableType(
403 _getTypeVariable(node.typeParameters[index])); 402 _getTypeVariable(node.typeParameters[index]));
404 })); 403 }));
405 env.rawType = new InterfaceType( 404 env.rawType = new InterfaceType(
406 cls, 405 cls,
407 new List/*<DartType>*/ .filled( 406 new List/*<DartType>*/ .filled(
408 node.typeParameters.length, const DynamicType())); 407 node.typeParameters.length, const DynamicType()));
409 } 408 }
410 } 409 }
411 } 410 }
412 411
413 InterfaceType _getThisType(KClass cls) { 412 InterfaceType _getThisType(KClass cls) {
414 KClassEnv env = _classEnvs[cls.classIndex]; 413 _KClassEnv env = _classEnvs[cls.classIndex];
415 _ensureThisAndRawType(cls, env); 414 _ensureThisAndRawType(cls, env);
416 return env.thisType; 415 return env.thisType;
417 } 416 }
418 417
419 InterfaceType _getRawType(KClass cls) { 418 InterfaceType _getRawType(KClass cls) {
420 KClassEnv env = _classEnvs[cls.classIndex]; 419 _KClassEnv env = _classEnvs[cls.classIndex];
421 _ensureThisAndRawType(cls, env); 420 _ensureThisAndRawType(cls, env);
422 return env.rawType; 421 return env.rawType;
423 } 422 }
424 423
425 void _ensureSupertypes(KClass cls, KClassEnv env) { 424 void _ensureSupertypes(KClass cls, _KClassEnv env) {
426 if (env.orderedTypeSet == null) { 425 if (env.orderedTypeSet == null) {
427 _ensureThisAndRawType(cls, env); 426 _ensureThisAndRawType(cls, env);
428 427
429 ir.Class node = env.cls; 428 ir.Class node = env.cls;
430 429
431 if (node.supertype == null) { 430 if (node.supertype == null) {
432 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); 431 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType);
433 } else { 432 } else {
434 InterfaceType processSupertype(ir.Supertype node) { 433 InterfaceType processSupertype(ir.Supertype node) {
435 InterfaceType type = _typeConverter.visitSupertype(node); 434 InterfaceType type = _typeConverter.visitSupertype(node);
436 KClass superclass = type.element; 435 KClass superclass = type.element;
437 KClassEnv env = _classEnvs[superclass.classIndex]; 436 _KClassEnv env = _classEnvs[superclass.classIndex];
438 _ensureSupertypes(superclass, env); 437 _ensureSupertypes(superclass, env);
439 return type; 438 return type;
440 } 439 }
441 440
442 env.supertype = processSupertype(node.supertype); 441 env.supertype = processSupertype(node.supertype);
443 LinkBuilder<InterfaceType> linkBuilder = 442 LinkBuilder<InterfaceType> linkBuilder =
444 new LinkBuilder<InterfaceType>(); 443 new LinkBuilder<InterfaceType>();
445 if (node.mixedInType != null) { 444 if (node.mixedInType != null) {
446 linkBuilder.addLast(processSupertype(node.mixedInType)); 445 linkBuilder.addLast(processSupertype(node.mixedInType));
447 } 446 }
448 node.implementedTypes.forEach((ir.Supertype supertype) { 447 node.implementedTypes.forEach((ir.Supertype supertype) {
449 linkBuilder.addLast(processSupertype(supertype)); 448 linkBuilder.addLast(processSupertype(supertype));
450 }); 449 });
451 Link<InterfaceType> interfaces = linkBuilder.toLink(); 450 Link<InterfaceType> interfaces = linkBuilder.toLink();
452 OrderedTypeSetBuilder setBuilder = 451 OrderedTypeSetBuilder setBuilder =
453 new _KernelOrderedTypeSetBuilder(this, cls); 452 new _KernelOrderedTypeSetBuilder(this, cls);
454 env.orderedTypeSet = 453 env.orderedTypeSet =
455 setBuilder.createOrderedTypeSet(env.supertype, interfaces); 454 setBuilder.createOrderedTypeSet(env.supertype, interfaces);
456 } 455 }
457 } 456 }
458 } 457 }
459 458
460 OrderedTypeSet _getOrderedTypeSet(KClass cls) { 459 OrderedTypeSet _getOrderedTypeSet(KClass cls) {
461 KClassEnv env = _classEnvs[cls.classIndex]; 460 _KClassEnv env = _classEnvs[cls.classIndex];
462 _ensureSupertypes(cls, env); 461 _ensureSupertypes(cls, env);
463 return env.orderedTypeSet; 462 return env.orderedTypeSet;
464 } 463 }
465 464
466 int _getHierarchyDepth(KClass cls) { 465 int _getHierarchyDepth(KClass cls) {
467 KClassEnv env = _classEnvs[cls.classIndex]; 466 _KClassEnv env = _classEnvs[cls.classIndex];
468 _ensureSupertypes(cls, env); 467 _ensureSupertypes(cls, env);
469 return env.orderedTypeSet.maxDepth; 468 return env.orderedTypeSet.maxDepth;
470 } 469 }
471 470
472 InterfaceType _substByContext(InterfaceType type, InterfaceType context) { 471 InterfaceType _substByContext(InterfaceType type, InterfaceType context) {
473 return type.subst( 472 return type.subst(
474 context.typeArguments, _getThisType(context.element).typeArguments); 473 context.typeArguments, _getThisType(context.element).typeArguments);
475 } 474 }
476 475
477 InterfaceType _getSuperType(KClass cls) { 476 InterfaceType _getSuperType(KClass cls) {
478 KClassEnv env = _classEnvs[cls.classIndex]; 477 _KClassEnv env = _classEnvs[cls.classIndex];
479 _ensureSupertypes(cls, env); 478 _ensureSupertypes(cls, env);
480 return env.supertype; 479 return env.supertype;
481 } 480 }
482 481
483 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { 482 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) {
484 KClassEnv env = _classEnvs[cls.classIndex]; 483 _KClassEnv env = _classEnvs[cls.classIndex];
485 _ensureSupertypes(cls, env); 484 _ensureSupertypes(cls, env);
486 env.orderedTypeSet.supertypes.forEach(f); 485 env.orderedTypeSet.supertypes.forEach(f);
487 } 486 }
488 487
489 void _forEachClassMember( 488 void _forEachClassMember(
490 KClass cls, void f(ClassEntity cls, MemberEntity member)) { 489 KClass cls, void f(ClassEntity cls, MemberEntity member)) {
491 KClassEnv env = _classEnvs[cls.classIndex]; 490 _KClassEnv env = _classEnvs[cls.classIndex];
492 env.forEachMember((ir.Member member) { 491 env.forEachMember((ir.Member member) {
493 f(cls, getMember(member)); 492 f(cls, getMember(member));
494 }); 493 });
495 _ensureSupertypes(cls, env); 494 _ensureSupertypes(cls, env);
496 if (env.supertype != null) { 495 if (env.supertype != null) {
497 _forEachClassMember(env.supertype.element, f); 496 _forEachClassMember(env.supertype.element, f);
498 } 497 }
499 } 498 }
500 499
501 @override 500 @override
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 }); 588 });
590 } 589 }
591 590
592 ResolutionImpact computeWorldImpact(KMember member) { 591 ResolutionImpact computeWorldImpact(KMember member) {
593 ir.Member node = _memberList[member.memberIndex]; 592 ir.Member node = _memberList[member.memberIndex];
594 return buildKernelImpact(node, this); 593 return buildKernelImpact(node, this);
595 } 594 }
596 } 595 }
597 596
598 /// Environment for fast lookup of program libraries. 597 /// Environment for fast lookup of program libraries.
599 class KEnv { 598 class _KEnv {
600 final ir.Program program; 599 final ir.Program program;
601 600
602 Map<Uri, KLibraryEnv> _libraryMap; 601 Map<Uri, _KLibraryEnv> _libraryMap;
603 602
604 KEnv(this.program); 603 _KEnv(this.program);
605 604
606 void _ensureLibraryMap() { 605 void _ensureLibraryMap() {
607 if (_libraryMap == null) { 606 if (_libraryMap == null) {
608 _libraryMap = <Uri, KLibraryEnv>{}; 607 _libraryMap = <Uri, _KLibraryEnv>{};
609 for (ir.Library library in program.libraries) { 608 for (ir.Library library in program.libraries) {
610 _libraryMap[library.importUri] = new KLibraryEnv(library); 609 _libraryMap[library.importUri] = new _KLibraryEnv(library);
611 } 610 }
612 } 611 }
613 } 612 }
614 613
615 /// Return the [KLibraryEnv] for the library with the canonical [uri]. 614 /// Return the [_KLibraryEnv] for the library with the canonical [uri].
616 KLibraryEnv lookupLibrary(Uri uri) { 615 _KLibraryEnv lookupLibrary(Uri uri) {
617 _ensureLibraryMap(); 616 _ensureLibraryMap();
618 return _libraryMap[uri]; 617 return _libraryMap[uri];
619 } 618 }
620 619
621 /// Calls [f] for each library in this environment. 620 /// Calls [f] for each library in this environment.
622 void forEachLibrary(void f(KLibraryEnv library)) { 621 void forEachLibrary(void f(_KLibraryEnv library)) {
623 _ensureLibraryMap(); 622 _ensureLibraryMap();
624 _libraryMap.values.forEach(f); 623 _libraryMap.values.forEach(f);
625 } 624 }
626 625
627 /// Returns the number of libraries in this environment. 626 /// Returns the number of libraries in this environment.
628 int get length { 627 int get length {
629 _ensureLibraryMap(); 628 _ensureLibraryMap();
630 return _libraryMap.length; 629 return _libraryMap.length;
631 } 630 }
632 } 631 }
633 632
634 /// Environment for fast lookup of library classes and members. 633 /// Environment for fast lookup of library classes and members.
635 // TODO(johnniwinther): Add member lookup. 634 class _KLibraryEnv {
636 class KLibraryEnv {
637 final ir.Library library; 635 final ir.Library library;
638 636
639 Map<String, KClassEnv> _classMap; 637 Map<String, _KClassEnv> _classMap;
640 Map<String, ir.Member> _memberMap; 638 Map<String, ir.Member> _memberMap;
641 Map<String, ir.Member> _setterMap; 639 Map<String, ir.Member> _setterMap;
642 640
643 KLibraryEnv(this.library); 641 _KLibraryEnv(this.library);
644 642
645 void _ensureClassMap() { 643 void _ensureClassMap() {
646 if (_classMap == null) { 644 if (_classMap == null) {
647 _classMap = <String, KClassEnv>{}; 645 _classMap = <String, _KClassEnv>{};
648 for (ir.Class cls in library.classes) { 646 for (ir.Class cls in library.classes) {
649 _classMap[cls.name] = new KClassEnv(cls); 647 _classMap[cls.name] = new _KClassEnv(cls);
650 } 648 }
651 } 649 }
652 } 650 }
653 651
654 /// Return the [KClassEnv] for the class [name] in [library]. 652 /// Return the [_KClassEnv] for the class [name] in [library].
655 KClassEnv lookupClass(String name) { 653 _KClassEnv lookupClass(String name) {
656 _ensureClassMap(); 654 _ensureClassMap();
657 return _classMap[name]; 655 return _classMap[name];
658 } 656 }
659 657
660 /// Calls [f] for each class in this library. 658 /// Calls [f] for each class in this library.
661 void forEachClass(void f(KClassEnv cls)) { 659 void forEachClass(void f(_KClassEnv cls)) {
662 _ensureClassMap(); 660 _ensureClassMap();
663 _classMap.values.forEach(f); 661 _classMap.values.forEach(f);
664 } 662 }
665 663
666 /// Return the [ir.Member] for the member [name] in [library]. 664 /// Return the [ir.Member] for the member [name] in [library].
667 ir.Member lookupMember(String name, {bool setter: false}) { 665 ir.Member lookupMember(String name, {bool setter: false}) {
668 if (_memberMap == null) { 666 if (_memberMap == null) {
669 _memberMap = <String, ir.Member>{}; 667 _memberMap = <String, ir.Member>{};
670 _setterMap = <String, ir.Member>{}; 668 _setterMap = <String, ir.Member>{};
671 for (ir.Member member in library.members) { 669 for (ir.Member member in library.members) {
(...skipping 12 matching lines...) Expand all
684 throw new SpannableAssertionFailure( 682 throw new SpannableAssertionFailure(
685 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member"); 683 NO_LOCATION_SPANNABLE, "Unexpected library member node: $member");
686 } 684 }
687 } 685 }
688 } 686 }
689 return _memberMap[name]; 687 return _memberMap[name];
690 } 688 }
691 } 689 }
692 690
693 /// Environment for fast lookup of class members. 691 /// Environment for fast lookup of class members.
694 // TODO(johnniwinther): Add member lookup. 692 class _KClassEnv {
695 class KClassEnv {
696 final ir.Class cls; 693 final ir.Class cls;
697 694
698 InterfaceType thisType; 695 InterfaceType thisType;
699 InterfaceType rawType; 696 InterfaceType rawType;
700 InterfaceType supertype; 697 InterfaceType supertype;
701 OrderedTypeSet orderedTypeSet; 698 OrderedTypeSet orderedTypeSet;
702 699
703 Map<String, ir.Member> _constructorMap; 700 Map<String, ir.Member> _constructorMap;
704 Map<String, ir.Member> _memberMap; 701 Map<String, ir.Member> _memberMap;
705 Map<String, ir.Member> _setterMap; 702 Map<String, ir.Member> _setterMap;
706 703
707 Iterable<ConstantExpression> _metadata; 704 Iterable<ConstantExpression> _metadata;
708 705
709 KClassEnv(this.cls); 706 _KClassEnv(this.cls);
710 707
711 void _ensureMaps() { 708 void _ensureMaps() {
712 if (_memberMap == null) { 709 if (_memberMap == null) {
713 _memberMap = <String, ir.Member>{}; 710 _memberMap = <String, ir.Member>{};
714 _setterMap = <String, ir.Member>{}; 711 _setterMap = <String, ir.Member>{};
715 _constructorMap = <String, ir.Member>{}; 712 _constructorMap = <String, ir.Member>{};
716 for (ir.Member member in cls.members) { 713 for (ir.Member member in cls.members) {
717 if (member is ir.Constructor || 714 if (member is ir.Constructor ||
718 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) { 715 member is ir.Procedure && member.kind == ir.ProcedureKind.Factory) {
719 _constructorMap[member.name.name] = member; 716 _constructorMap[member.name.name] = member;
(...skipping 27 matching lines...) Expand all
747 ir.Member lookupConstructor(String name) { 744 ir.Member lookupConstructor(String name) {
748 _ensureMaps(); 745 _ensureMaps();
749 return _constructorMap[name]; 746 return _constructorMap[name];
750 } 747 }
751 748
752 void forEachMember(f(ir.Member member)) { 749 void forEachMember(f(ir.Member member)) {
753 _ensureMaps(); 750 _ensureMaps();
754 _memberMap.values.forEach(f); 751 _memberMap.values.forEach(f);
755 } 752 }
756 753
757 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { 754 Iterable<ConstantExpression> getMetadata(KernelToElementMap worldBuilder) {
758 if (_metadata == null) { 755 if (_metadata == null) {
759 _metadata = worldBuilder.getMetadata(cls.annotations); 756 _metadata = worldBuilder.getMetadata(cls.annotations);
760 } 757 }
761 return _metadata; 758 return _metadata;
762 } 759 }
763 } 760 }
764 761
765 class KernelElementEnvironment implements ElementEnvironment { 762 class KernelElementEnvironment implements ElementEnvironment {
766 final KernelWorldBuilder worldBuilder; 763 final KernelToElementMap elementMap;
767 764
768 KernelElementEnvironment(this.worldBuilder); 765 KernelElementEnvironment(this.elementMap);
769 766
770 @override 767 @override
771 DartType get dynamicType => const DynamicType(); 768 DartType get dynamicType => const DynamicType();
772 769
773 @override 770 @override
774 LibraryEntity get mainLibrary => worldBuilder._mainLibrary; 771 LibraryEntity get mainLibrary => elementMap._mainLibrary;
775 772
776 @override 773 @override
777 FunctionEntity get mainFunction => worldBuilder._mainFunction; 774 FunctionEntity get mainFunction => elementMap._mainFunction;
778 775
779 @override 776 @override
780 Iterable<LibraryEntity> get libraries => worldBuilder._libraries; 777 Iterable<LibraryEntity> get libraries => elementMap._libraries;
781 778
782 @override 779 @override
783 InterfaceType getThisType(ClassEntity cls) { 780 InterfaceType getThisType(ClassEntity cls) {
784 return worldBuilder._getThisType(cls); 781 return elementMap._getThisType(cls);
785 } 782 }
786 783
787 @override 784 @override
788 InterfaceType getRawType(ClassEntity cls) { 785 InterfaceType getRawType(ClassEntity cls) {
789 return worldBuilder._getRawType(cls); 786 return elementMap._getRawType(cls);
790 } 787 }
791 788
792 @override 789 @override
793 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { 790 DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
794 throw new UnimplementedError( 791 throw new UnimplementedError(
795 'KernelElementEnvironment.getTypeVariableBound'); 792 'KernelElementEnvironment.getTypeVariableBound');
796 } 793 }
797 794
798 @override 795 @override
799 InterfaceType createInterfaceType( 796 InterfaceType createInterfaceType(
800 ClassEntity cls, List<DartType> typeArguments) { 797 ClassEntity cls, List<DartType> typeArguments) {
801 return new InterfaceType(cls, typeArguments); 798 return new InterfaceType(cls, typeArguments);
802 } 799 }
803 800
804 @override 801 @override
805 bool isSubtype(DartType a, DartType b) { 802 bool isSubtype(DartType a, DartType b) {
806 return worldBuilder.types.isSubtype(a, b); 803 return elementMap.types.isSubtype(a, b);
807 } 804 }
808 805
809 @override 806 @override
810 FunctionType getFunctionType(KFunction function) { 807 FunctionType getFunctionType(KFunction function) {
811 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); 808 throw new UnimplementedError('KernelElementEnvironment.getFunctionType');
812 } 809 }
813 810
814 @override 811 @override
815 FunctionType getLocalFunctionType(KLocalFunction function) { 812 FunctionType getLocalFunctionType(KLocalFunction function) {
816 return function.functionType; 813 return function.functionType;
817 } 814 }
818 815
819 @override 816 @override
820 DartType getUnaliasedType(DartType type) => type; 817 DartType getUnaliasedType(DartType type) => type;
821 818
822 @override 819 @override
823 ConstructorEntity lookupConstructor(ClassEntity cls, String name, 820 ConstructorEntity lookupConstructor(ClassEntity cls, String name,
824 {bool required: false}) { 821 {bool required: false}) {
825 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name); 822 ConstructorEntity constructor = elementMap.lookupConstructor(cls, name);
826 if (constructor == null && required) { 823 if (constructor == null && required) {
827 throw new SpannableAssertionFailure( 824 throw new SpannableAssertionFailure(
828 CURRENT_ELEMENT_SPANNABLE, 825 CURRENT_ELEMENT_SPANNABLE,
829 "The constructor '$name' was not found in class '${cls.name}' " 826 "The constructor '$name' was not found in class '${cls.name}' "
830 "in library ${cls.library.canonicalUri}."); 827 "in library ${cls.library.canonicalUri}.");
831 } 828 }
832 return constructor; 829 return constructor;
833 } 830 }
834 831
835 @override 832 @override
836 MemberEntity lookupClassMember(ClassEntity cls, String name, 833 MemberEntity lookupClassMember(ClassEntity cls, String name,
837 {bool setter: false, bool required: false}) { 834 {bool setter: false, bool required: false}) {
838 MemberEntity member = 835 MemberEntity member =
839 worldBuilder.lookupClassMember(cls, name, setter: setter); 836 elementMap.lookupClassMember(cls, name, setter: setter);
840 if (member == null && required) { 837 if (member == null && required) {
841 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 838 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
842 "The member '$name' was not found in ${cls.name}."); 839 "The member '$name' was not found in ${cls.name}.");
843 } 840 }
844 return member; 841 return member;
845 } 842 }
846 843
847 @override 844 @override
848 ClassEntity getSuperClass(ClassEntity cls) { 845 ClassEntity getSuperClass(ClassEntity cls) {
849 return worldBuilder._getSuperType(cls)?.element; 846 return elementMap._getSuperType(cls)?.element;
850 } 847 }
851 848
852 @override 849 @override
853 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) { 850 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) {
854 worldBuilder._forEachSupertype(cls, f); 851 elementMap._forEachSupertype(cls, f);
855 } 852 }
856 853
857 @override 854 @override
858 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { 855 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) {
859 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); 856 throw new UnimplementedError('KernelElementEnvironment.forEachMixin');
860 } 857 }
861 858
862 @override 859 @override
863 void forEachClassMember( 860 void forEachClassMember(
864 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { 861 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
865 worldBuilder._forEachClassMember(cls, f); 862 elementMap._forEachClassMember(cls, f);
866 } 863 }
867 864
868 @override 865 @override
869 MemberEntity lookupLibraryMember(LibraryEntity library, String name, 866 MemberEntity lookupLibraryMember(LibraryEntity library, String name,
870 {bool setter: false, bool required: false}) { 867 {bool setter: false, bool required: false}) {
871 MemberEntity member = 868 MemberEntity member =
872 worldBuilder.lookupLibraryMember(library, name, setter: setter); 869 elementMap.lookupLibraryMember(library, name, setter: setter);
873 if (member == null && required) { 870 if (member == null && required) {
874 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 871 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
875 "The member '${name}' was not found in library '${library.name}'."); 872 "The member '${name}' was not found in library '${library.name}'.");
876 } 873 }
877 return member; 874 return member;
878 } 875 }
879 876
880 @override 877 @override
881 ClassEntity lookupClass(LibraryEntity library, String name, 878 ClassEntity lookupClass(LibraryEntity library, String name,
882 {bool required: false}) { 879 {bool required: false}) {
883 ClassEntity cls = worldBuilder.lookupClass(library, name); 880 ClassEntity cls = elementMap.lookupClass(library, name);
884 if (cls == null && required) { 881 if (cls == null && required) {
885 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 882 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
886 "The class '$name' was not found in library '${library.name}'."); 883 "The class '$name' was not found in library '${library.name}'.");
887 } 884 }
888 return cls; 885 return cls;
889 } 886 }
890 887
891 @override 888 @override
892 void forEachClass(KLibrary library, void f(ClassEntity cls)) { 889 void forEachClass(KLibrary library, void f(ClassEntity cls)) {
893 worldBuilder._forEachClass(library, f); 890 elementMap._forEachClass(library, f);
894 } 891 }
895 892
896 @override 893 @override
897 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) { 894 LibraryEntity lookupLibrary(Uri uri, {bool required: false}) {
898 LibraryEntity library = worldBuilder.lookupLibrary(uri); 895 LibraryEntity library = elementMap.lookupLibrary(uri);
899 if (library == null && required) { 896 if (library == null && required) {
900 throw new SpannableAssertionFailure( 897 throw new SpannableAssertionFailure(
901 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found."); 898 CURRENT_ELEMENT_SPANNABLE, "The library '$uri' was not found.");
902 } 899 }
903 return library; 900 return library;
904 } 901 }
905 902
906 @override 903 @override
907 CallStructure getCallStructure(KFunction function) { 904 CallStructure getCallStructure(KFunction function) {
908 ir.Member member = worldBuilder._memberList[function.memberIndex]; 905 ir.Member member = elementMap._memberList[function.memberIndex];
909 ir.FunctionNode functionNode; 906 ir.FunctionNode functionNode;
910 if (member is ir.Procedure) { 907 if (member is ir.Procedure) {
911 functionNode = member.function; 908 functionNode = member.function;
912 } else if (member is ir.Constructor) { 909 } else if (member is ir.Constructor) {
913 functionNode = member.function; 910 functionNode = member.function;
914 } else { 911 } else {
915 throw new SpannableAssertionFailure( 912 throw new SpannableAssertionFailure(
916 function, "Unexpected function node ${member} for $function."); 913 function, "Unexpected function node ${member} for $function.");
917 } 914 }
918 return new CallStructure( 915 return new CallStructure(
919 functionNode.positionalParameters.length + 916 functionNode.positionalParameters.length +
920 functionNode.namedParameters.length, 917 functionNode.namedParameters.length,
921 functionNode.namedParameters.map((d) => d.name).toList()); 918 functionNode.namedParameters.map((d) => d.name).toList());
922 } 919 }
923 920
924 @override 921 @override
925 bool isDeferredLoadLibraryGetter(KMember member) { 922 bool isDeferredLoadLibraryGetter(KMember member) {
926 // TODO(johnniwinther): Support these. 923 // TODO(johnniwinther): Support these.
927 return false; 924 return false;
928 } 925 }
929 } 926 }
930 927
931 /// Visitor that converts kernel dart types into [DartType]. 928 /// Visitor that converts kernel dart types into [DartType].
932 class DartTypeConverter extends ir.DartTypeVisitor<DartType> { 929 class DartTypeConverter extends ir.DartTypeVisitor<DartType> {
933 final KernelWorldBuilder elementAdapter; 930 final KernelToElementMap elementAdapter;
934 bool topLevel = true; 931 bool topLevel = true;
935 932
936 DartTypeConverter(this.elementAdapter); 933 DartTypeConverter(this.elementAdapter);
937 934
938 DartType convert(ir.DartType type) { 935 DartType convert(ir.DartType type) {
939 topLevel = true; 936 topLevel = true;
940 return type.accept(this); 937 return type.accept(this);
941 } 938 }
942 939
943 /// Visit a inner type. 940 /// Visit a inner type.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 1023
1027 @override 1024 @override
1028 NativeData get nativeData { 1025 NativeData get nativeData {
1029 throw new UnimplementedError("KernelNativeBehaviorComputer.nativeData"); 1026 throw new UnimplementedError("KernelNativeBehaviorComputer.nativeData");
1030 } 1027 }
1031 } 1028 }
1032 1029
1033 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using 1030 /// Constant environment mapping [ConstantExpression]s to [ConstantValue]s using
1034 /// [_EvaluationEnvironment] for the evaluation. 1031 /// [_EvaluationEnvironment] for the evaluation.
1035 class KernelConstantEnvironment implements ConstantEnvironment { 1032 class KernelConstantEnvironment implements ConstantEnvironment {
1036 KernelWorldBuilder _worldBuilder; 1033 KernelToElementMap _worldBuilder;
1037 Map<ConstantExpression, ConstantValue> _valueMap = 1034 Map<ConstantExpression, ConstantValue> _valueMap =
1038 <ConstantExpression, ConstantValue>{}; 1035 <ConstantExpression, ConstantValue>{};
1039 1036
1040 KernelConstantEnvironment(this._worldBuilder); 1037 KernelConstantEnvironment(this._worldBuilder);
1041 1038
1042 @override 1039 @override
1043 ConstantSystem get constantSystem => const JavaScriptConstantSystem(); 1040 ConstantSystem get constantSystem => const JavaScriptConstantSystem();
1044 1041
1045 @override 1042 @override
1046 ConstantValue getConstantValueForVariable(VariableElement element) { 1043 ConstantValue getConstantValueForVariable(VariableElement element) {
(...skipping 11 matching lines...) Expand all
1058 1055
1059 @override 1056 @override
1060 bool hasConstantValue(ConstantExpression expression) { 1057 bool hasConstantValue(ConstantExpression expression) {
1061 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue"); 1058 throw new UnimplementedError("KernelConstantEnvironment.hasConstantValue");
1062 } 1059 }
1063 } 1060 }
1064 1061
1065 /// Evaluation environment used for computing [ConstantValue]s for 1062 /// Evaluation environment used for computing [ConstantValue]s for
1066 /// kernel based [ConstantExpression]s. 1063 /// kernel based [ConstantExpression]s.
1067 class _EvaluationEnvironment implements Environment { 1064 class _EvaluationEnvironment implements Environment {
1068 final KernelWorldBuilder _worldBuilder; 1065 final KernelToElementMap _worldBuilder;
1069 1066
1070 _EvaluationEnvironment(this._worldBuilder); 1067 _EvaluationEnvironment(this._worldBuilder);
1071 1068
1072 @override 1069 @override
1073 CommonElements get commonElements { 1070 CommonElements get commonElements {
1074 throw new UnimplementedError("_EvaluationEnvironment.commonElements"); 1071 throw new UnimplementedError("_EvaluationEnvironment.commonElements");
1075 } 1072 }
1076 1073
1077 @override 1074 @override
1078 InterfaceType substByContext(InterfaceType base, InterfaceType target) { 1075 InterfaceType substByContext(InterfaceType base, InterfaceType target) {
(...skipping 18 matching lines...) Expand all
1097 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant"); 1094 throw new UnimplementedError("_EvaluationEnvironment.getLocalConstant");
1098 } 1095 }
1099 1096
1100 @override 1097 @override
1101 String readFromEnvironment(String name) { 1098 String readFromEnvironment(String name) {
1102 throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment"); 1099 throw new UnimplementedError("_EvaluationEnvironment.readFromEnvironment");
1103 } 1100 }
1104 } 1101 }
1105 1102
1106 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase { 1103 class KernelResolutionWorldBuilder extends KernelResolutionWorldBuilderBase {
1107 final KernelWorldBuilder worldBuilder; 1104 final KernelToElementMap elementMap;
1108 1105
1109 KernelResolutionWorldBuilder( 1106 KernelResolutionWorldBuilder(this.elementMap, NativeBasicData nativeBasicData,
1110 this.worldBuilder,
1111 NativeBasicData nativeBasicData,
1112 SelectorConstraintsStrategy selectorConstraintsStrategy) 1107 SelectorConstraintsStrategy selectorConstraintsStrategy)
1113 : super(worldBuilder.elementEnvironment, worldBuilder.commonElements, 1108 : super(elementMap.elementEnvironment, elementMap.commonElements,
1114 nativeBasicData, selectorConstraintsStrategy); 1109 nativeBasicData, selectorConstraintsStrategy);
1115 1110
1116 @override 1111 @override
1117 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { 1112 Iterable<InterfaceType> getSupertypes(ClassEntity cls) {
1118 return worldBuilder._getOrderedTypeSet(cls).supertypes; 1113 return elementMap._getOrderedTypeSet(cls).supertypes;
1119 } 1114 }
1120 1115
1121 @override 1116 @override
1122 ClassEntity getSuperClass(ClassEntity cls) { 1117 ClassEntity getSuperClass(ClassEntity cls) {
1123 return worldBuilder._getSuperType(cls)?.element; 1118 return elementMap._getSuperType(cls)?.element;
1124 } 1119 }
1125 1120
1126 @override 1121 @override
1127 bool implementsFunction(ClassEntity cls) { 1122 bool implementsFunction(ClassEntity cls) {
1128 // TODO(johnniwinther): Implement this. 1123 // TODO(johnniwinther): Implement this.
1129 return false; 1124 return false;
1130 } 1125 }
1131 1126
1132 @override 1127 @override
1133 int getHierarchyDepth(ClassEntity cls) { 1128 int getHierarchyDepth(ClassEntity cls) {
1134 return worldBuilder._getHierarchyDepth(cls); 1129 return elementMap._getHierarchyDepth(cls);
1135 } 1130 }
1136 1131
1137 @override 1132 @override
1138 ClassEntity getAppliedMixin(ClassEntity cls) { 1133 ClassEntity getAppliedMixin(ClassEntity cls) {
1139 // TODO(johnniwinther): Implement this. 1134 // TODO(johnniwinther): Implement this.
1140 return null; 1135 return null;
1141 } 1136 }
1142 1137
1143 @override 1138 @override
1144 bool validateClass(ClassEntity cls) => true; 1139 bool validateClass(ClassEntity cls) => true;
1145 1140
1146 @override 1141 @override
1147 bool checkClass(ClassEntity cls) => true; 1142 bool checkClass(ClassEntity cls) => true;
1148 } 1143 }
1149 1144
1150 // Interface for testing equivalence of Kernel-based entities. 1145 // Interface for testing equivalence of Kernel-based entities.
1151 class WorldDeconstructionForTesting { 1146 class WorldDeconstructionForTesting {
1152 final KernelWorldBuilder builder; 1147 final KernelToElementMap builder;
1153 1148
1154 WorldDeconstructionForTesting(this.builder); 1149 WorldDeconstructionForTesting(this.builder);
1155 1150
1156 Uri getLibraryUri(KLibrary library) { 1151 Uri getLibraryUri(KLibrary library) {
1157 return builder._libraryEnvs[library.libraryIndex].library.importUri; 1152 return builder._libraryEnvs[library.libraryIndex].library.importUri;
1158 } 1153 }
1159 1154
1160 KLibrary getLibraryForClass(KClass cls) { 1155 KLibrary getLibraryForClass(KClass cls) {
1161 KClassEnv env = builder._classEnvs[cls.classIndex]; 1156 _KClassEnv env = builder._classEnvs[cls.classIndex];
1162 return builder.getLibrary(env.cls.enclosingLibrary); 1157 return builder.getLibrary(env.cls.enclosingLibrary);
1163 } 1158 }
1164 1159
1165 KLibrary _getLibrary<E>(E member, Map<ir.Member, E> map) { 1160 KLibrary _getLibrary<E>(E member, Map<ir.Member, E> map) {
1166 ir.Library library; 1161 ir.Library library;
1167 map.forEach((ir.Member node, E other) { 1162 map.forEach((ir.Member node, E other) {
1168 if (library == null && member == other) { 1163 if (library == null && member == other) {
1169 library = node.enclosingLibrary; 1164 library = node.enclosingLibrary;
1170 } 1165 }
1171 }); 1166 });
1172 if (library == null) { 1167 if (library == null) {
1173 throw new ArgumentError("No library found for $member"); 1168 throw new ArgumentError("No library found for $member");
1174 } 1169 }
1175 return builder._getLibrary(library); 1170 return builder._getLibrary(library);
1176 } 1171 }
1177 1172
1178 KLibrary getLibraryForFunction(KFunction function) => 1173 KLibrary getLibraryForFunction(KFunction function) =>
1179 _getLibrary(function, builder._methodMap); 1174 _getLibrary(function, builder._methodMap);
1180 1175
1181 KLibrary getLibraryForField(KField field) => 1176 KLibrary getLibraryForField(KField field) =>
1182 _getLibrary(field, builder._fieldMap); 1177 _getLibrary(field, builder._fieldMap);
1183 1178
1184 KClass getSuperclassForClass(KClass cls) { 1179 KClass getSuperclassForClass(KClass cls) {
1185 KClassEnv env = builder._classEnvs[cls.classIndex]; 1180 _KClassEnv env = builder._classEnvs[cls.classIndex];
1186 ir.Supertype supertype = env.cls.supertype; 1181 ir.Supertype supertype = env.cls.supertype;
1187 if (supertype == null) return null; 1182 if (supertype == null) return null;
1188 return builder.getClass(supertype.classNode); 1183 return builder.getClass(supertype.classNode);
1189 } 1184 }
1190 1185
1191 InterfaceType getMixinTypeForClass(KClass cls) { 1186 InterfaceType getMixinTypeForClass(KClass cls) {
1192 KClassEnv env = builder._classEnvs[cls.classIndex]; 1187 _KClassEnv env = builder._classEnvs[cls.classIndex];
1193 ir.Supertype mixedInType = env.cls.mixedInType; 1188 ir.Supertype mixedInType = env.cls.mixedInType;
1194 if (mixedInType == null) return null; 1189 if (mixedInType == null) return null;
1195 return builder.createInterfaceType( 1190 return builder.createInterfaceType(
1196 mixedInType.classNode, mixedInType.typeArguments); 1191 mixedInType.classNode, mixedInType.typeArguments);
1197 } 1192 }
1198 } 1193 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/kernel/native_basic_data.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698