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 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 } | 517 } |
518 | 518 |
519 void _ensureSupertypes(KClass cls, _KClassEnv env) { | 519 void _ensureSupertypes(KClass cls, _KClassEnv env) { |
520 if (env.orderedTypeSet == null) { | 520 if (env.orderedTypeSet == null) { |
521 _ensureThisAndRawType(cls, env); | 521 _ensureThisAndRawType(cls, env); |
522 | 522 |
523 ir.Class node = env.cls; | 523 ir.Class node = env.cls; |
524 | 524 |
525 if (node.supertype == null) { | 525 if (node.supertype == null) { |
526 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); | 526 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType); |
527 env.isMixinApplication = false; | |
528 } else { | 527 } else { |
529 InterfaceType processSupertype(ir.Supertype node) { | 528 InterfaceType processSupertype(ir.Supertype node) { |
530 InterfaceType type = _typeConverter.visitSupertype(node); | 529 InterfaceType type = _typeConverter.visitSupertype(node); |
531 KClass superclass = type.element; | 530 KClass superclass = type.element; |
532 _KClassEnv env = _classEnvs[superclass.classIndex]; | 531 _KClassEnv env = _classEnvs[superclass.classIndex]; |
533 _ensureSupertypes(superclass, env); | 532 _ensureSupertypes(superclass, env); |
534 return type; | 533 return type; |
535 } | 534 } |
536 | 535 |
537 env.supertype = processSupertype(node.supertype); | 536 env.supertype = processSupertype(node.supertype); |
538 LinkBuilder<InterfaceType> linkBuilder = | 537 LinkBuilder<InterfaceType> linkBuilder = |
539 new LinkBuilder<InterfaceType>(); | 538 new LinkBuilder<InterfaceType>(); |
540 if (node.mixedInType != null) { | 539 if (node.mixedInType != null) { |
541 env.isMixinApplication = true; | |
542 linkBuilder | 540 linkBuilder |
543 .addLast(env.mixedInType = processSupertype(node.mixedInType)); | 541 .addLast(env.mixedInType = processSupertype(node.mixedInType)); |
544 } else { | |
545 env.isMixinApplication = false; | |
546 } | 542 } |
547 node.implementedTypes.forEach((ir.Supertype supertype) { | 543 node.implementedTypes.forEach((ir.Supertype supertype) { |
548 linkBuilder.addLast(processSupertype(supertype)); | 544 linkBuilder.addLast(processSupertype(supertype)); |
549 }); | 545 }); |
550 Link<InterfaceType> interfaces = linkBuilder.toLink(); | 546 Link<InterfaceType> interfaces = linkBuilder.toLink(); |
551 OrderedTypeSetBuilder setBuilder = | 547 OrderedTypeSetBuilder setBuilder = |
552 new _KernelOrderedTypeSetBuilder(this, cls); | 548 new _KernelOrderedTypeSetBuilder(this, cls); |
553 env.orderedTypeSet = | 549 env.orderedTypeSet = |
554 setBuilder.createOrderedTypeSet(env.supertype, interfaces); | 550 setBuilder.createOrderedTypeSet(env.supertype, interfaces); |
555 } | 551 } |
(...skipping 22 matching lines...) Expand all Loading... |
578 return type.subst( | 574 return type.subst( |
579 context.typeArguments, getThisType(context.element).typeArguments); | 575 context.typeArguments, getThisType(context.element).typeArguments); |
580 } | 576 } |
581 | 577 |
582 InterfaceType _getSuperType(KClass cls) { | 578 InterfaceType _getSuperType(KClass cls) { |
583 _KClassEnv env = _classEnvs[cls.classIndex]; | 579 _KClassEnv env = _classEnvs[cls.classIndex]; |
584 _ensureSupertypes(cls, env); | 580 _ensureSupertypes(cls, env); |
585 return env.supertype; | 581 return env.supertype; |
586 } | 582 } |
587 | 583 |
588 bool _isMixinApplication(KClass cls) { | |
589 _KClassEnv env = _classEnvs[cls.classIndex]; | |
590 _ensureSupertypes(cls, env); | |
591 return env.isMixinApplication; | |
592 } | |
593 | |
594 bool _isUnnamedMixinApplication(KClass cls) { | 584 bool _isUnnamedMixinApplication(KClass cls) { |
595 _KClassEnv env = _classEnvs[cls.classIndex]; | 585 _KClassEnv env = _classEnvs[cls.classIndex]; |
596 _ensureSupertypes(cls, env); | 586 _ensureSupertypes(cls, env); |
597 return env.isUnnamedMixinApplication; | 587 return env.isUnnamedMixinApplication; |
598 } | 588 } |
599 | 589 |
600 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { | 590 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { |
601 _KClassEnv env = _classEnvs[cls.classIndex]; | 591 _KClassEnv env = _classEnvs[cls.classIndex]; |
602 _ensureSupertypes(cls, env); | 592 _ensureSupertypes(cls, env); |
603 env.orderedTypeSet.supertypes.forEach(f); | 593 env.orderedTypeSet.supertypes.forEach(f); |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 } else { | 864 } else { |
875 // Skip fields; these are also in _memberMap. | 865 // Skip fields; these are also in _memberMap. |
876 } | 866 } |
877 } | 867 } |
878 } | 868 } |
879 } | 869 } |
880 | 870 |
881 /// Environment for fast lookup of class members. | 871 /// Environment for fast lookup of class members. |
882 class _KClassEnv { | 872 class _KClassEnv { |
883 final ir.Class cls; | 873 final ir.Class cls; |
884 bool isMixinApplication; | |
885 final bool isUnnamedMixinApplication; | 874 final bool isUnnamedMixinApplication; |
886 | 875 |
887 InterfaceType thisType; | 876 InterfaceType thisType; |
888 InterfaceType rawType; | 877 InterfaceType rawType; |
889 InterfaceType supertype; | 878 InterfaceType supertype; |
890 InterfaceType mixedInType; | 879 InterfaceType mixedInType; |
891 OrderedTypeSet orderedTypeSet; | 880 OrderedTypeSet orderedTypeSet; |
892 | 881 |
893 Map<String, ir.Member> _constructorMap; | 882 Map<String, ir.Member> _constructorMap; |
894 Map<String, ir.Member> _memberMap; | 883 Map<String, ir.Member> _memberMap; |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1145 InterfaceType getRawType(ClassEntity cls) { | 1134 InterfaceType getRawType(ClassEntity cls) { |
1146 return elementMap._getRawType(cls); | 1135 return elementMap._getRawType(cls); |
1147 } | 1136 } |
1148 | 1137 |
1149 @override | 1138 @override |
1150 bool isGenericClass(ClassEntity cls) { | 1139 bool isGenericClass(ClassEntity cls) { |
1151 return getThisType(cls).typeArguments.isNotEmpty; | 1140 return getThisType(cls).typeArguments.isNotEmpty; |
1152 } | 1141 } |
1153 | 1142 |
1154 @override | 1143 @override |
1155 bool isMixinApplication(KClass cls) { | |
1156 return elementMap._isMixinApplication(cls); | |
1157 } | |
1158 | |
1159 @override | |
1160 bool isUnnamedMixinApplication(KClass cls) { | 1144 bool isUnnamedMixinApplication(KClass cls) { |
1161 return elementMap._isUnnamedMixinApplication(cls); | 1145 return elementMap._isUnnamedMixinApplication(cls); |
1162 } | 1146 } |
1163 | 1147 |
1164 @override | 1148 @override |
1165 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { | 1149 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { |
1166 throw new UnimplementedError( | 1150 throw new UnimplementedError( |
1167 'KernelElementEnvironment.getTypeVariableBound'); | 1151 'KernelElementEnvironment.getTypeVariableBound'); |
1168 } | 1152 } |
1169 | 1153 |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1690 return node.isExternal && | 1674 return node.isExternal && |
1691 !elementMap.isForeignLibrary(node.enclosingLibrary); | 1675 !elementMap.isForeignLibrary(node.enclosingLibrary); |
1692 } | 1676 } |
1693 | 1677 |
1694 @override | 1678 @override |
1695 bool isJsInteropMember(MemberEntity element) { | 1679 bool isJsInteropMember(MemberEntity element) { |
1696 // TODO(johnniwinther): Compute this. | 1680 // TODO(johnniwinther): Compute this. |
1697 return false; | 1681 return false; |
1698 } | 1682 } |
1699 } | 1683 } |
OLD | NEW |