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

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

Issue 2992863002: Support forEachClassMember on closure classes (Closed)
Patch Set: Created 3 years, 4 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
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.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 '../closure.dart' show BoxLocal; 9 import '../closure.dart' show BoxLocal;
10 import '../common.dart'; 10 import '../common.dart';
(...skipping 19 matching lines...) Expand all
30 import '../js_backend/native_data.dart'; 30 import '../js_backend/native_data.dart';
31 import '../js_backend/no_such_method_registry.dart'; 31 import '../js_backend/no_such_method_registry.dart';
32 import '../js_backend/runtime_types.dart'; 32 import '../js_backend/runtime_types.dart';
33 import '../js_model/closure.dart'; 33 import '../js_model/closure.dart';
34 import '../js_model/elements.dart'; 34 import '../js_model/elements.dart';
35 import '../native/enqueue.dart'; 35 import '../native/enqueue.dart';
36 import '../native/native.dart' as native; 36 import '../native/native.dart' as native;
37 import '../native/resolver.dart'; 37 import '../native/resolver.dart';
38 import '../ordered_typeset.dart'; 38 import '../ordered_typeset.dart';
39 import '../options.dart'; 39 import '../options.dart';
40 import '../ssa/kernel_impact.dart';
40 import '../universe/class_set.dart'; 41 import '../universe/class_set.dart';
41 import '../universe/selector.dart'; 42 import '../universe/selector.dart';
42 import '../universe/world_builder.dart'; 43 import '../universe/world_builder.dart';
43 import '../world.dart'; 44 import '../world.dart';
44 import '../util/util.dart' show Link, LinkBuilder; 45 import '../util/util.dart' show Link, LinkBuilder;
45 import 'element_map.dart'; 46 import 'element_map.dart';
46 import 'element_map_mixins.dart'; 47 import 'element_map_mixins.dart';
47 import 'elements.dart'; 48 import 'elements.dart';
48 import 'env.dart'; 49 import 'env.dart';
49 import 'kelements.dart'; 50 import 'kelements.dart';
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 } 129 }
129 130
130 LibraryEntity get _mainLibrary { 131 LibraryEntity get _mainLibrary {
131 return _env.mainMethod != null 132 return _env.mainMethod != null
132 ? _getLibrary(_env.mainMethod.enclosingLibrary) 133 ? _getLibrary(_env.mainMethod.enclosingLibrary)
133 : null; 134 : null;
134 } 135 }
135 136
136 Iterable<LibraryEntity> get _libraries; 137 Iterable<LibraryEntity> get _libraries;
137 138
138 SourceSpan _getSourceSpanFromTreeNode(ir.TreeNode node) {
139 // TODO(johnniwinther): Use [ir.Location] directly as a [SourceSpan].
140 Uri uri;
141 int offset;
142 while (node != null) {
143 if (node.fileOffset != ir.TreeNode.noOffset) {
144 offset = node.fileOffset;
145 uri = Uri.parse(node.location.file);
146 break;
147 }
148 node = node.parent;
149 }
150 if (uri != null) {
151 return new SourceSpan(uri, offset, offset + 1);
152 }
153 return null;
154 }
155
156 SourceSpan getSourceSpan(Spannable spannable, Entity currentElement) { 139 SourceSpan getSourceSpan(Spannable spannable, Entity currentElement) {
157 SourceSpan fromSpannable(Spannable spannable) { 140 SourceSpan fromSpannable(Spannable spannable) {
158 if (spannable is IndexedLibrary && 141 if (spannable is IndexedLibrary &&
159 spannable.libraryIndex < _libraryEnvs.length) { 142 spannable.libraryIndex < _libraryEnvs.length) {
160 LibraryEnv env = _libraryEnvs[spannable.libraryIndex]; 143 LibraryEnv env = _libraryEnvs[spannable.libraryIndex];
161 return _getSourceSpanFromTreeNode(env.library); 144 return computeSourceSpanFromTreeNode(env.library);
162 } else if (spannable is IndexedClass && 145 } else if (spannable is IndexedClass &&
163 spannable.classIndex < _classEnvs.length) { 146 spannable.classIndex < _classEnvs.length) {
164 ClassEnv env = _classEnvs[spannable.classIndex]; 147 ClassData data = _classData[spannable.classIndex];
165 return _getSourceSpanFromTreeNode(env.cls); 148 return data.definition.location;
166 } else if (spannable is IndexedMember && 149 } else if (spannable is IndexedMember &&
167 spannable.memberIndex < _memberData.length) { 150 spannable.memberIndex < _memberData.length) {
168 MemberData data = _memberData[spannable.memberIndex]; 151 MemberData data = _memberData[spannable.memberIndex];
169 return _getSourceSpanFromTreeNode(data.node); 152 return data.definition.location;
170 } 153 }
171 return null; 154 return null;
172 } 155 }
173 156
174 SourceSpan sourceSpan = fromSpannable(spannable); 157 SourceSpan sourceSpan = fromSpannable(spannable);
175 sourceSpan ??= fromSpannable(currentElement); 158 sourceSpan ??= fromSpannable(currentElement);
176 return sourceSpan; 159 return sourceSpan;
177 } 160 }
178 161
179 LibraryEntity lookupLibrary(Uri uri) { 162 LibraryEntity lookupLibrary(Uri uri) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 if (!classEnv.isUnnamedMixinApplication) { 205 if (!classEnv.isUnnamedMixinApplication) {
223 f(_getClass(classEnv.cls, classEnv)); 206 f(_getClass(classEnv.cls, classEnv));
224 } 207 }
225 }); 208 });
226 } 209 }
227 210
228 MemberEntity lookupClassMember(IndexedClass cls, String name, 211 MemberEntity lookupClassMember(IndexedClass cls, String name,
229 {bool setter: false}) { 212 {bool setter: false}) {
230 assert(checkFamily(cls)); 213 assert(checkFamily(cls));
231 ClassEnv classEnv = _classEnvs[cls.classIndex]; 214 ClassEnv classEnv = _classEnvs[cls.classIndex];
232 ir.Member member = classEnv.lookupMember(name, setter: setter); 215 return classEnv.lookupMember(this, name, setter: setter);
233 return member != null ? getMember(member) : null;
234 } 216 }
235 217
236 ConstructorEntity lookupConstructor(IndexedClass cls, String name) { 218 ConstructorEntity lookupConstructor(IndexedClass cls, String name) {
237 assert(checkFamily(cls)); 219 assert(checkFamily(cls));
238 ClassEnv classEnv = _classEnvs[cls.classIndex]; 220 ClassEnv classEnv = _classEnvs[cls.classIndex];
239 ir.Member member = classEnv.lookupConstructor(name); 221 return classEnv.lookupConstructor(this, name);
240 return member != null ? getConstructor(member) : null;
241 } 222 }
242 223
243 @override 224 @override
244 InterfaceType createInterfaceType( 225 InterfaceType createInterfaceType(
245 ir.Class cls, List<ir.DartType> typeArguments) { 226 ir.Class cls, List<ir.DartType> typeArguments) {
246 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); 227 return new InterfaceType(getClass(cls), getDartTypes(typeArguments));
247 } 228 }
248 229
249 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node); 230 LibraryEntity getLibrary(ir.Library node) => _getLibrary(node);
250 231
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 341
361 MemberEntity getSuperMember(ir.Member context, ir.Name name, ir.Member target, 342 MemberEntity getSuperMember(ir.Member context, ir.Name name, ir.Member target,
362 {bool setter: false}) { 343 {bool setter: false}) {
363 if (target != null) { 344 if (target != null) {
364 return getMember(target); 345 return getMember(target);
365 } 346 }
366 ClassEntity cls = getMember(context).enclosingClass; 347 ClassEntity cls = getMember(context).enclosingClass;
367 IndexedClass superclass = _getSuperType(cls)?.element; 348 IndexedClass superclass = _getSuperType(cls)?.element;
368 while (superclass != null) { 349 while (superclass != null) {
369 ClassEnv env = _classEnvs[superclass.classIndex]; 350 ClassEnv env = _classEnvs[superclass.classIndex];
370 ir.Member superMember = env.lookupMember(name.name, setter: setter); 351 MemberEntity superMember =
352 env.lookupMember(this, name.name, setter: setter);
371 if (superMember != null) { 353 if (superMember != null) {
372 return getMember(superMember); 354 return superMember;
373 } 355 }
374 superclass = _getSuperType(superclass)?.element; 356 superclass = _getSuperType(superclass)?.element;
375 } 357 }
376 throw failedAt(cls, "No super method member found for ${name} in $cls."); 358 throw failedAt(cls, "No super method member found for ${name} in $cls.");
377 } 359 }
378 360
379 @override 361 @override
380 ConstructorEntity getConstructor(ir.Member node) => _getConstructor(node); 362 ConstructorEntity getConstructor(ir.Member node) => _getConstructor(node);
381 363
382 ConstructorEntity _getConstructor(ir.Member node); 364 ConstructorEntity _getConstructor(ir.Member node);
383 365
384 ConstructorEntity getSuperConstructor( 366 ConstructorEntity getSuperConstructor(
385 ir.Constructor sourceNode, ir.Member targetNode) { 367 ir.Constructor sourceNode, ir.Member targetNode) {
386 ConstructorEntity source = getConstructor(sourceNode); 368 ConstructorEntity source = getConstructor(sourceNode);
387 ClassEntity sourceClass = source.enclosingClass; 369 ClassEntity sourceClass = source.enclosingClass;
388 ConstructorEntity target = getConstructor(targetNode); 370 ConstructorEntity target = getConstructor(targetNode);
389 ClassEntity targetClass = target.enclosingClass; 371 ClassEntity targetClass = target.enclosingClass;
390 IndexedClass superClass = _getSuperType(sourceClass)?.element; 372 IndexedClass superClass = _getSuperType(sourceClass)?.element;
391 if (superClass == targetClass) { 373 if (superClass == targetClass) {
392 return target; 374 return target;
393 } 375 }
394 ClassEnv env = _classEnvs[superClass.classIndex]; 376 ClassEnv env = _classEnvs[superClass.classIndex];
395 ir.Member member = env.lookupConstructor(target.name); 377 ConstructorEntity constructor = env.lookupConstructor(this, target.name);
396 if (member != null) { 378 if (constructor != null) {
397 return getConstructor(member); 379 return constructor;
398 } 380 }
399 throw failedAt(source, "Super constructor for $source not found."); 381 throw failedAt(source, "Super constructor for $source not found.");
400 } 382 }
401 383
402 @override 384 @override
403 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node); 385 FunctionEntity getMethod(ir.Procedure node) => _getMethod(node);
404 386
405 FunctionEntity _getMethod(ir.Procedure node); 387 FunctionEntity _getMethod(ir.Procedure node);
406 388
407 @override 389 @override
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 if (data.mixedInType != null) { 505 if (data.mixedInType != null) {
524 f(data.mixedInType.element); 506 f(data.mixedInType.element);
525 } 507 }
526 cls = data.supertype?.element; 508 cls = data.supertype?.element;
527 } 509 }
528 } 510 }
529 511
530 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) { 512 void _forEachConstructor(IndexedClass cls, void f(ConstructorEntity member)) {
531 assert(checkFamily(cls)); 513 assert(checkFamily(cls));
532 ClassEnv env = _classEnvs[cls.classIndex]; 514 ClassEnv env = _classEnvs[cls.classIndex];
533 env.forEachConstructor((ir.Member member) { 515 env.forEachConstructor(this, f);
534 f(getConstructor(member));
535 });
536 } 516 }
537 517
538 void _forEachConstructorBody( 518 void _forEachConstructorBody(
539 IndexedClass cls, void f(ConstructorBodyEntity member)) { 519 IndexedClass cls, void f(ConstructorBodyEntity member)) {
540 throw new UnsupportedError( 520 throw new UnsupportedError(
541 'KernelToElementMapBase._forEachConstructorBody'); 521 'KernelToElementMapBase._forEachConstructorBody');
542 } 522 }
543 523
544 void _forEachClassMember( 524 void _forEachClassMember(
545 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) { 525 IndexedClass cls, void f(ClassEntity cls, MemberEntity member)) {
546 assert(checkFamily(cls)); 526 assert(checkFamily(cls));
547 ClassEnv env = _classEnvs[cls.classIndex]; 527 ClassEnv env = _classEnvs[cls.classIndex];
548 env.forEachMember((ir.Member member) { 528 env.forEachMember(this, (MemberEntity member) {
549 f(cls, getMember(member)); 529 f(cls, member);
550 }); 530 });
551 ClassData data = _classData[cls.classIndex]; 531 ClassData data = _classData[cls.classIndex];
552 _ensureSupertypes(cls, data); 532 _ensureSupertypes(cls, data);
553 if (data.supertype != null) { 533 if (data.supertype != null) {
554 _forEachClassMember(data.supertype.element, f); 534 _forEachClassMember(data.supertype.element, f);
555 } 535 }
556 } 536 }
557 537
558 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) { 538 ConstantConstructor _getConstructorConstant(IndexedConstructor constructor) {
559 assert(checkFamily(constructor)); 539 assert(checkFamily(constructor));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) { 575 Iterable<InterfaceType> _getInterfaces(IndexedClass cls) {
596 assert(checkFamily(cls)); 576 assert(checkFamily(cls));
597 ClassData data = _classData[cls.classIndex]; 577 ClassData data = _classData[cls.classIndex];
598 _ensureSupertypes(cls, data); 578 _ensureSupertypes(cls, data);
599 return data.interfaces; 579 return data.interfaces;
600 } 580 }
601 581
602 Spannable _getSpannable(MemberEntity member, ir.Node node) { 582 Spannable _getSpannable(MemberEntity member, ir.Node node) {
603 SourceSpan sourceSpan; 583 SourceSpan sourceSpan;
604 if (node is ir.TreeNode) { 584 if (node is ir.TreeNode) {
605 sourceSpan = _getSourceSpanFromTreeNode(node); 585 sourceSpan = computeSourceSpanFromTreeNode(node);
606 } 586 }
607 sourceSpan ??= getSourceSpan(member, null); 587 sourceSpan ??= getSourceSpan(member, null);
608 return sourceSpan; 588 return sourceSpan;
609 } 589 }
610 590
611 MemberDefinition _getMemberDefinition(covariant IndexedMember member) { 591 MemberDefinition _getMemberDefinition(covariant IndexedMember member) {
612 assert(checkFamily(member)); 592 assert(checkFamily(member));
613 return _memberData[member.memberIndex].definition; 593 return _memberData[member.memberIndex].definition;
614 } 594 }
615 595
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 name, _getParameterStructure(functionNode), 734 name, _getParameterStructure(functionNode),
755 isExternal: isExternal, 735 isExternal: isExternal,
756 isConst: node.isConst, 736 isConst: node.isConst,
757 isFromEnvironmentConstructor: isFromEnvironment); 737 isFromEnvironmentConstructor: isFromEnvironment);
758 definition = new RegularMemberDefinition(constructor, node); 738 definition = new RegularMemberDefinition(constructor, node);
759 } else { 739 } else {
760 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan]. 740 // TODO(johnniwinther): Convert `node.location` to a [SourceSpan].
761 throw failedAt( 741 throw failedAt(
762 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}."); 742 NO_LOCATION_SPANNABLE, "Unexpected constructor node: ${node}.");
763 } 743 }
764 _memberData.add(new ConstructorData(node, functionNode, definition)); 744 _memberData.add(new ConstructorDataImpl(node, functionNode, definition));
765 _memberList.add(constructor); 745 _memberList.add(constructor);
766 return constructor; 746 return constructor;
767 }); 747 });
768 } 748 }
769 749
750 AsyncMarker _getAsyncMarker(ir.FunctionNode node) {
751 switch (node.asyncMarker) {
752 case ir.AsyncMarker.Async:
753 return AsyncMarker.ASYNC;
754 case ir.AsyncMarker.AsyncStar:
755 return AsyncMarker.ASYNC_STAR;
756 case ir.AsyncMarker.Sync:
757 return AsyncMarker.SYNC;
758 case ir.AsyncMarker.SyncStar:
759 return AsyncMarker.SYNC_STAR;
760 case ir.AsyncMarker.SyncYielding:
761 default:
762 throw new UnsupportedError(
763 "Async marker ${node.asyncMarker} is not supported.");
764 }
765 }
766
770 FunctionEntity _getMethod(ir.Procedure node) { 767 FunctionEntity _getMethod(ir.Procedure node) {
771 return _methodMap.putIfAbsent(node, () { 768 return _methodMap.putIfAbsent(node, () {
772 int memberIndex = _memberData.length; 769 int memberIndex = _memberData.length;
773 LibraryEntity library; 770 LibraryEntity library;
774 ClassEntity enclosingClass; 771 ClassEntity enclosingClass;
775 if (node.enclosingClass != null) { 772 if (node.enclosingClass != null) {
776 enclosingClass = _getClass(node.enclosingClass); 773 enclosingClass = _getClass(node.enclosingClass);
777 library = enclosingClass.library; 774 library = enclosingClass.library;
778 } else { 775 } else {
779 library = _getLibrary(node.enclosingLibrary); 776 library = _getLibrary(node.enclosingLibrary);
780 } 777 }
781 Name name = getName(node.name); 778 Name name = getName(node.name);
782 bool isStatic = node.isStatic; 779 bool isStatic = node.isStatic;
783 bool isExternal = node.isExternal; 780 bool isExternal = node.isExternal;
784 bool isAbstract = node.isAbstract; 781 bool isAbstract = node.isAbstract;
785 IndexedFunction function; 782 IndexedFunction function;
786 AsyncMarker asyncMarker; 783 AsyncMarker asyncMarker = _getAsyncMarker(node.function);
787 switch (node.function.asyncMarker) {
788 case ir.AsyncMarker.Async:
789 asyncMarker = AsyncMarker.ASYNC;
790 break;
791 case ir.AsyncMarker.AsyncStar:
792 asyncMarker = AsyncMarker.ASYNC_STAR;
793 break;
794 case ir.AsyncMarker.Sync:
795 asyncMarker = AsyncMarker.SYNC;
796 break;
797 case ir.AsyncMarker.SyncStar:
798 asyncMarker = AsyncMarker.SYNC_STAR;
799 break;
800 case ir.AsyncMarker.SyncYielding:
801 throw new UnsupportedError(
802 "Async marker ${node.function.asyncMarker} is not supported.");
803 }
804 switch (node.kind) { 784 switch (node.kind) {
805 case ir.ProcedureKind.Factory: 785 case ir.ProcedureKind.Factory:
806 throw new UnsupportedError("Cannot create method from factory."); 786 throw new UnsupportedError("Cannot create method from factory.");
807 case ir.ProcedureKind.Getter: 787 case ir.ProcedureKind.Getter:
808 function = createGetter( 788 function = createGetter(
809 memberIndex, library, enclosingClass, name, asyncMarker, 789 memberIndex, library, enclosingClass, name, asyncMarker,
810 isStatic: isStatic, 790 isStatic: isStatic,
811 isExternal: isExternal, 791 isExternal: isExternal,
812 isAbstract: isAbstract); 792 isAbstract: isAbstract);
813 break; 793 break;
814 case ir.ProcedureKind.Method: 794 case ir.ProcedureKind.Method:
815 case ir.ProcedureKind.Operator: 795 case ir.ProcedureKind.Operator:
816 function = createMethod(memberIndex, library, enclosingClass, name, 796 function = createMethod(memberIndex, library, enclosingClass, name,
817 _getParameterStructure(node.function), asyncMarker, 797 _getParameterStructure(node.function), asyncMarker,
818 isStatic: isStatic, 798 isStatic: isStatic,
819 isExternal: isExternal, 799 isExternal: isExternal,
820 isAbstract: isAbstract); 800 isAbstract: isAbstract);
821 break; 801 break;
822 case ir.ProcedureKind.Setter: 802 case ir.ProcedureKind.Setter:
823 assert(asyncMarker == AsyncMarker.SYNC); 803 assert(asyncMarker == AsyncMarker.SYNC);
824 function = createSetter( 804 function = createSetter(
825 memberIndex, library, enclosingClass, name.setter, 805 memberIndex, library, enclosingClass, name.setter,
826 isStatic: isStatic, 806 isStatic: isStatic,
827 isExternal: isExternal, 807 isExternal: isExternal,
828 isAbstract: isAbstract); 808 isAbstract: isAbstract);
829 break; 809 break;
830 } 810 }
831 _memberData.add(new FunctionData( 811 _memberData.add(new FunctionDataImpl(
832 node, node.function, new RegularMemberDefinition(function, node))); 812 node, node.function, new RegularMemberDefinition(function, node)));
833 _memberList.add(function); 813 _memberList.add(function);
834 return function; 814 return function;
835 }); 815 });
836 } 816 }
837 817
838 FieldEntity _getField(ir.Field node) { 818 FieldEntity _getField(ir.Field node) {
839 return _fieldMap.putIfAbsent(node, () { 819 return _fieldMap.putIfAbsent(node, () {
840 int memberIndex = _memberData.length; 820 int memberIndex = _memberData.length;
841 LibraryEntity library; 821 LibraryEntity library;
842 ClassEntity enclosingClass; 822 ClassEntity enclosingClass;
843 if (node.enclosingClass != null) { 823 if (node.enclosingClass != null) {
844 enclosingClass = _getClass(node.enclosingClass); 824 enclosingClass = _getClass(node.enclosingClass);
845 library = enclosingClass.library; 825 library = enclosingClass.library;
846 } else { 826 } else {
847 library = _getLibrary(node.enclosingLibrary); 827 library = _getLibrary(node.enclosingLibrary);
848 } 828 }
849 Name name = getName(node.name); 829 Name name = getName(node.name);
850 bool isStatic = node.isStatic; 830 bool isStatic = node.isStatic;
851 FieldEntity field = createField( 831 FieldEntity field = createField(
852 memberIndex, library, enclosingClass, name, 832 memberIndex, library, enclosingClass, name,
853 isStatic: isStatic, 833 isStatic: isStatic,
854 isAssignable: node.isMutable, 834 isAssignable: node.isMutable,
855 isConst: node.isConst); 835 isConst: node.isConst);
856 _memberData 836 _memberData.add(
857 .add(new FieldData(node, new RegularMemberDefinition(field, node))); 837 new FieldDataImpl(node, new RegularMemberDefinition(field, node)));
858 _memberList.add(field); 838 _memberList.add(field);
859 return field; 839 return field;
860 }); 840 });
861 } 841 }
862 842
863 ParameterStructure _getParameterStructure(ir.FunctionNode node) { 843 ParameterStructure _getParameterStructure(ir.FunctionNode node) {
864 // TODO(johnniwinther): Cache the computed function type. 844 // TODO(johnniwinther): Cache the computed function type.
865 int requiredParameters = node.requiredParameterCount; 845 int requiredParameters = node.requiredParameterCount;
866 int positionalParameters = node.positionalParameters.length; 846 int positionalParameters = node.positionalParameters.length;
867 List<String> namedParameters = 847 List<String> namedParameters =
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 /// compilation. 1012 /// compilation.
1033 void addProgram(ir.Program program) { 1013 void addProgram(ir.Program program) {
1034 _env.addProgram(program); 1014 _env.addProgram(program);
1035 } 1015 }
1036 1016
1037 @override 1017 @override
1038 native.BehaviorBuilder get nativeBehaviorBuilder => 1018 native.BehaviorBuilder get nativeBehaviorBuilder =>
1039 _nativeBehaviorBuilder ??= new KernelBehaviorBuilder(commonElements); 1019 _nativeBehaviorBuilder ??= new KernelBehaviorBuilder(commonElements);
1040 1020
1041 ResolutionImpact computeWorldImpact(KMember member) { 1021 ResolutionImpact computeWorldImpact(KMember member) {
1042 return _memberData[member.memberIndex].getWorldImpact(this); 1022 return buildKernelImpact(
1023 _memberData[member.memberIndex].definition.node, this);
1043 } 1024 }
1044 1025
1045 ClosureModel computeClosureModel(KMember member) { 1026 ClosureModel computeClosureModel(KMember member) {
1046 ir.Member node = _memberData[member.memberIndex].node; 1027 ir.Member node = _memberData[member.memberIndex].definition.node;
1047 return KernelClosureAnalysis.computeClosureModel(member, node); 1028 return KernelClosureAnalysis.computeClosureModel(member, node);
1048 } 1029 }
1049 1030
1050 /// Returns the kernel [ir.Procedure] node for the [method]. 1031 /// Returns the kernel [ir.Procedure] node for the [method].
1051 ir.Procedure _lookupProcedure(KFunction method) { 1032 ir.Procedure _lookupProcedure(KFunction method) {
1052 return _memberData[method.memberIndex].node; 1033 return _memberData[method.memberIndex].definition.node;
1053 } 1034 }
1054 1035
1055 Iterable<ConstantValue> _getClassMetadata(KClass cls) { 1036 Iterable<ConstantValue> _getClassMetadata(KClass cls) {
1056 return _classData[cls.classIndex].getMetadata(this); 1037 return _classData[cls.classIndex].getMetadata(this);
1057 } 1038 }
1058 1039
1059 @override 1040 @override
1060 Local getLocalFunction(ir.TreeNode node) { 1041 Local getLocalFunction(ir.TreeNode node) {
1061 assert( 1042 assert(
1062 node is ir.FunctionDeclaration || node is ir.FunctionExpression, 1043 node is ir.FunctionDeclaration || node is ir.FunctionExpression,
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
1703 1684
1704 @override 1685 @override
1705 ElementEnvironment get elementEnvironment => elementMap.elementEnvironment; 1686 ElementEnvironment get elementEnvironment => elementMap.elementEnvironment;
1706 1687
1707 @override 1688 @override
1708 CommonElements get commonElements => elementMap.commonElements; 1689 CommonElements get commonElements => elementMap.commonElements;
1709 1690
1710 @override 1691 @override
1711 native.NativeBehavior computeNativeFieldStoreBehavior( 1692 native.NativeBehavior computeNativeFieldStoreBehavior(
1712 covariant KField field) { 1693 covariant KField field) {
1713 ir.Field node = elementMap._memberData[field.memberIndex].node; 1694 ir.Field node = elementMap._memberData[field.memberIndex].definition.node;
1714 return elementMap.getNativeBehaviorForFieldStore(node); 1695 return elementMap.getNativeBehaviorForFieldStore(node);
1715 } 1696 }
1716 1697
1717 @override 1698 @override
1718 native.NativeBehavior computeNativeFieldLoadBehavior(covariant KField field, 1699 native.NativeBehavior computeNativeFieldLoadBehavior(covariant KField field,
1719 {bool isJsInterop}) { 1700 {bool isJsInterop}) {
1720 ir.Field node = elementMap._memberData[field.memberIndex].node; 1701 ir.Field node = elementMap._memberData[field.memberIndex].definition.node;
1721 return elementMap.getNativeBehaviorForFieldLoad(node, 1702 return elementMap.getNativeBehaviorForFieldLoad(node,
1722 isJsInterop: isJsInterop); 1703 isJsInterop: isJsInterop);
1723 } 1704 }
1724 1705
1725 @override 1706 @override
1726 native.NativeBehavior computeNativeMethodBehavior( 1707 native.NativeBehavior computeNativeMethodBehavior(
1727 covariant KFunction function, 1708 covariant KFunction function,
1728 {bool isJsInterop}) { 1709 {bool isJsInterop}) {
1729 ir.Member node = elementMap._memberData[function.memberIndex].node; 1710 ir.Member node =
1711 elementMap._memberData[function.memberIndex].definition.node;
1730 return elementMap.getNativeBehaviorForMethod(node, 1712 return elementMap.getNativeBehaviorForMethod(node,
1731 isJsInterop: isJsInterop); 1713 isJsInterop: isJsInterop);
1732 } 1714 }
1733 1715
1734 @override 1716 @override
1735 bool isNativeMethod(covariant KFunction function) { 1717 bool isNativeMethod(covariant KFunction function) {
1736 if (!native.maybeEnableNative(function.library.canonicalUri)) return false; 1718 if (!native.maybeEnableNative(function.library.canonicalUri)) return false;
1737 ir.Member node = elementMap._memberData[function.memberIndex].node; 1719 ir.Member node =
1720 elementMap._memberData[function.memberIndex].definition.node;
1738 return node.isExternal && 1721 return node.isExternal &&
1739 !elementMap.isForeignLibrary(node.enclosingLibrary); 1722 !elementMap.isForeignLibrary(node.enclosingLibrary);
1740 } 1723 }
1741 1724
1742 @override 1725 @override
1743 bool isJsInteropMember(MemberEntity element) { 1726 bool isJsInteropMember(MemberEntity element) {
1744 // TODO(redemption): Compute this. 1727 // TODO(redemption): Compute this.
1745 return false; 1728 return false;
1746 } 1729 }
1747 } 1730 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1813 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; 1796 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex];
1814 ClassEntity newClass = convertClass(newLibrary, oldClass); 1797 ClassEntity newClass = convertClass(newLibrary, oldClass);
1815 _classMap[env.cls] = newClass; 1798 _classMap[env.cls] = newClass;
1816 _classList.add(newClass); 1799 _classList.add(newClass);
1817 _classEnvs.add(env); 1800 _classEnvs.add(env);
1818 _classData.add(data.copy()); 1801 _classData.add(data.copy());
1819 } 1802 }
1820 for (int memberIndex = 0; 1803 for (int memberIndex = 0;
1821 memberIndex < _elementMap._memberData.length; 1804 memberIndex < _elementMap._memberData.length;
1822 memberIndex++) { 1805 memberIndex++) {
1823 MemberData data = _elementMap._memberData[memberIndex]; 1806 MemberDataImpl data = _elementMap._memberData[memberIndex];
1824 MemberEntity oldMember = _elementMap._memberList[memberIndex]; 1807 MemberEntity oldMember = _elementMap._memberList[memberIndex];
1825 IndexedLibrary oldLibrary = oldMember.library; 1808 IndexedLibrary oldLibrary = oldMember.library;
1826 IndexedClass oldClass = oldMember.enclosingClass; 1809 IndexedClass oldClass = oldMember.enclosingClass;
1827 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex]; 1810 LibraryEntity newLibrary = _libraryList[oldLibrary.libraryIndex];
1828 ClassEntity newClass = 1811 ClassEntity newClass =
1829 oldClass != null ? _classList[oldClass.classIndex] : null; 1812 oldClass != null ? _classList[oldClass.classIndex] : null;
1830 IndexedMember newMember = convertMember(newLibrary, newClass, oldMember); 1813 IndexedMember newMember = convertMember(newLibrary, newClass, oldMember);
1831 _memberList.add(newMember); 1814 _memberList.add(newMember);
1832 _memberData.add(data.copy()); 1815 _memberData.add(data.copy());
1833 if (newMember.isField) { 1816 if (newMember.isField) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1912 return constructor; 1895 return constructor;
1913 } 1896 }
1914 1897
1915 FunctionEntity getConstructorBody(ir.Constructor node) { 1898 FunctionEntity getConstructorBody(ir.Constructor node) {
1916 ConstructorEntity constructor = getConstructor(node); 1899 ConstructorEntity constructor = getConstructor(node);
1917 return _getConstructorBody(node, constructor); 1900 return _getConstructorBody(node, constructor);
1918 } 1901 }
1919 1902
1920 FunctionEntity _getConstructorBody( 1903 FunctionEntity _getConstructorBody(
1921 ir.Constructor node, covariant IndexedConstructor constructor) { 1904 ir.Constructor node, covariant IndexedConstructor constructor) {
1922 ConstructorData data = _memberData[constructor.memberIndex]; 1905 ConstructorDataImpl data = _memberData[constructor.memberIndex];
1923 if (data.constructorBody == null) { 1906 if (data.constructorBody == null) {
1924 data.constructorBody = 1907 ConstructorBodyEntity constructorBody = data.constructorBody =
1925 createConstructorBody(_memberList.length, constructor); 1908 createConstructorBody(_memberList.length, constructor);
1926 _memberList.add(data.constructorBody); 1909 _memberList.add(constructorBody);
1927 _memberData.add(new FunctionData( 1910 _memberData.add(new FunctionDataImpl(
1928 node, 1911 node,
1929 node.function, 1912 node.function,
1930 new SpecialMemberDefinition( 1913 new SpecialMemberDefinition(
1931 data.constructorBody, node, MemberKind.constructorBody))); 1914 constructorBody, node, MemberKind.constructorBody)));
1915 IndexedClass cls = constructor.enclosingClass;
1916 ClassEnvImpl classEnv = _classEnvs[cls.classIndex];
1917 // TODO(johnniwinther): Avoid this by only including live members in the
1918 // js-model.
1919 classEnv.addConstructorBody(constructorBody);
1932 } 1920 }
1933 return data.constructorBody; 1921 return data.constructorBody;
1934 } 1922 }
1935 1923
1936 ConstructorBodyEntity createConstructorBody( 1924 ConstructorBodyEntity createConstructorBody(
1937 int memberIndex, ConstructorEntity constructor); 1925 int memberIndex, ConstructorEntity constructor);
1938 1926
1939 @override 1927 @override
1940 MemberDefinition getMemberDefinition(MemberEntity member) { 1928 MemberDefinition getMemberDefinition(MemberEntity member) {
1941 return _getMemberDefinition(member); 1929 return _getMemberDefinition(member);
1942 } 1930 }
1943 1931
1944 @override 1932 @override
1945 ClassDefinition getClassDefinition(ClassEntity cls) { 1933 ClassDefinition getClassDefinition(ClassEntity cls) {
1946 return _getClassDefinition(cls); 1934 return _getClassDefinition(cls);
1947 } 1935 }
1948 1936
1949 @override 1937 @override
1950 ConstantValue getFieldConstantValue(ir.Field field) { 1938 ConstantValue getFieldConstantValue(ir.Field field) {
1951 // TODO(johnniwinther): Cache the result in [FieldData]. 1939 // TODO(johnniwinther): Cache the result in [FieldData].
1952 return getConstantValue(field.initializer, 1940 return getConstantValue(field.initializer,
1953 requireConstant: field.isConst, implicitNull: !field.isConst); 1941 requireConstant: field.isConst, implicitNull: !field.isConst);
1954 } 1942 }
1955 1943
1956 bool hasConstantFieldInitializer(covariant IndexedField field) { 1944 bool hasConstantFieldInitializer(covariant IndexedField field) {
1957 FieldData data = _memberData[field.memberIndex]; 1945 FieldData data = _memberData[field.memberIndex];
1958 return getFieldConstantValue(data.node) != null; 1946 return getFieldConstantValue(data.definition.node) != null;
1959 } 1947 }
1960 1948
1961 ConstantValue getConstantFieldInitializer(covariant IndexedField field) { 1949 ConstantValue getConstantFieldInitializer(covariant IndexedField field) {
1962 FieldData data = _memberData[field.memberIndex]; 1950 FieldData data = _memberData[field.memberIndex];
1963 ConstantValue value = getFieldConstantValue(data.node); 1951 ConstantValue value = getFieldConstantValue(data.definition.node);
1964 assert(value != null, 1952 assert(value != null,
1965 failedAt(field, "Field $field doesn't have a constant initial value.")); 1953 failedAt(field, "Field $field doesn't have a constant initial value."));
1966 return value; 1954 return value;
1967 } 1955 }
1968 1956
1969 void forEachParameter(covariant IndexedFunction function, 1957 void forEachParameter(covariant IndexedFunction function,
1970 void f(DartType type, String name, ConstantValue defaultValue)) { 1958 void f(DartType type, String name, ConstantValue defaultValue)) {
1971 FunctionData data = _memberData[function.memberIndex]; 1959 FunctionData data = _memberData[function.memberIndex];
1972 data.forEachParameter(this, f); 1960 data.forEachParameter(this, f);
1973 } 1961 }
1974 1962
1975 void _forEachConstructorBody( 1963 void _forEachConstructorBody(
1976 IndexedClass cls, void f(ConstructorBodyEntity member)) { 1964 IndexedClass cls, void f(ConstructorBodyEntity member)) {
1977 ClassEnv env = _classEnvs[cls.classIndex]; 1965 ClassEnv env = _classEnvs[cls.classIndex];
1978 env.forEachConstructor((ir.Member member) { 1966 env.forEachConstructorBody(f);
1979 IndexedConstructor constructor = _constructorMap[member];
1980 if (constructor == null) {
1981 // The constructor is not live.
1982 return;
1983 }
1984 ConstructorData data = _memberData[constructor.memberIndex];
1985 if (data.constructorBody != null) {
1986 f(data.constructorBody);
1987 }
1988 });
1989 } 1967 }
1990 1968
1991 KernelClosureClass constructClosureClass( 1969 KernelClosureClass constructClosureClass(
1992 MemberEntity member, 1970 MemberEntity member,
1993 ir.FunctionNode node, 1971 ir.FunctionNode node,
1994 JLibrary enclosingLibrary, 1972 JLibrary enclosingLibrary,
1995 KernelScopeInfo info, 1973 KernelScopeInfo info,
1996 ir.Location location, 1974 ir.Location location,
1997 KernelToLocalsMap localsMap, 1975 KernelToLocalsMap localsMap,
1998 InterfaceType supertype) { 1976 InterfaceType supertype) {
1999 String name = _computeClosureName(node); 1977 String name = _computeClosureName(node);
2000 KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(node, name, 1978 KernelClosureClass cls = new KernelClosureClass.fromScopeInfo(
2001 _classEnvs.length, enclosingLibrary, info, location, localsMap); 1979 node, name, _classEnvs.length, enclosingLibrary, info, localsMap);
2002 _classList.add(cls); 1980 _classList.add(cls);
2003 _classEnvs.add(new ClassEnv.closureClass()); 1981 Map<String, MemberEntity> memberMap = <String, MemberEntity>{};
1982 _classEnvs.add(new ClosureClassEnv(memberMap));
2004 1983
2005 // Create a classData and set up the interfaces and subclass 1984 // Create a classData and set up the interfaces and subclass
2006 // relationships that _ensureSupertypes and _ensureThisAndRawType are doing 1985 // relationships that _ensureSupertypes and _ensureThisAndRawType are doing
2007 var closureData = 1986 var closureData = new ClassData(null,
2008 new ClassData(null, new ClosureClassDefinition(cls, cls.location)); 1987 new ClosureClassDefinition(cls, computeSourceSpanFromTreeNode(node)));
2009 closureData 1988 closureData
2010 ..isMixinApplication = false 1989 ..isMixinApplication = false
2011 ..thisType = 1990 ..thisType =
2012 closureData.rawType = new InterfaceType(cls, const/*<DartType>*/ []) 1991 closureData.rawType = new InterfaceType(cls, const/*<DartType>*/ [])
2013 ..supertype = supertype 1992 ..supertype = supertype
2014 ..interfaces = const <InterfaceType>[]; 1993 ..interfaces = const <InterfaceType>[];
2015 var setBuilder = new _KernelOrderedTypeSetBuilder(this, cls); 1994 var setBuilder = new _KernelOrderedTypeSetBuilder(this, cls);
2016 _classData.add(closureData); 1995 _classData.add(closureData);
2017 closureData.orderedTypeSet = setBuilder.createOrderedTypeSet( 1996 closureData.orderedTypeSet = setBuilder.createOrderedTypeSet(
2018 closureData.supertype, const Link<InterfaceType>()); 1997 closureData.supertype, const Link<InterfaceType>());
2019 1998
2020 int i = 0; 1999 int i = 0;
2021 for (ir.VariableDeclaration variable in info.freeVariables) { 2000 for (ir.VariableDeclaration variable in info.freeVariables) {
2022 // Make a corresponding field entity in this closure class for every 2001 // Make a corresponding field entity in this closure class for every
2023 // single freeVariable in the KernelScopeInfo.freeVariable. 2002 // single freeVariable in the KernelScopeInfo.freeVariable.
2024 _constructClosureFields( 2003 _constructClosureFields(member, cls, memberMap, variable, i,
2025 member, cls, variable, i, info.capturedVariablesAccessor, localsMap); 2004 info.capturedVariablesAccessor, localsMap);
2026 i++; 2005 i++;
2027 } 2006 }
2028 2007
2029 cls.callMethod = new JClosureCallMethod(_memberData.length, cls, member); 2008 FunctionEntity callMethod = cls.callMethod = new JClosureCallMethod(
2009 _memberData.length,
2010 cls,
2011 _getParameterStructure(node),
2012 _getAsyncMarker(node));
2030 _memberList.add(cls.callMethod); 2013 _memberList.add(cls.callMethod);
2031 _memberData.add(new MemberData(
2032 null,
2033 new ClosureMemberDefinition(
2034 member, cls.location, MemberKind.closureCall, node.parent)));
2035 2014
2036 // TODO(efortuna): Does getMetadata get called in ClassData for this object? 2015 _memberData.add(new ClosureFunctionData(
2016 new ClosureMemberDefinition(callMethod, closureData.definition.location,
2017 MemberKind.closureCall, node.parent),
2018 getFunctionType(node)));
2019 memberMap[cls.callMethod.name] = cls.callMethod;
2037 return cls; 2020 return cls;
2038 } 2021 }
2039 2022
2040 _constructClosureFields( 2023 _constructClosureFields(
2041 MemberEntity member, 2024 MemberEntity member,
2042 KernelClosureClass cls, 2025 KernelClosureClass cls,
2026 Map<String, MemberEntity> memberMap,
2043 ir.VariableDeclaration variable, 2027 ir.VariableDeclaration variable,
2044 int fieldNumber, 2028 int fieldNumber,
2045 NodeBox box, 2029 NodeBox box,
2046 KernelToLocalsMap localsMap) { 2030 KernelToLocalsMap localsMap) {
2047 // NOTE: This construction order may be slightly different than the 2031 // NOTE: This construction order may be slightly different than the
2048 // old Element version. The old version did all the boxed items and then 2032 // old Element version. The old version did all the boxed items and then
2049 // all the others. 2033 // all the others.
2050 Local capturedLocal = localsMap.getLocalVariable(variable); 2034 Local capturedLocal = localsMap.getLocalVariable(variable);
2051 if (cls.isBoxed(capturedLocal)) { 2035 if (cls.isBoxed(capturedLocal)) {
2052 var boxedField = new JBoxedField( 2036 FieldEntity boxedField = new JBoxedField(
2053 _getClosureVariableName(capturedLocal.name, fieldNumber), 2037 _getClosureVariableName(capturedLocal.name, fieldNumber),
2054 _memberData.length, 2038 _memberData.length,
2055 new BoxLocal(box.name, 2039 new BoxLocal(box.name,
2056 localsMap.getLocalVariable(box.executableContext), member), 2040 localsMap.getLocalVariable(box.executableContext), member),
2057 cls, 2041 cls,
2058 variable.isConst, 2042 variable.isConst,
2059 variable.isFinal || variable.isConst); 2043 variable.isFinal || variable.isConst);
2060 cls.localToFieldMap[capturedLocal] = boxedField; 2044 cls.localToFieldMap[capturedLocal] = boxedField;
2061 _memberList.add(boxedField); 2045 _memberList.add(boxedField);
2062 _memberData.add(new MemberData( 2046 _memberData.add(new ClosureFieldData(new ClosureMemberDefinition(
2063 null, 2047 boxedField,
2064 new ClosureMemberDefinition(boxedField, variable.location, 2048 computeSourceSpanFromTreeNode(variable),
2065 MemberKind.closureField, variable))); 2049 MemberKind.closureField,
2050 variable)));
2051 memberMap[boxedField.name] = boxedField;
2066 } else { 2052 } else {
2067 var closureField = new JClosureField( 2053 FieldEntity closureField = new JClosureField(
2068 _getClosureVariableName(capturedLocal.name, fieldNumber), 2054 _getClosureVariableName(capturedLocal.name, fieldNumber),
2069 _memberData.length, 2055 _memberData.length,
2070 cls, 2056 cls,
2071 variable.isConst, 2057 variable.isConst,
2072 variable.isFinal || variable.isConst); 2058 variable.isFinal || variable.isConst);
2073 cls.localToFieldMap[capturedLocal] = closureField; 2059 cls.localToFieldMap[capturedLocal] = closureField;
2074 _memberList.add(closureField); 2060 _memberList.add(closureField);
2075 _memberData.add(new MemberData( 2061 _memberData.add(new ClosureFieldData(new ClosureMemberDefinition(
2076 null, 2062 cls.localToFieldMap[capturedLocal],
2077 new ClosureMemberDefinition(cls.localToFieldMap[capturedLocal], 2063 computeSourceSpanFromTreeNode(variable),
2078 variable.location, MemberKind.closureField, variable))); 2064 MemberKind.closureField,
2065 variable)));
2066 memberMap[closureField.name] = closureField;
2079 } 2067 }
2080 } 2068 }
2081 2069
2082 // Returns a non-unique name for the given closure element. 2070 // Returns a non-unique name for the given closure element.
2083 String _computeClosureName(ir.TreeNode treeNode) { 2071 String _computeClosureName(ir.TreeNode treeNode) {
2084 var parts = <String>[]; 2072 var parts = <String>[];
2085 if (treeNode is ir.Field && treeNode.name.name != "") { 2073 if (treeNode is ir.Field && treeNode.name.name != "") {
2086 parts.add(treeNode.name.name); 2074 parts.add(treeNode.name.name);
2087 } else { 2075 } else {
2088 parts.add('closure'); 2076 parts.add('closure');
2089 } 2077 }
2090 ir.TreeNode node = treeNode.parent; 2078 ir.TreeNode node = treeNode.parent;
2091 while (node != null && 2079 while (node != null) {
2092 (node is ir.Constructor ||
2093 node is ir.Class ||
2094 node is ir.FunctionNode ||
2095 node is ir.Procedure)) {
2096 // TODO(johnniwinther): Simplify computed names. 2080 // TODO(johnniwinther): Simplify computed names.
2097 if (node is ir.Constructor || 2081 if (node is ir.Constructor ||
2098 node.parent is ir.Constructor || 2082 node.parent is ir.Constructor ||
2099 (node is ir.Procedure && node.kind == ir.ProcedureKind.Factory)) { 2083 (node is ir.Procedure && node.kind == ir.ProcedureKind.Factory)) {
2100 FunctionEntity entity; 2084 FunctionEntity entity;
2101 if (node.parent is ir.Constructor) { 2085 if (node.parent is ir.Constructor) {
2102 entity = getConstructorBody(node); 2086 entity = getConstructorBody(node);
2103 } else { 2087 } else {
2104 entity = getMember(node); 2088 entity = getMember(node);
2105 } 2089 }
2106 parts.add(utils.reconstructConstructorName(entity)); 2090 parts.add(utils.reconstructConstructorName(entity));
2107 } else { 2091 } else {
2108 String surroundingName = '';
2109 if (node is ir.Class) { 2092 if (node is ir.Class) {
2110 surroundingName = Elements.operatorNameToIdentifier(node.name); 2093 parts.add(Elements.operatorNameToIdentifier(node.name));
2111 } else if (node is ir.Procedure) { 2094 } else if (node is ir.Procedure) {
2112 surroundingName = Elements.operatorNameToIdentifier(node.name.name); 2095 parts.add(Elements.operatorNameToIdentifier(node.name.name));
2113 } 2096 }
2114 parts.add(surroundingName);
2115 } 2097 }
2116 // A generative constructors's parent is the class; the class name is 2098 // A generative constructors's parent is the class; the class name is
2117 // already part of the generative constructor's name. 2099 // already part of the generative constructor's name.
2118 if (node is ir.Constructor) break; 2100 if (node is ir.Constructor) break;
2119 node = node.parent; 2101 node = node.parent;
2120 } 2102 }
2121 return parts.reversed.join('_'); 2103 return parts.reversed.join('_');
2122 } 2104 }
2123 2105
2124 /// Generate a unique name for the [id]th closure field, with proposed name 2106 /// Generate a unique name for the [id]th closure field, with proposed name
2125 /// [name]. 2107 /// [name].
2126 /// 2108 ///
2127 /// The result is used as the name of [ClosureFieldElement]s, and must 2109 /// The result is used as the name of [ClosureFieldElement]s, and must
2128 /// therefore be unique to avoid breaking an invariant in the element model 2110 /// therefore be unique to avoid breaking an invariant in the element model
2129 /// (classes cannot declare multiple fields with the same name). 2111 /// (classes cannot declare multiple fields with the same name).
2130 /// 2112 ///
2131 /// Also, the names should be distinct from real field names to prevent 2113 /// Also, the names should be distinct from real field names to prevent
2132 /// clashes with selectors for those fields. 2114 /// clashes with selectors for those fields.
2133 /// 2115 ///
2134 /// These names are not used in generated code, just as element name. 2116 /// These names are not used in generated code, just as element name.
2135 String _getClosureVariableName(String name, int id) { 2117 String _getClosureVariableName(String name, int id) {
2136 return "_captured_${name}_$id"; 2118 return "_captured_${name}_$id";
2137 } 2119 }
2138 2120
2139 String getDeferredUri(ir.LibraryDependency node) { 2121 String getDeferredUri(ir.LibraryDependency node) {
2140 throw new UnimplementedError('JsKernelToElementMap.getDeferredUri'); 2122 throw new UnimplementedError('JsKernelToElementMap.getDeferredUri');
2141 } 2123 }
2142 } 2124 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698