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

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

Issue 2810633003: Add kernel/closed_world2_test (Closed)
Patch Set: Add TODOs. 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/backend_api.dart'; 10 import '../common/backend_api.dart';
11 import '../common/resolution.dart';
11 import '../compile_time_constants.dart'; 12 import '../compile_time_constants.dart';
12 import '../constants/constant_system.dart'; 13 import '../constants/constant_system.dart';
13 import '../constants/constructors.dart'; 14 import '../constants/constructors.dart';
14 import '../constants/evaluation.dart'; 15 import '../constants/evaluation.dart';
15 import '../constants/expressions.dart'; 16 import '../constants/expressions.dart';
16 import '../constants/values.dart'; 17 import '../constants/values.dart';
17 import '../common_elements.dart'; 18 import '../common_elements.dart';
18 import '../elements/elements.dart'; 19 import '../elements/elements.dart';
19 import '../elements/entities.dart'; 20 import '../elements/entities.dart';
20 import '../elements/types.dart'; 21 import '../elements/types.dart';
21 import '../js_backend/backend_helpers.dart'; 22 import '../js_backend/backend_helpers.dart';
22 import '../js_backend/constant_system_javascript.dart'; 23 import '../js_backend/constant_system_javascript.dart';
23 import '../js_backend/no_such_method_registry.dart'; 24 import '../js_backend/no_such_method_registry.dart';
24 import '../native/native.dart' as native; 25 import '../native/native.dart' as native;
25 import '../native/resolver.dart'; 26 import '../native/resolver.dart';
27 import '../ssa/kernel_impact.dart';
26 import '../universe/call_structure.dart'; 28 import '../universe/call_structure.dart';
27 import 'element_adapter.dart'; 29 import 'element_adapter.dart';
28 import 'elements.dart'; 30 import 'elements.dart';
29 31
30 part 'native_class_resolver.dart'; 32 part 'native_class_resolver.dart';
31 part 'no_such_method_resolver.dart'; 33 part 'no_such_method_resolver.dart';
32 34
33 /// World builder used for creating elements and types corresponding to Kernel 35 /// World builder used for creating elements and types corresponding to Kernel
34 /// IR nodes. 36 /// IR nodes.
35 // TODO(johnniwinther): Implement [ResolutionWorldBuilder]. 37 // TODO(johnniwinther): Implement [ResolutionWorldBuilder].
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 if (parent is ir.FunctionDeclaration || 311 if (parent is ir.FunctionDeclaration ||
310 parent is ir.FunctionExpression) { 312 parent is ir.FunctionExpression) {
311 KLocalFunction localFunction = _getLocal(parent); 313 KLocalFunction localFunction = _getLocal(parent);
312 executableContext = localFunction; 314 executableContext = localFunction;
313 memberContext = localFunction.memberContext; 315 memberContext = localFunction.memberContext;
314 break; 316 break;
315 } 317 }
316 parent = parent.parent; 318 parent = parent.parent;
317 } 319 }
318 String name; 320 String name;
321 FunctionType functionType;
319 if (node is ir.FunctionDeclaration) { 322 if (node is ir.FunctionDeclaration) {
320 name = node.variable.name; 323 name = node.variable.name;
324 functionType = getFunctionType(node.function);
325 } else if (node is ir.FunctionExpression) {
326 functionType = getFunctionType(node.function);
321 } 327 }
322 return new KLocalFunction(name, memberContext, executableContext); 328 return new KLocalFunction(
329 name, memberContext, executableContext, functionType);
323 }); 330 });
324 } 331 }
325 332
326 @override 333 @override
327 DartType getDartType(ir.DartType type) => _typeConverter.convert(type); 334 DartType getDartType(ir.DartType type) => _typeConverter.convert(type);
328 335
329 @override 336 @override
330 InterfaceType createInterfaceType( 337 InterfaceType createInterfaceType(
331 ir.Class cls, List<ir.DartType> typeArguments) { 338 ir.Class cls, List<ir.DartType> typeArguments) {
332 return new InterfaceType(getClass(cls), getDartTypes(typeArguments)); 339 return new InterfaceType(getClass(cls), getDartTypes(typeArguments));
333 } 340 }
334 341
335 @override 342 @override
336 InterfaceType getInterfaceType(ir.InterfaceType type) => 343 InterfaceType getInterfaceType(ir.InterfaceType type) =>
337 _typeConverter.convert(type); 344 _typeConverter.convert(type);
338 345
339 @override 346 @override
340 List<DartType> getDartTypes(List<ir.DartType> types) { 347 List<DartType> getDartTypes(List<ir.DartType> types) {
341 // TODO(johnniwinther): Add the type argument to the list literal when we 348 // TODO(johnniwinther): Add the type argument to the list literal when we
342 // no longer use resolution types. 349 // no longer use resolution types.
343 List<DartType> list = /*<DartType>*/ []; 350 List<DartType> list = /*<DartType>*/ [];
344 types.forEach((ir.DartType type) { 351 types.forEach((ir.DartType type) {
345 list.add(getDartType(type)); 352 list.add(getDartType(type));
346 }); 353 });
347 return list; 354 return list;
348 } 355 }
349 356
357 void _ensureThisAndRawType(KClass cls, KClassEnv env) {
358 if (env.thisType == null) {
359 ir.Class node = env.cls;
360 // TODO(johnniwinther): Add the type argument to the list literal when we
361 // no longer use resolution types.
362 if (node.typeParameters.isEmpty) {
363 env.thisType =
364 env.rawType = new InterfaceType(cls, const/*<DartType>*/ []);
365 } else {
366 env.thisType = new InterfaceType(
367 cls,
368 new List/*<DartType>*/ .generate(node.typeParameters.length,
369 (int index) {
370 return new TypeVariableType(
371 _getTypeVariable(node.typeParameters[index]));
372 }));
373 env.rawType = new InterfaceType(
374 cls,
375 new List/*<DartType>*/ .filled(
376 node.typeParameters.length, const DynamicType()));
377 }
378 }
379 }
380
350 InterfaceType _getThisType(KClass cls) { 381 InterfaceType _getThisType(KClass cls) {
351 KClassEnv env = _classEnvs[cls.classIndex]; 382 KClassEnv env = _classEnvs[cls.classIndex];
352 ir.Class node = env.cls; 383 _ensureThisAndRawType(cls, env);
353 // TODO(johnniwinther): Add the type argument to the list literal when we 384 return env.thisType;
354 // no longer use resolution types.
355 return new InterfaceType(
356 cls,
357 new List/*<DartType>*/ .generate(node.typeParameters.length,
358 (int index) {
359 return new TypeVariableType(
360 _getTypeVariable(node.typeParameters[index]));
361 }));
362 } 385 }
363 386
364 InterfaceType _getRawType(KClass cls) { 387 InterfaceType _getRawType(KClass cls) {
365 KClassEnv env = _classEnvs[cls.classIndex]; 388 KClassEnv env = _classEnvs[cls.classIndex];
366 ir.Class node = env.cls; 389 _ensureThisAndRawType(cls, env);
367 // TODO(johnniwinther): Add the type argument to the list literal when we 390 return env.rawType;
368 // no longer use resolution types. 391 }
369 return new InterfaceType( 392
370 cls, 393 void _ensureSupertypes(KClass cls, KClassEnv env) {
371 new List/*<DartType>*/ .filled( 394 if (env.supertypes == null) {
372 node.typeParameters.length, const DynamicType())); 395 _ensureThisAndRawType(cls, env);
396
397 ir.Class node = env.cls;
398
399 Set<InterfaceType> supertypes = new Set<InterfaceType>();
400
401 InterfaceType addSupertype(ir.Supertype node) {
402 if (node == null) return null;
403 InterfaceType type = _typeConverter.visitSupertype(node);
404 KClass superclass = type.element;
405 KClassEnv env = _classEnvs[superclass.classIndex];
406 _ensureSupertypes(superclass, env);
407 for (InterfaceType supertype in env.supertypes) {
408 supertypes.add(
409 supertype.subst(type.typeArguments, env.thisType.typeArguments));
410 }
411 return type;
412 }
413
414 env.supertype = addSupertype(node.supertype);
415 addSupertype(node.mixedInType);
416 node.implementedTypes.forEach(addSupertype);
417
418 env.supertypes = supertypes.toList();
419 }
420 }
421
422 InterfaceType _getSuperType(KClass cls) {
423 KClassEnv env = _classEnvs[cls.classIndex];
424 _ensureSupertypes(cls, env);
425 return env.supertype;
426 }
427
428 void _forEachSupertype(KClass cls, void f(InterfaceType supertype)) {
429 KClassEnv env = _classEnvs[cls.classIndex];
430 _ensureSupertypes(cls, env);
431 env.supertypes.forEach(f);
373 } 432 }
374 433
375 @override 434 @override
376 FunctionType getFunctionType(ir.FunctionNode node) { 435 FunctionType getFunctionType(ir.FunctionNode node) {
377 DartType returnType = getDartType(node.returnType); 436 DartType returnType = getDartType(node.returnType);
378 List<DartType> parameterTypes = /*<DartType>*/ []; 437 List<DartType> parameterTypes = /*<DartType>*/ [];
379 List<DartType> optionalParameterTypes = /*<DartType>*/ []; 438 List<DartType> optionalParameterTypes = /*<DartType>*/ [];
380 for (ir.VariableDeclaration variable in node.positionalParameters) { 439 for (ir.VariableDeclaration variable in node.positionalParameters) {
381 if (parameterTypes.length == node.requiredParameterCount) { 440 if (parameterTypes.length == node.requiredParameterCount) {
382 optionalParameterTypes.add(getDartType(variable.type)); 441 optionalParameterTypes.add(getDartType(variable.type));
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 ir.Field node = _memberList[field.memberIndex]; 509 ir.Field node = _memberList[field.memberIndex];
451 if (node.isConst) { 510 if (node.isConst) {
452 return new Constantifier(this).visit(node.initializer); 511 return new Constantifier(this).visit(node.initializer);
453 } 512 }
454 throw new SpannableAssertionFailure( 513 throw new SpannableAssertionFailure(
455 field, 514 field,
456 "Unexpected field $field in " 515 "Unexpected field $field in "
457 "KernelWorldBuilder._getConstructorConstant"); 516 "KernelWorldBuilder._getConstructorConstant");
458 }); 517 });
459 } 518 }
519
520 ResolutionImpact computeWorldImpact(KMember member) {
521 ir.Member node = _memberList[member.memberIndex];
522 return buildKernelImpact(node, this);
523 }
460 } 524 }
461 525
462 /// Environment for fast lookup of program libraries. 526 /// Environment for fast lookup of program libraries.
463 class KEnv { 527 class KEnv {
464 final ir.Program program; 528 final ir.Program program;
465 529
466 Map<Uri, KLibraryEnv> _libraryMap; 530 Map<Uri, KLibraryEnv> _libraryMap;
467 531
468 KEnv(this.program); 532 KEnv(this.program);
469 533
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 } 575 }
512 return _memberMap[name]; 576 return _memberMap[name];
513 } 577 }
514 } 578 }
515 579
516 /// Environment for fast lookup of class members. 580 /// Environment for fast lookup of class members.
517 // TODO(johnniwinther): Add member lookup. 581 // TODO(johnniwinther): Add member lookup.
518 class KClassEnv { 582 class KClassEnv {
519 final ir.Class cls; 583 final ir.Class cls;
520 584
585 InterfaceType thisType;
586 InterfaceType rawType;
587 InterfaceType supertype;
588 List<InterfaceType> supertypes;
589
521 Map<String, ir.Member> _constructorMap; 590 Map<String, ir.Member> _constructorMap;
522 Map<String, ir.Member> _memberMap; 591 Map<String, ir.Member> _memberMap;
523 592
524 KClassEnv(this.cls); 593 KClassEnv(this.cls);
525 594
526 void _ensureMaps() { 595 void _ensureMaps() {
527 if (_memberMap == null) { 596 if (_memberMap == null) {
528 _memberMap = <String, ir.Member>{}; 597 _memberMap = <String, ir.Member>{};
529 _constructorMap = <String, ir.Member>{}; 598 _constructorMap = <String, ir.Member>{};
530 for (ir.Member member in cls.members) { 599 for (ir.Member member in cls.members) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
562 @override 631 @override
563 DartType get dynamicType => const DynamicType(); 632 DartType get dynamicType => const DynamicType();
564 633
565 @override 634 @override
566 LibraryEntity get mainLibrary => worldBuilder._mainLibrary; 635 LibraryEntity get mainLibrary => worldBuilder._mainLibrary;
567 636
568 @override 637 @override
569 FunctionEntity get mainFunction => worldBuilder._mainFunction; 638 FunctionEntity get mainFunction => worldBuilder._mainFunction;
570 639
571 @override 640 @override
641 Iterable<LibraryEntity> get libraries => worldBuilder._libraryMap.values;
642
643 @override
572 InterfaceType getThisType(ClassEntity cls) { 644 InterfaceType getThisType(ClassEntity cls) {
573 return worldBuilder._getThisType(cls); 645 return worldBuilder._getThisType(cls);
574 } 646 }
575 647
576 @override 648 @override
577 InterfaceType getRawType(ClassEntity cls) { 649 InterfaceType getRawType(ClassEntity cls) {
578 return worldBuilder._getRawType(cls); 650 return worldBuilder._getRawType(cls);
579 } 651 }
580 652
581 @override 653 @override
582 DartType getTypeVariableBound(TypeVariableEntity typeVariable) { 654 DartType getTypeVariableBound(TypeVariableEntity typeVariable) {
583 throw new UnimplementedError( 655 throw new UnimplementedError(
584 'KernelElementEnvironment.getTypeVariableBound'); 656 'KernelElementEnvironment.getTypeVariableBound');
585 } 657 }
586 658
587 @override 659 @override
588 InterfaceType createInterfaceType( 660 InterfaceType createInterfaceType(
589 ClassEntity cls, List<DartType> typeArguments) { 661 ClassEntity cls, List<DartType> typeArguments) {
590 return new InterfaceType(cls, typeArguments); 662 return new InterfaceType(cls, typeArguments);
591 } 663 }
592 664
593 @override 665 @override
594 bool isSubtype(DartType a, DartType b) { 666 bool isSubtype(DartType a, DartType b) {
595 throw new UnimplementedError('KernelElementEnvironment.isSubtype'); 667 // TODO(johnniwinther): Implement this.
668 return false;
596 } 669 }
597 670
598 @override 671 @override
599 FunctionType getFunctionType(KFunction function) { 672 FunctionType getFunctionType(KFunction function) {
600 throw new UnimplementedError('KernelElementEnvironment.getFunctionType'); 673 throw new UnimplementedError('KernelElementEnvironment.getFunctionType');
601 } 674 }
602 675
603 @override 676 @override
604 FunctionType getLocalFunctionType(Local function) { 677 FunctionType getLocalFunctionType(KLocalFunction function) {
605 throw new UnimplementedError( 678 return function.functionType;
606 'KernelElementEnvironment.getLocalFunctionType');
607 } 679 }
608 680
609 @override 681 @override
610 DartType getUnaliasedType(DartType type) => type; 682 DartType getUnaliasedType(DartType type) => type;
611 683
612 @override 684 @override
613 ConstructorEntity lookupConstructor(ClassEntity cls, String name, 685 ConstructorEntity lookupConstructor(ClassEntity cls, String name,
614 {bool required: false}) { 686 {bool required: false}) {
615 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name); 687 ConstructorEntity constructor = worldBuilder.lookupConstructor(cls, name);
616 if (constructor == null && required) { 688 if (constructor == null && required) {
617 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 689 throw new SpannableAssertionFailure(
618 "The constructor $name was not found in class '${cls.name}'."); 690 CURRENT_ELEMENT_SPANNABLE,
691 "The constructor '$name' was not found in class '${cls.name}' "
692 "in library ${cls.library.canonicalUri}.");
619 } 693 }
620 return constructor; 694 return constructor;
621 } 695 }
622 696
623 @override 697 @override
624 MemberEntity lookupClassMember(ClassEntity cls, String name, 698 MemberEntity lookupClassMember(ClassEntity cls, String name,
625 {bool setter: false, bool required: false}) { 699 {bool setter: false, bool required: false}) {
626 MemberEntity member = 700 MemberEntity member =
627 worldBuilder.lookupClassMember(cls, name, setter: setter); 701 worldBuilder.lookupClassMember(cls, name, setter: setter);
628 if (member == null && required) { 702 if (member == null && required) {
629 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 703 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
630 "The member '$name' was not found in ${cls.name}."); 704 "The member '$name' was not found in ${cls.name}.");
631 } 705 }
632 return member; 706 return member;
633 } 707 }
634 708
635 @override 709 @override
636 ClassEntity getSuperClass(ClassEntity cls) { 710 ClassEntity getSuperClass(ClassEntity cls) {
637 throw new UnimplementedError('KernelElementEnvironment.getSuperClass'); 711 return worldBuilder._getSuperType(cls)?.element;
638 } 712 }
639 713
640 @override 714 @override
641 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) { 715 void forEachSupertype(ClassEntity cls, void f(InterfaceType supertype)) {
642 throw new UnimplementedError('KernelElementEnvironment.forEachSupertype'); 716 worldBuilder._forEachSupertype(cls, f);
643 } 717 }
644 718
645 @override 719 @override
646 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) { 720 void forEachMixin(ClassEntity cls, void f(ClassEntity mixin)) {
647 throw new UnimplementedError('KernelElementEnvironment.forEachMixin'); 721 throw new UnimplementedError('KernelElementEnvironment.forEachMixin');
648 } 722 }
649 723
650 @override 724 @override
651 void forEachClassMember( 725 void forEachClassMember(
652 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) { 726 ClassEntity cls, void f(ClassEntity declarer, MemberEntity member)) {
653 throw new UnimplementedError( 727 // TODO(johnniwinther): Implement this.
654 'KernelElementEnvironment.forEachInstanceMember');
655 } 728 }
656 729
657 @override 730 @override
658 MemberEntity lookupLibraryMember(LibraryEntity library, String name, 731 MemberEntity lookupLibraryMember(LibraryEntity library, String name,
659 {bool setter: false, bool required: false}) { 732 {bool setter: false, bool required: false}) {
660 MemberEntity member = 733 MemberEntity member =
661 worldBuilder.lookupLibraryMember(library, name, setter: setter); 734 worldBuilder.lookupLibraryMember(library, name, setter: setter);
662 if (member == null && required) { 735 if (member == null && required) {
663 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 736 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
664 "The member '${name}' was not found in library '${library.name}'."); 737 "The member '${name}' was not found in library '${library.name}'.");
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 topLevel = true; 796 topLevel = true;
724 return type.accept(this); 797 return type.accept(this);
725 } 798 }
726 799
727 /// Visit a inner type. 800 /// Visit a inner type.
728 DartType visitType(ir.DartType type) { 801 DartType visitType(ir.DartType type) {
729 topLevel = false; 802 topLevel = false;
730 return type.accept(this); 803 return type.accept(this);
731 } 804 }
732 805
806 InterfaceType visitSupertype(ir.Supertype node) {
807 ClassEntity cls = elementAdapter.getClass(node.classNode);
808 return new InterfaceType(cls, visitTypes(node.typeArguments));
809 }
810
733 List<DartType> visitTypes(List<ir.DartType> types) { 811 List<DartType> visitTypes(List<ir.DartType> types) {
734 topLevel = false; 812 topLevel = false;
735 return new List.generate( 813 return new List.generate(
736 types.length, (int index) => types[index].accept(this)); 814 types.length, (int index) => types[index].accept(this));
737 } 815 }
738 816
739 @override 817 @override
740 DartType visitTypeParameterType(ir.TypeParameterType node) { 818 DartType visitTypeParameterType(ir.TypeParameterType node) {
741 return new TypeVariableType(elementAdapter.getTypeVariable(node.parameter)); 819 return new TypeVariableType(elementAdapter.getTypeVariable(node.parameter));
742 } 820 }
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 } 1005 }
928 1006
929 InterfaceType getMixinTypeForClass(KClass cls) { 1007 InterfaceType getMixinTypeForClass(KClass cls) {
930 KClassEnv env = builder._classEnvs[cls.classIndex]; 1008 KClassEnv env = builder._classEnvs[cls.classIndex];
931 ir.Supertype mixedInType = env.cls.mixedInType; 1009 ir.Supertype mixedInType = env.cls.mixedInType;
932 if (mixedInType == null) return null; 1010 if (mixedInType == null) return null;
933 return builder.createInterfaceType( 1011 return builder.createInterfaceType(
934 mixedInType.classNode, mixedInType.typeArguments); 1012 mixedInType.classNode, mixedInType.typeArguments);
935 } 1013 }
936 } 1014 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698