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

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

Issue 2827283002: Implement subtype relation for kernel based elements. (Closed)
Patch Set: Add remaining checks of BackendUsage Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.kernel.world_builder; 5 library dart2js.kernel.world_builder;
6 6
7 import 'package:kernel/ast.dart' as ir; 7 import 'package:kernel/ast.dart' as ir;
8 8
9 import '../common.dart'; 9 import '../common.dart';
10 import '../common/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';
16 import '../constants/values.dart'; 16 import '../constants/values.dart';
17 import '../common_elements.dart'; 17 import '../common_elements.dart';
18 import '../elements/elements.dart'; 18 import '../elements/elements.dart';
19 import '../elements/entities.dart'; 19 import '../elements/entities.dart';
20 import '../elements/types.dart'; 20 import '../elements/types.dart';
21 import '../js_backend/constant_system_javascript.dart'; 21 import '../js_backend/constant_system_javascript.dart';
22 import '../js_backend/native_data.dart'; 22 import '../js_backend/native_data.dart';
23 import '../js_backend/no_such_method_registry.dart'; 23 import '../js_backend/no_such_method_registry.dart';
24 import '../native/native.dart' as native; 24 import '../native/native.dart' as native;
25 import '../native/resolver.dart'; 25 import '../native/resolver.dart';
26 import '../ordered_typeset.dart';
26 import '../ssa/kernel_impact.dart'; 27 import '../ssa/kernel_impact.dart';
27 import '../universe/call_structure.dart'; 28 import '../universe/call_structure.dart';
29 import '../util/util.dart' show Link, LinkBuilder;
28 import 'element_adapter.dart'; 30 import 'element_adapter.dart';
29 import 'elements.dart'; 31 import 'elements.dart';
30 32
31 part 'native_basic_data.dart'; 33 part 'native_basic_data.dart';
32 part 'native_class_resolver.dart'; 34 part 'native_class_resolver.dart';
33 part 'no_such_method_resolver.dart'; 35 part 'no_such_method_resolver.dart';
36 part 'types.dart';
34 37
35 /// World builder used for creating elements and types corresponding to Kernel 38 /// World builder used for creating elements and types corresponding to Kernel
36 /// IR nodes. 39 /// IR nodes.
37 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. 40 // TODO(johnniwinther): Implement [ResolutionWorldBuilder].
38 class KernelWorldBuilder extends KernelElementAdapterMixin { 41 class KernelWorldBuilder extends KernelElementAdapterMixin {
39 CommonElements _commonElements; 42 CommonElements _commonElements;
40 native.BehaviorBuilder _nativeBehaviorBuilder; 43 native.BehaviorBuilder _nativeBehaviorBuilder;
41 final DiagnosticReporter reporter; 44 final DiagnosticReporter reporter;
42 ElementEnvironment _elementEnvironment; 45 ElementEnvironment _elementEnvironment;
43 DartTypeConverter _typeConverter; 46 DartTypeConverter _typeConverter;
44 KernelConstantEnvironment _constantEnvironment; 47 KernelConstantEnvironment _constantEnvironment;
48 _KernelDartTypes _types;
45 49
46 /// Library environment. Used for fast lookup. 50 /// Library environment. Used for fast lookup.
47 KEnv _env; 51 KEnv _env;
48 52
49 /// List of library environments by `KLibrary.libraryIndex`. This is used for 53 /// List of library environments by `KLibrary.libraryIndex`. This is used for
50 /// fast lookup into library classes and members. 54 /// fast lookup into library classes and members.
51 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[]; 55 List<KLibraryEnv> _libraryEnvs = <KLibraryEnv>[];
52 56
53 /// List of class environments by `KClass.classIndex`. This is used for 57 /// List of class environments by `KClass.classIndex`. This is used for
54 /// fast lookup into class members. 58 /// fast lookup into class members.
(...skipping 21 matching lines...) Expand all
76 Map<ir.TreeNode, KLocalFunction> _localFunctionMap = 80 Map<ir.TreeNode, KLocalFunction> _localFunctionMap =
77 <ir.TreeNode, KLocalFunction>{}; 81 <ir.TreeNode, KLocalFunction>{};
78 82
79 KernelWorldBuilder(this.reporter, ir.Program program) 83 KernelWorldBuilder(this.reporter, ir.Program program)
80 : _env = new KEnv(program) { 84 : _env = new KEnv(program) {
81 _elementEnvironment = new KernelElementEnvironment(this); 85 _elementEnvironment = new KernelElementEnvironment(this);
82 _commonElements = new CommonElements(_elementEnvironment); 86 _commonElements = new CommonElements(_elementEnvironment);
83 _constantEnvironment = new KernelConstantEnvironment(this); 87 _constantEnvironment = new KernelConstantEnvironment(this);
84 _nativeBehaviorBuilder = 88 _nativeBehaviorBuilder =
85 new KernelBehaviorBuilder(_commonElements, _constantEnvironment); 89 new KernelBehaviorBuilder(_commonElements, _constantEnvironment);
90 _types = new _KernelDartTypes(this);
86 _typeConverter = new DartTypeConverter(this); 91 _typeConverter = new DartTypeConverter(this);
87 } 92 }
88 93
89 KMethod get _mainFunction { 94 KMethod get _mainFunction {
90 return _env.program.mainMethod != null 95 return _env.program.mainMethod != null
91 ? _getMethod(_env.program.mainMethod) 96 ? _getMethod(_env.program.mainMethod)
92 : null; 97 : null;
93 } 98 }
94 99
95 KLibrary get _mainLibrary { 100 KLibrary get _mainLibrary {
(...skipping 13 matching lines...) Expand all
109 } 114 }
110 115
111 @override 116 @override
112 CommonElements get commonElements => _commonElements; 117 CommonElements get commonElements => _commonElements;
113 118
114 @override 119 @override
115 ElementEnvironment get elementEnvironment => _elementEnvironment; 120 ElementEnvironment get elementEnvironment => _elementEnvironment;
116 121
117 ConstantEnvironment get constantEnvironment => _constantEnvironment; 122 ConstantEnvironment get constantEnvironment => _constantEnvironment;
118 123
124 DartTypes get types => _types;
125
119 @override 126 @override
120 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder; 127 native.BehaviorBuilder get nativeBehaviorBuilder => _nativeBehaviorBuilder;
121 128
122 LibraryEntity lookupLibrary(Uri uri) { 129 LibraryEntity lookupLibrary(Uri uri) {
123 KLibraryEnv libraryEnv = _env.lookupLibrary(uri); 130 KLibraryEnv libraryEnv = _env.lookupLibrary(uri);
124 return _getLibrary(libraryEnv.library, libraryEnv); 131 return _getLibrary(libraryEnv.library, libraryEnv);
125 } 132 }
126 133
127 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) { 134 KLibrary _getLibrary(ir.Library node, [KLibraryEnv libraryEnv]) {
128 return _libraryMap.putIfAbsent(node, () { 135 return _libraryMap.putIfAbsent(node, () {
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
408 return env.thisType; 415 return env.thisType;
409 } 416 }
410 417
411 InterfaceType _getRawType(KClass cls) { 418 InterfaceType _getRawType(KClass cls) {
412 KClassEnv env = _classEnvs[cls.classIndex]; 419 KClassEnv env = _classEnvs[cls.classIndex];
413 _ensureThisAndRawType(cls, env); 420 _ensureThisAndRawType(cls, env);
414 return env.rawType; 421 return env.rawType;
415 } 422 }
416 423
417 void _ensureSupertypes(KClass cls, KClassEnv env) { 424 void _ensureSupertypes(KClass cls, KClassEnv env) {
418 if (env.supertypes == null) { 425 if (env.orderedTypeSet == null) {
419 _ensureThisAndRawType(cls, env); 426 _ensureThisAndRawType(cls, env);
420 427
421 ir.Class node = env.cls; 428 ir.Class node = env.cls;
422 429
423 Set<InterfaceType> supertypes = new Set<InterfaceType>(); 430 if (node.supertype == null) {
431 env.orderedTypeSet = new OrderedTypeSet.singleton(env.thisType);
432 } else {
433 InterfaceType processSupertype(ir.Supertype node) {
434 InterfaceType type = _typeConverter.visitSupertype(node);
435 KClass superclass = type.element;
436 KClassEnv env = _classEnvs[superclass.classIndex];
437 _ensureSupertypes(superclass, env);
438 return type;
439 }
424 440
425 InterfaceType addSupertype(ir.Supertype node) { 441 env.supertype = processSupertype(node.supertype);
426 if (node == null) return null; 442 LinkBuilder<InterfaceType> linkBuilder =
427 InterfaceType type = _typeConverter.visitSupertype(node); 443 new LinkBuilder<InterfaceType>();
428 KClass superclass = type.element; 444 if (node.mixedInType != null) {
429 KClassEnv env = _classEnvs[superclass.classIndex]; 445 linkBuilder.addLast(processSupertype(node.mixedInType));
430 _ensureSupertypes(superclass, env);
431 for (InterfaceType supertype in env.supertypes) {
432 supertypes.add(
433 supertype.subst(type.typeArguments, env.thisType.typeArguments));
434 } 446 }
435 return type; 447 node.implementedTypes.forEach((ir.Supertype supertype) {
448 linkBuilder.addLast(processSupertype(supertype));
449 });
450 Link<InterfaceType> interfaces = linkBuilder.toLink();
451 OrderedTypeSetBuilder setBuilder =
452 new _KernelOrderedTypeSetBuilder(this, cls);
453 env.orderedTypeSet =
454 setBuilder.createOrderedTypeSet(env.supertype, interfaces);
436 } 455 }
437
438 env.supertype = addSupertype(node.supertype);
439 addSupertype(node.mixedInType);
440 node.implementedTypes.forEach(addSupertype);
441
442 env.supertypes = supertypes.toList();
443 } 456 }
444 } 457 }
445 458
459 OrderedTypeSet _getOrderedTypeSet(KClass cls) {
460 KClassEnv env = _classEnvs[cls.classIndex];
461 _ensureSupertypes(cls, env);
462 return env.orderedTypeSet;
463 }
464
465 int _getHierarchyDepth(KClass cls) {
466 KClassEnv env = _classEnvs[cls.classIndex];
467 _ensureSupertypes(cls, env);
468 return env.orderedTypeSet.maxDepth;
469 }
470
471 InterfaceType _substByContext(InterfaceType type, InterfaceType context) {
472 return type.subst(
473 context.typeArguments, _getThisType(context.element).typeArguments);
474 }
475
446 InterfaceType _getSuperType(KClass cls) { 476 InterfaceType _getSuperType(KClass cls) {
447 KClassEnv env = _classEnvs[cls.classIndex]; 477 KClassEnv env = _classEnvs[cls.classIndex];
448 _ensureSupertypes(cls, env); 478 _ensureSupertypes(cls, env);
449 return env.supertype; 479 return env.supertype;
450 } 480 }
451 481
452 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) { 482 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) {
453 KClassEnv env = _classEnvs[cls.classIndex]; 483 KClassEnv env = _classEnvs[cls.classIndex];
454 _ensureSupertypes(cls, env); 484 _ensureSupertypes(cls, env);
455 env.supertypes.forEach(f); 485 env.orderedTypeSet.supertypes.forEach(f);
486 }
487
488 void _forEachClassMember(
489 KClass cls, void f(ClassEntity cls, MemberEntity member)) {
490 KClassEnv env = _classEnvs[cls.classIndex];
491 env.forEachMember((ir.Member member) {
492 f(cls, getMember(member));
493 });
494 _ensureSupertypes(cls, env);
495 if (env.supertype != null) {
496 _forEachClassMember(env.supertype.element, f);
497 }
456 } 498 }
457 499
458 @override 500 @override
459 FunctionType getFunctionType(ir.FunctionNode node) { 501 FunctionType getFunctionType(ir.FunctionNode node) {
460 DartType returnType = getDartType(node.returnType); 502 DartType returnType = getDartType(node.returnType);
461 List<DartType> parameterTypes = /*<DartType>*/ []; 503 List<DartType> parameterTypes = /*<DartType>*/ [];
462 List<DartType> optionalParameterTypes = /*<DartType>*/ []; 504 List<DartType> optionalParameterTypes = /*<DartType>*/ [];
463 for (ir.VariableDeclaration variable in node.positionalParameters) { 505 for (ir.VariableDeclaration variable in node.positionalParameters) {
464 if (parameterTypes.length == node.requiredParameterCount) { 506 if (parameterTypes.length == node.requiredParameterCount) {
465 optionalParameterTypes.add(getDartType(variable.type)); 507 optionalParameterTypes.add(getDartType(variable.type));
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 } 675 }
634 676
635 /// Environment for fast lookup of class members. 677 /// Environment for fast lookup of class members.
636 // TODO(johnniwinther): Add member lookup. 678 // TODO(johnniwinther): Add member lookup.
637 class KClassEnv { 679 class KClassEnv {
638 final ir.Class cls; 680 final ir.Class cls;
639 681
640 InterfaceType thisType; 682 InterfaceType thisType;
641 InterfaceType rawType; 683 InterfaceType rawType;
642 InterfaceType supertype; 684 InterfaceType supertype;
643 List<InterfaceType> supertypes; 685 OrderedTypeSet orderedTypeSet;
644 686
645 Map<String, ir.Member> _constructorMap; 687 Map<String, ir.Member> _constructorMap;
646 Map<String, ir.Member> _memberMap; 688 Map<String, ir.Member> _memberMap;
647 689
648 Iterable<ConstantExpression> _metadata; 690 Iterable<ConstantExpression> _metadata;
649 691
650 KClassEnv(this.cls); 692 KClassEnv(this.cls);
651 693
652 void _ensureMaps() { 694 void _ensureMaps() {
653 if (_memberMap == null) { 695 if (_memberMap == null) {
(...skipping 18 matching lines...) Expand all
672 _ensureMaps(); 714 _ensureMaps();
673 return _memberMap[name]; 715 return _memberMap[name];
674 } 716 }
675 717
676 /// Return the [ir.Member] for the member [name] in [library]. 718 /// Return the [ir.Member] for the member [name] in [library].
677 ir.Member lookupConstructor(String name, {bool setter: false}) { 719 ir.Member lookupConstructor(String name, {bool setter: false}) {
678 _ensureMaps(); 720 _ensureMaps();
679 return _constructorMap[name]; 721 return _constructorMap[name];
680 } 722 }
681 723
724 void forEachMember(f(ir.Member member)) {
725 _ensureMaps();
726 _memberMap.values.forEach(f);
727 }
728
682 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) { 729 Iterable<ConstantExpression> getMetadata(KernelWorldBuilder worldBuilder) {
683 if (_metadata == null) { 730 if (_metadata == null) {
684 _metadata = worldBuilder.getMetadata(cls.annotations); 731 _metadata = worldBuilder.getMetadata(cls.annotations);
685 } 732 }
686 return _metadata; 733 return _metadata;
687 } 734 }
688 } 735 }
689 736
690 class KernelElementEnvironment implements ElementEnvironment { 737 class KernelElementEnvironment implements ElementEnvironment {
691 final KernelWorldBuilder worldBuilder; 738 final KernelWorldBuilder worldBuilder;
(...skipping 29 matching lines...) Expand all
721 } 768 }
722 769
723 @override 770 @override
724 InterfaceType createInterfaceType( 771 InterfaceType createInterfaceType(
725 ClassEntity cls, List<DartType> typeArguments) { 772 ClassEntity cls, List<DartType> typeArguments) {
726 return new InterfaceType(cls, typeArguments); 773 return new InterfaceType(cls, typeArguments);
727 } 774 }
728 775
729 @override 776 @override
730 bool isSubtype(DartType a, DartType b) { 777 bool isSubtype(DartType a, DartType b) {
731 // TODO(johnniwinther): Implement this. 778 return worldBuilder.types.isSubtype(a, b);
732 return false;
733 } 779 }
734 780
735 @override 781 @override
736 FunctionType getFunctionType(KFunction function) { 782 FunctionType getFunctionType(KFunction function) {
737 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); 783 throw new UnimplementedError('KernelElementEnvironment.getFunctionType');
738 } 784 }
739 785
740 @override 786 @override
741 FunctionType getLocalFunctionType(KLocalFunction function) { 787 FunctionType getLocalFunctionType(KLocalFunction function) {
742 return function.functionType; 788 return function.functionType;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 } 827 }
782 828
783 @override 829 @override
784 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { 830 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) {
785 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); 831 throw new UnimplementedError('KernelElementEnvironment.forEachMixin');
786 } 832 }
787 833
788 @override 834 @override
789 void forEachClassMember( 835 void forEachClassMember(
790 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { 836 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
791 // TODO(johnniwinther): Implement this. 837 worldBuilder._forEachClassMember(cls, f);
792 } 838 }
793 839
794 @override 840 @override
795 MemberEntity lookupLibraryMember(LibraryEntity library, String name, 841 MemberEntity lookupLibraryMember(LibraryEntity library, String name,
796 {bool setter: false, bool required: false}) { 842 {bool setter: false, bool required: false}) {
797 MemberEntity member = 843 MemberEntity member =
798 worldBuilder.lookupLibraryMember(library, name, setter: setter); 844 worldBuilder.lookupLibraryMember(library, name, setter: setter);
799 if (member == null && required) { 845 if (member == null && required) {
800 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 846 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
801 "The member '${name}' was not found in library '${library.name}'."); 847 "The member '${name}' was not found in library '${library.name}'.");
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 } 1117 }
1072 1118
1073 InterfaceType getMixinTypeForClass(KClass cls) { 1119 InterfaceType getMixinTypeForClass(KClass cls) {
1074 KClassEnv env = builder._classEnvs[cls.classIndex]; 1120 KClassEnv env = builder._classEnvs[cls.classIndex];
1075 ir.Supertype mixedInType = env.cls.mixedInType; 1121 ir.Supertype mixedInType = env.cls.mixedInType;
1076 if (mixedInType == null) return null; 1122 if (mixedInType == null) return null;
1077 return builder.createInterfaceType( 1123 return builder.createInterfaceType(
1078 mixedInType.classNode, mixedInType.typeArguments); 1124 mixedInType.classNode, mixedInType.typeArguments);
1079 } 1125 }
1080 } 1126 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698