Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 import 'package:js_runtime/shared/embedded_names.dart'; | 5 import 'package:js_runtime/shared/embedded_names.dart'; |
| 6 import 'package:kernel/ast.dart' as ir; | 6 import 'package:kernel/ast.dart' as ir; |
| 7 | 7 |
| 8 import '../common.dart'; | 8 import '../common.dart'; |
| 9 import '../common/names.dart'; | 9 import '../common/names.dart'; |
| 10 import '../compiler.dart'; | 10 import '../compiler.dart'; |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 417 TypeMaskFactory.inferredReturnTypeForElement( | 417 TypeMaskFactory.inferredReturnTypeForElement( |
| 418 _backend.helpers.checkConcurrentModificationError, | 418 _backend.helpers.checkConcurrentModificationError, |
| 419 _globalInferenceResults); | 419 _globalInferenceResults); |
| 420 | 420 |
| 421 ir.Procedure get checkSubtype => | 421 ir.Procedure get checkSubtype => |
| 422 kernel.functions[_backend.helpers.checkSubtype]; | 422 kernel.functions[_backend.helpers.checkSubtype]; |
| 423 | 423 |
| 424 ir.Procedure get checkSubtypeOfRuntimeType => | 424 ir.Procedure get checkSubtypeOfRuntimeType => |
| 425 kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType]; | 425 kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType]; |
| 426 | 426 |
| 427 ir.Procedure get assertHelper => | 427 ir.Procedure get throwTypeError => |
| 428 kernel.functions[_backend.helpers.assertHelper]; | 428 kernel.functions[_backend.helpers.throwTypeError]; |
| 429 | 429 |
| 430 TypeMask get throwTypeErrorType => | 430 TypeMask get throwTypeErrorType => |
| 431 TypeMaskFactory.inferredReturnTypeForElement( | 431 TypeMaskFactory.inferredReturnTypeForElement( |
| 432 _backend.helpers.throwTypeError, _globalInferenceResults); | 432 _backend.helpers.throwTypeError, _globalInferenceResults); |
| 433 | 433 |
| 434 ir.Procedure get assertHelper => | |
| 435 kernel.functions[_backend.helpers.assertHelper]; | |
| 436 | |
| 434 TypeMask get assertHelperReturnType => | 437 TypeMask get assertHelperReturnType => |
| 435 TypeMaskFactory.inferredReturnTypeForElement( | 438 TypeMaskFactory.inferredReturnTypeForElement( |
| 436 _backend.helpers.assertHelper, _globalInferenceResults); | 439 _backend.helpers.assertHelper, _globalInferenceResults); |
| 437 | 440 |
| 438 ir.Procedure get assertTest => kernel.functions[_backend.helpers.assertTest]; | 441 ir.Procedure get assertTest => kernel.functions[_backend.helpers.assertTest]; |
| 439 | 442 |
| 440 TypeMask get assertTestReturnType => | 443 TypeMask get assertTestReturnType => |
| 441 TypeMaskFactory.inferredReturnTypeForElement( | 444 TypeMaskFactory.inferredReturnTypeForElement( |
| 442 _backend.helpers.assertTest, _globalInferenceResults); | 445 _backend.helpers.assertTest, _globalInferenceResults); |
| 443 | 446 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 500 ConstantValue indexConstant = constant.fields.values.single; | 503 ConstantValue indexConstant = constant.fields.values.single; |
| 501 if (indexConstant is IntConstantValue) { | 504 if (indexConstant is IntConstantValue) { |
| 502 return indexConstant.primitiveValue; | 505 return indexConstant.primitiveValue; |
| 503 } | 506 } |
| 504 } | 507 } |
| 505 } | 508 } |
| 506 return null; | 509 return null; |
| 507 } | 510 } |
| 508 | 511 |
| 509 ResolutionDartType getDartType(ir.DartType type) { | 512 ResolutionDartType getDartType(ir.DartType type) { |
| 510 return type.accept(_typeConverter); | 513 return _typeConverter.convert(type); |
| 514 } | |
| 515 | |
| 516 ResolutionDartType getDartTypeInvalidNull(ir.DartType type) { | |
|
Siggi Cherem (dart-lang)
2017/01/13 16:36:14
nit: rename, some ideas:
- getDartTypeIfValid (I
sra1
2017/01/13 18:53:11
Done.
| |
| 517 if (type is ir.InvalidType) return null; | |
| 518 return _typeConverter.convert(type); | |
| 511 } | 519 } |
| 512 | 520 |
| 513 List<ResolutionDartType> getDartTypes(List<ir.DartType> types) { | 521 List<ResolutionDartType> getDartTypes(List<ir.DartType> types) { |
| 514 return types.map(getDartType).toList(); | 522 return types.map(getDartType).toList(); |
| 515 } | 523 } |
| 516 | 524 |
| 517 ResolutionDartType getDartTypeOfListLiteral(ir.ListLiteral list) { | 525 ResolutionDartType getDartTypeOfListLiteral(ir.ListLiteral list) { |
| 518 ast.Node node = getNodeOrNull(list); | 526 ast.Node node = getNodeOrNull(list); |
| 519 if (node != null) return elements.getType(node); | 527 if (node != null) return elements.getType(node); |
| 520 assertNodeIsSynthetic(list); | 528 assertNodeIsSynthetic(list); |
| 521 return _compiler.commonElements.listType(getDartType(list.typeArgument)); | 529 return _compiler.commonElements.listType(getDartType(list.typeArgument)); |
| 522 } | 530 } |
| 523 | 531 |
| 524 ResolutionDartType getDartTypeOfMapLiteral(ir.MapLiteral literal) { | 532 ResolutionDartType getDartTypeOfMapLiteral(ir.MapLiteral literal) { |
| 525 ast.Node node = getNodeOrNull(literal); | 533 ast.Node node = getNodeOrNull(literal); |
| 526 if (node != null) return elements.getType(node); | 534 if (node != null) return elements.getType(node); |
| 527 assertNodeIsSynthetic(literal); | 535 assertNodeIsSynthetic(literal); |
| 528 return _compiler.commonElements | 536 return _compiler.commonElements |
| 529 .mapType(getDartType(literal.keyType), getDartType(literal.valueType)); | 537 .mapType(getDartType(literal.keyType), getDartType(literal.valueType)); |
| 530 } | 538 } |
| 531 | 539 |
| 532 ResolutionDartType getFunctionReturnType(ir.FunctionNode node) { | 540 ResolutionDartType getFunctionReturnType(ir.FunctionNode node) { |
| 541 if (node.returnType is ir.InvalidType) return const ResolutionDynamicType(); | |
| 533 return getDartType(node.returnType); | 542 return getDartType(node.returnType); |
| 534 } | 543 } |
| 535 | 544 |
| 536 /// Computes the function type corresponding the signature of [node]. | 545 /// Computes the function type corresponding the signature of [node]. |
| 537 ResolutionFunctionType getFunctionType(ir.FunctionNode node) { | 546 ResolutionFunctionType getFunctionType(ir.FunctionNode node) { |
| 538 ResolutionDartType returnType = getFunctionReturnType(node); | 547 ResolutionDartType returnType = getFunctionReturnType(node); |
| 539 List<ResolutionDartType> parameterTypes = <ResolutionDartType>[]; | 548 List<ResolutionDartType> parameterTypes = <ResolutionDartType>[]; |
| 540 List<ResolutionDartType> optionalParameterTypes = <ResolutionDartType>[]; | 549 List<ResolutionDartType> optionalParameterTypes = <ResolutionDartType>[]; |
| 541 for (ir.VariableDeclaration variable in node.positionalParameters) { | 550 for (ir.VariableDeclaration variable in node.positionalParameters) { |
| 542 if (parameterTypes.length == node.requiredParameterCount) { | 551 if (parameterTypes.length == node.requiredParameterCount) { |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 773 JS, | 782 JS, |
| 774 JS_BUILTIN, | 783 JS_BUILTIN, |
| 775 JS_EMBEDDED_GLOBAL, | 784 JS_EMBEDDED_GLOBAL, |
| 776 JS_INTERCEPTOR_CONSTANT, | 785 JS_INTERCEPTOR_CONSTANT, |
| 777 NONE, | 786 NONE, |
| 778 } | 787 } |
| 779 | 788 |
| 780 /// Visitor that converts kernel dart types into [ResolutionDartType]. | 789 /// Visitor that converts kernel dart types into [ResolutionDartType]. |
| 781 class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> { | 790 class DartTypeConverter extends ir.DartTypeVisitor<ResolutionDartType> { |
| 782 final KernelAstAdapter astAdapter; | 791 final KernelAstAdapter astAdapter; |
| 792 bool topLevel = true; | |
| 783 | 793 |
| 784 DartTypeConverter(this.astAdapter); | 794 DartTypeConverter(this.astAdapter); |
| 785 | 795 |
| 786 ResolutionDartType visitType(ir.DartType type) => type.accept(this); | 796 ResolutionDartType convert(ir.DartType type) { |
| 797 topLevel = true; | |
| 798 return type.accept(this); | |
| 799 } | |
| 800 | |
| 801 /// Visit a inner type. | |
| 802 ResolutionDartType visitType(ir.DartType type) { | |
| 803 topLevel = false; | |
| 804 return type.accept(this); | |
| 805 } | |
| 787 | 806 |
| 788 List<ResolutionDartType> visitTypes(List<ir.DartType> types) { | 807 List<ResolutionDartType> visitTypes(List<ir.DartType> types) { |
| 808 topLevel = false; | |
| 789 return new List.generate( | 809 return new List.generate( |
| 790 types.length, (int index) => types[index].accept(this)); | 810 types.length, (int index) => types[index].accept(this)); |
| 791 } | 811 } |
| 792 | 812 |
| 793 @override | 813 @override |
| 794 ResolutionDartType visitTypeParameterType(ir.TypeParameterType node) { | 814 ResolutionDartType visitTypeParameterType(ir.TypeParameterType node) { |
| 795 if (node.parameter.parent is ir.Class) { | 815 if (node.parameter.parent is ir.Class) { |
| 796 ir.Class cls = node.parameter.parent; | 816 ir.Class cls = node.parameter.parent; |
| 797 int index = cls.typeParameters.indexOf(node.parameter); | 817 int index = cls.typeParameters.indexOf(node.parameter); |
| 798 ClassElement classElement = astAdapter.getElement(cls); | 818 ClassElement classElement = astAdapter.getElement(cls); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 837 return const ResolutionVoidType(); | 857 return const ResolutionVoidType(); |
| 838 } | 858 } |
| 839 | 859 |
| 840 @override | 860 @override |
| 841 ResolutionDartType visitDynamicType(ir.DynamicType node) { | 861 ResolutionDartType visitDynamicType(ir.DynamicType node) { |
| 842 return const ResolutionDynamicType(); | 862 return const ResolutionDynamicType(); |
| 843 } | 863 } |
| 844 | 864 |
| 845 @override | 865 @override |
| 846 ResolutionDartType visitInvalidType(ir.InvalidType node) { | 866 ResolutionDartType visitInvalidType(ir.InvalidType node) { |
| 847 throw new UnimplementedError("Invalid types not currently supported"); | 867 if (topLevel) { |
| 868 throw new UnimplementedError( | |
| 869 "Outermost invalid types not currently supported"); | |
| 870 } | |
| 871 // Nested invalid types are treated as `dynamic`. | |
| 872 return const ResolutionDynamicType(); | |
| 848 } | 873 } |
| 849 } | 874 } |
| 850 | 875 |
| 851 /// Visitor that converts string literals and concatenations of string literals | 876 /// Visitor that converts string literals and concatenations of string literals |
| 852 /// into the string value. | 877 /// into the string value. |
| 853 class Stringifier extends ir.ExpressionVisitor<String> { | 878 class Stringifier extends ir.ExpressionVisitor<String> { |
| 854 @override | 879 @override |
| 855 String visitStringLiteral(ir.StringLiteral node) => node.value; | 880 String visitStringLiteral(ir.StringLiteral node) => node.value; |
| 856 | 881 |
| 857 @override | 882 @override |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 964 | 989 |
| 965 @override | 990 @override |
| 966 String get name => null; | 991 String get name => null; |
| 967 | 992 |
| 968 @override | 993 @override |
| 969 int get nestingLevel => 1; | 994 int get nestingLevel => 1; |
| 970 | 995 |
| 971 @override | 996 @override |
| 972 ast.Node get statement => null; | 997 ast.Node get statement => null; |
| 973 } | 998 } |
| OLD | NEW |