OLD | NEW |
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.kernel.element_map; | 5 library dart2js.kernel.element_map; |
6 | 6 |
7 import 'package:kernel/ast.dart' as ir; | 7 import 'package:kernel/ast.dart' as ir; |
8 import 'package:kernel/clone.dart'; | 8 import 'package:kernel/clone.dart'; |
9 import 'package:kernel/type_algebra.dart'; | 9 import 'package:kernel/type_algebra.dart'; |
10 | 10 |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 | 535 |
536 void _ensureSupertypes(KClass cls, _KClassEnv env) { | 536 void _ensureSupertypes(KClass cls, _KClassEnv env) { |
537 if (env.orderedTypeSet == null) { | 537 if (env.orderedTypeSet == null) { |
538 _ensureThisAndRawType(cls, env); | 538 _ensureThisAndRawType(cls, env); |
539 | 539 |
540 ir.Class node = env.cls; | 540 ir.Class node = env.cls; |
541 | 541 |
542 if (node.supertype == null) { | 542 if (node.supertype == null) { |
543 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); | 543 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); |
544 env.isMixinApplication = false; | 544 env.isMixinApplication = false; |
| 545 env.interfaces = const <InterfaceType>[]; |
545 } else { | 546 } else { |
546 InterfaceType processSupertype(ir.Supertype node) { | 547 InterfaceType processSupertype(ir.Supertype node) { |
547 InterfaceType type = _typeConverter.visitSupertype(node); | 548 InterfaceType type = _typeConverter.visitSupertype(node); |
548 KClass superclass = type.element; | 549 KClass superclass = type.element; |
549 _KClassEnv env = _classEnvs[superclass.classIndex]; | 550 _KClassEnv env = _classEnvs[superclass.classIndex]; |
550 _ensureSupertypes(superclass, env); | 551 _ensureSupertypes(superclass, env); |
551 return type; | 552 return type; |
552 } | 553 } |
553 | 554 |
554 env.supertype = processSupertype(node.supertype); | 555 env.supertype = processSupertype(node.supertype); |
555 LinkBuilder<InterfaceType> linkBuilder = | 556 LinkBuilder<InterfaceType> linkBuilder = |
556 new LinkBuilder<InterfaceType>(); | 557 new LinkBuilder<InterfaceType>(); |
557 if (node.mixedInType != null) { | 558 if (node.mixedInType != null) { |
558 env.isMixinApplication = true; | 559 env.isMixinApplication = true; |
559 linkBuilder | 560 linkBuilder |
560 .addLast(env.mixedInType = processSupertype(node.mixedInType)); | 561 .addLast(env.mixedInType = processSupertype(node.mixedInType)); |
561 } else { | 562 } else { |
562 env.isMixinApplication = false; | 563 env.isMixinApplication = false; |
563 } | 564 } |
564 node.implementedTypes.forEach((ir.Supertype supertype) { | 565 node.implementedTypes.forEach((ir.Supertype supertype) { |
565 linkBuilder.addLast(processSupertype(supertype)); | 566 linkBuilder.addLast(processSupertype(supertype)); |
566 }); | 567 }); |
567 Link<InterfaceType> interfaces = linkBuilder.toLink(); | 568 Link<InterfaceType> interfaces = linkBuilder.toLink(); |
568 OrderedTypeSetBuilder setBuilder = | 569 OrderedTypeSetBuilder setBuilder = |
569 new _KernelOrderedTypeSetBuilder(this, cls); | 570 new _KernelOrderedTypeSetBuilder(this, cls); |
570 env.orderedTypeSet = | 571 env.orderedTypeSet = |
571 setBuilder.createOrderedTypeSet(env.supertype, interfaces); | 572 setBuilder.createOrderedTypeSet(env.supertype, interfaces); |
| 573 env.interfaces = new List<InterfaceType>.from(interfaces.toList()); |
572 } | 574 } |
573 } | 575 } |
574 } | 576 } |
575 | 577 |
576 OrderedTypeSet _getOrderedTypeSet(KClass cls) { | 578 OrderedTypeSet _getOrderedTypeSet(KClass cls) { |
577 _KClassEnv env = _classEnvs[cls.classIndex]; | 579 _KClassEnv env = _classEnvs[cls.classIndex]; |
578 _ensureSupertypes(cls, env); | 580 _ensureSupertypes(cls, env); |
579 return env.orderedTypeSet; | 581 return env.orderedTypeSet; |
580 } | 582 } |
581 | 583 |
(...skipping 25 matching lines...) Expand all Loading... |
607 _ensureSupertypes(cls, env); | 609 _ensureSupertypes(cls, env); |
608 return env.isMixinApplication; | 610 return env.isMixinApplication; |
609 } | 611 } |
610 | 612 |
611 bool _isUnnamedMixinApplication(KClass cls) { | 613 bool _isUnnamedMixinApplication(KClass cls) { |
612 _KClassEnv env = _classEnvs[cls.classIndex]; | 614 _KClassEnv env = _classEnvs[cls.classIndex]; |
613 _ensureSupertypes(cls, env); | 615 _ensureSupertypes(cls, env); |
614 return env.isUnnamedMixinApplication; | 616 return env.isUnnamedMixinApplication; |
615 } | 617 } |
616 | 618 |
| 619 Iterable<InterfaceType> _getInterfaces(KClass cls) { |
| 620 _KClassEnv env = _classEnvs[cls.classIndex]; |
| 621 _ensureSupertypes(cls, env); |
| 622 return env.interfaces; |
| 623 } |
| 624 |
617 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { | 625 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { |
618 _KClassEnv env = _classEnvs[cls.classIndex]; | 626 _KClassEnv env = _classEnvs[cls.classIndex]; |
619 _ensureSupertypes(cls, env); | 627 _ensureSupertypes(cls, env); |
620 env.orderedTypeSet.supertypes.forEach(f); | 628 env.orderedTypeSet.supertypes.forEach(f); |
621 } | 629 } |
622 | 630 |
623 void _forEachMixin(KClass cls, void f(ClassEntity mixin)) { | 631 void _forEachMixin(KClass cls, void f(ClassEntity mixin)) { |
624 while (cls != null) { | 632 while (cls != null) { |
625 _KClassEnv env = _classEnvs[cls.classIndex]; | 633 _KClassEnv env = _classEnvs[cls.classIndex]; |
626 _ensureSupertypes(cls, env); | 634 _ensureSupertypes(cls, env); |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
917 /// Environment for fast lookup of class members. | 925 /// Environment for fast lookup of class members. |
918 class _KClassEnv { | 926 class _KClassEnv { |
919 final ir.Class cls; | 927 final ir.Class cls; |
920 bool isMixinApplication; | 928 bool isMixinApplication; |
921 final bool isUnnamedMixinApplication; | 929 final bool isUnnamedMixinApplication; |
922 | 930 |
923 InterfaceType thisType; | 931 InterfaceType thisType; |
924 InterfaceType rawType; | 932 InterfaceType rawType; |
925 InterfaceType supertype; | 933 InterfaceType supertype; |
926 InterfaceType mixedInType; | 934 InterfaceType mixedInType; |
| 935 List<InterfaceType> interfaces; |
927 OrderedTypeSet orderedTypeSet; | 936 OrderedTypeSet orderedTypeSet; |
928 | 937 |
929 Map<String, ir.Member> _constructorMap; | 938 Map<String, ir.Member> _constructorMap; |
930 Map<String, ir.Member> _memberMap; | 939 Map<String, ir.Member> _memberMap; |
931 Map<String, ir.Member> _setterMap; | 940 Map<String, ir.Member> _setterMap; |
932 | 941 |
933 Iterable<ConstantValue> _metadata; | 942 Iterable<ConstantValue> _metadata; |
934 | 943 |
935 _KClassEnv(this.cls) | 944 _KClassEnv(this.cls) |
936 // TODO(johnniwinther): Change this to use a property on [cls] when such | 945 // TODO(johnniwinther): Change this to use a property on [cls] when such |
(...skipping 604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1541 | 1550 |
1542 KernelResolutionWorldBuilder( | 1551 KernelResolutionWorldBuilder( |
1543 this.elementMap, | 1552 this.elementMap, |
1544 NativeBasicData nativeBasicData, | 1553 NativeBasicData nativeBasicData, |
1545 NativeDataBuilder nativeDataBuilder, | 1554 NativeDataBuilder nativeDataBuilder, |
1546 InterceptorDataBuilder interceptorDataBuilder, | 1555 InterceptorDataBuilder interceptorDataBuilder, |
1547 BackendUsageBuilder backendUsageBuilder, | 1556 BackendUsageBuilder backendUsageBuilder, |
1548 SelectorConstraintsStrategy selectorConstraintsStrategy) | 1557 SelectorConstraintsStrategy selectorConstraintsStrategy) |
1549 : super( | 1558 : super( |
1550 elementMap.elementEnvironment, | 1559 elementMap.elementEnvironment, |
| 1560 elementMap.types, |
1551 elementMap.commonElements, | 1561 elementMap.commonElements, |
1552 elementMap._constantEnvironment.constantSystem, | 1562 elementMap._constantEnvironment.constantSystem, |
1553 nativeBasicData, | 1563 nativeBasicData, |
1554 nativeDataBuilder, | 1564 nativeDataBuilder, |
1555 interceptorDataBuilder, | 1565 interceptorDataBuilder, |
1556 backendUsageBuilder, | 1566 backendUsageBuilder, |
1557 selectorConstraintsStrategy); | 1567 selectorConstraintsStrategy); |
1558 | 1568 |
1559 @override | 1569 @override |
1560 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { | 1570 Iterable<InterfaceType> getSupertypes(ClassEntity cls) { |
(...skipping 26 matching lines...) Expand all Loading... |
1587 | 1597 |
1588 @override | 1598 @override |
1589 bool checkClass(ClassEntity cls) => true; | 1599 bool checkClass(ClassEntity cls) => true; |
1590 } | 1600 } |
1591 | 1601 |
1592 class KernelClosedWorld extends ClosedWorldBase { | 1602 class KernelClosedWorld extends ClosedWorldBase { |
1593 final KernelToElementMapImpl _elementMap; | 1603 final KernelToElementMapImpl _elementMap; |
1594 | 1604 |
1595 KernelClosedWorld(this._elementMap, | 1605 KernelClosedWorld(this._elementMap, |
1596 {ElementEnvironment elementEnvironment, | 1606 {ElementEnvironment elementEnvironment, |
| 1607 DartTypes dartTypes, |
1597 CommonElements commonElements, | 1608 CommonElements commonElements, |
1598 ConstantSystem constantSystem, | 1609 ConstantSystem constantSystem, |
1599 NativeData nativeData, | 1610 NativeData nativeData, |
1600 InterceptorData interceptorData, | 1611 InterceptorData interceptorData, |
1601 BackendUsage backendUsage, | 1612 BackendUsage backendUsage, |
1602 ResolutionWorldBuilder resolutionWorldBuilder, | 1613 ResolutionWorldBuilder resolutionWorldBuilder, |
1603 Set<ClassEntity> implementedClasses, | 1614 Set<ClassEntity> implementedClasses, |
1604 FunctionSet functionSet, | 1615 FunctionSet functionSet, |
1605 Set<TypedefElement> allTypedefs, | 1616 Set<TypedefElement> allTypedefs, |
1606 Map<ClassEntity, Set<ClassEntity>> mixinUses, | 1617 Map<ClassEntity, Set<ClassEntity>> mixinUses, |
1607 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, | 1618 Map<ClassEntity, Set<ClassEntity>> typesImplementedBySubclasses, |
1608 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, | 1619 Map<ClassEntity, ClassHierarchyNode> classHierarchyNodes, |
1609 Map<ClassEntity, ClassSet> classSets}) | 1620 Map<ClassEntity, ClassSet> classSets}) |
1610 : super( | 1621 : super( |
1611 elementEnvironment: elementEnvironment, | 1622 elementEnvironment: elementEnvironment, |
| 1623 dartTypes: dartTypes, |
1612 commonElements: commonElements, | 1624 commonElements: commonElements, |
1613 constantSystem: constantSystem, | 1625 constantSystem: constantSystem, |
1614 nativeData: nativeData, | 1626 nativeData: nativeData, |
1615 interceptorData: interceptorData, | 1627 interceptorData: interceptorData, |
1616 backendUsage: backendUsage, | 1628 backendUsage: backendUsage, |
1617 resolutionWorldBuilder: resolutionWorldBuilder, | 1629 resolutionWorldBuilder: resolutionWorldBuilder, |
1618 implementedClasses: implementedClasses, | 1630 implementedClasses: implementedClasses, |
1619 functionSet: functionSet, | 1631 functionSet: functionSet, |
1620 allTypedefs: allTypedefs, | 1632 allTypedefs: allTypedefs, |
1621 mixinUses: mixinUses, | 1633 mixinUses: mixinUses, |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1907 throw new UnsupportedError( | 1919 throw new UnsupportedError( |
1908 "JsKernelToElementMap.getConstantFieldInitializer"); | 1920 "JsKernelToElementMap.getConstantFieldInitializer"); |
1909 } | 1921 } |
1910 | 1922 |
1911 @override | 1923 @override |
1912 bool hasConstantFieldInitializer(FieldEntity field) { | 1924 bool hasConstantFieldInitializer(FieldEntity field) { |
1913 throw new UnsupportedError( | 1925 throw new UnsupportedError( |
1914 "JsKernelToElementMap.hasConstantFieldInitializer"); | 1926 "JsKernelToElementMap.hasConstantFieldInitializer"); |
1915 } | 1927 } |
1916 } | 1928 } |
OLD | NEW |