OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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.resolution.members; | 5 library dart2js.resolution.members; |
6 | 6 |
7 import '../common/names.dart' show | 7 import '../common/names.dart' show |
8 Selectors; | 8 Selectors; |
9 import '../compiler.dart' show | 9 import '../compiler.dart' show |
10 Compiler; | 10 Compiler; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 CallStructure, | 42 CallStructure, |
43 Selector, | 43 Selector, |
44 UniverseSelector; | 44 UniverseSelector; |
45 | 45 |
46 import 'access_semantics.dart'; | 46 import 'access_semantics.dart'; |
47 import 'class_members.dart' show MembersCreator; | 47 import 'class_members.dart' show MembersCreator; |
48 import 'operators.dart'; | 48 import 'operators.dart'; |
49 import 'send_structure.dart'; | 49 import 'send_structure.dart'; |
50 | 50 |
51 import 'constructors.dart' show | 51 import 'constructors.dart' show |
52 ConstructorResolver; | 52 ConstructorResolver, |
| 53 ConstructorResult; |
53 import 'label_scope.dart' show | 54 import 'label_scope.dart' show |
54 StatementScope; | 55 StatementScope; |
55 import 'registry.dart' show | 56 import 'registry.dart' show |
56 ResolutionRegistry; | 57 ResolutionRegistry; |
57 import 'resolution.dart' show | 58 import 'resolution.dart' show |
58 ResolverTask; | 59 ResolverTask; |
59 import 'resolution_common.dart' show | 60 import 'resolution_common.dart' show |
60 MappingVisitor; | 61 MappingVisitor; |
61 import 'resolution_result.dart'; | 62 import 'resolution_result.dart'; |
62 import 'scope.dart' show | 63 import 'scope.dart' show |
(...skipping 3566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3629 if (!enclosingElement.isFactoryConstructor) { | 3630 if (!enclosingElement.isFactoryConstructor) { |
3630 compiler.reportError( | 3631 compiler.reportError( |
3631 node, MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY); | 3632 node, MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY); |
3632 compiler.reportHint( | 3633 compiler.reportHint( |
3633 enclosingElement, MessageKind.MISSING_FACTORY_KEYWORD); | 3634 enclosingElement, MessageKind.MISSING_FACTORY_KEYWORD); |
3634 } | 3635 } |
3635 ConstructorElementX constructor = enclosingElement; | 3636 ConstructorElementX constructor = enclosingElement; |
3636 bool isConstConstructor = constructor.isConst; | 3637 bool isConstConstructor = constructor.isConst; |
3637 bool isValidAsConstant = isConstConstructor; | 3638 bool isValidAsConstant = isConstConstructor; |
3638 ConstructorElement redirectionTarget = resolveRedirectingFactory( | 3639 ConstructorElement redirectionTarget = resolveRedirectingFactory( |
3639 node, inConstContext: isConstConstructor); | 3640 node, inConstContext: isConstConstructor).element; |
3640 constructor.immediateRedirectionTarget = redirectionTarget; | 3641 constructor.immediateRedirectionTarget = redirectionTarget; |
3641 | 3642 |
3642 Node constructorReference = node.constructorReference; | 3643 Node constructorReference = node.constructorReference; |
3643 if (constructorReference is Send) { | 3644 if (constructorReference is Send) { |
3644 constructor.redirectionDeferredPrefix = | 3645 constructor.redirectionDeferredPrefix = |
3645 compiler.deferredLoadTask.deferredPrefixElement(constructorReference, | 3646 compiler.deferredLoadTask.deferredPrefixElement(constructorReference, |
3646 registry.mapping); | 3647 registry.mapping); |
3647 } | 3648 } |
3648 | 3649 |
3649 registry.setRedirectingTargetConstructor(node, redirectionTarget); | 3650 registry.setRedirectingTargetConstructor(node, redirectionTarget); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3807 allowedCategory = oldCategory; | 3808 allowedCategory = oldCategory; |
3808 sendIsMemberAccess = oldSendIsMemberAccess; | 3809 sendIsMemberAccess = oldSendIsMemberAccess; |
3809 if (result.kind == ResultKind.CONSTANT) { | 3810 if (result.kind == ResultKind.CONSTANT) { |
3810 return result; | 3811 return result; |
3811 } | 3812 } |
3812 return const NoneResult(); | 3813 return const NoneResult(); |
3813 } | 3814 } |
3814 | 3815 |
3815 ResolutionResult visitNewExpression(NewExpression node) { | 3816 ResolutionResult visitNewExpression(NewExpression node) { |
3816 bool isValidAsConstant = true; | 3817 bool isValidAsConstant = true; |
3817 FunctionElement constructor = resolveConstructor(node); | 3818 ConstructorElement constructor = resolveConstructor(node).element; |
3818 final bool isSymbolConstructor = constructor == compiler.symbolConstructor; | 3819 final bool isSymbolConstructor = constructor == compiler.symbolConstructor; |
3819 final bool isMirrorsUsedConstant = | 3820 final bool isMirrorsUsedConstant = |
3820 node.isConst && (constructor == compiler.mirrorsUsedConstructor); | 3821 node.isConst && (constructor == compiler.mirrorsUsedConstructor); |
3821 Selector callSelector = resolveSelector(node.send, constructor); | 3822 Selector callSelector = resolveSelector(node.send, constructor); |
3822 ArgumentsResult argumentsResult; | 3823 ArgumentsResult argumentsResult; |
3823 if (node.isConst) { | 3824 if (node.isConst) { |
3824 argumentsResult = | 3825 argumentsResult = |
3825 inConstantContext(() => resolveArguments(node.send.argumentsNode)); | 3826 inConstantContext(() => resolveArguments(node.send.argumentsNode)); |
3826 } else { | 3827 } else { |
3827 argumentsResult = resolveArguments(node.send.argumentsNode); | 3828 argumentsResult = resolveArguments(node.send.argumentsNode); |
(...skipping 21 matching lines...) Expand all Loading... |
3849 InterfaceType type = registry.getType(node); | 3850 InterfaceType type = registry.getType(node); |
3850 if (node.isConst && type.containsTypeVariables) { | 3851 if (node.isConst && type.containsTypeVariables) { |
3851 compiler.reportError(node.send.selector, | 3852 compiler.reportError(node.send.selector, |
3852 MessageKind.TYPE_VARIABLE_IN_CONSTANT); | 3853 MessageKind.TYPE_VARIABLE_IN_CONSTANT); |
3853 isValidAsConstant = false; | 3854 isValidAsConstant = false; |
3854 } | 3855 } |
3855 // TODO(johniwinther): Avoid registration of `type` in face of redirecting | 3856 // TODO(johniwinther): Avoid registration of `type` in face of redirecting |
3856 // factory constructors. | 3857 // factory constructors. |
3857 registry.registerInstantiatedType(type); | 3858 registry.registerInstantiatedType(type); |
3858 if (constructor.isGenerativeConstructor && cls.isAbstract) { | 3859 if (constructor.isGenerativeConstructor && cls.isAbstract) { |
3859 warning(node, MessageKind.ABSTRACT_CLASS_INSTANTIATION); | |
3860 registry.registerAbstractClassInstantiation(); | |
3861 isValidAsConstant = false; | 3860 isValidAsConstant = false; |
3862 } | 3861 } |
3863 | 3862 |
3864 if (isSymbolConstructor) { | 3863 if (isSymbolConstructor) { |
3865 if (node.isConst) { | 3864 if (node.isConst) { |
3866 Node argumentNode = node.send.arguments.head; | 3865 Node argumentNode = node.send.arguments.head; |
3867 ConstantExpression constant = | 3866 ConstantExpression constant = |
3868 compiler.resolver.constantCompiler.compileNode( | 3867 compiler.resolver.constantCompiler.compileNode( |
3869 argumentNode, registry.mapping); | 3868 argumentNode, registry.mapping); |
3870 ConstantValue name = compiler.constants.getConstantValue(constant); | 3869 ConstantValue name = compiler.constants.getConstantValue(constant); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3986 return false; | 3985 return false; |
3987 } | 3986 } |
3988 return true; | 3987 return true; |
3989 } | 3988 } |
3990 | 3989 |
3991 /** | 3990 /** |
3992 * Try to resolve the constructor that is referred to by [node]. | 3991 * Try to resolve the constructor that is referred to by [node]. |
3993 * Note: this function may return an ErroneousFunctionElement instead of | 3992 * Note: this function may return an ErroneousFunctionElement instead of |
3994 * [:null:], if there is no corresponding constructor, class or library. | 3993 * [:null:], if there is no corresponding constructor, class or library. |
3995 */ | 3994 */ |
3996 ConstructorElement resolveConstructor(NewExpression node) { | 3995 ConstructorResult resolveConstructor(NewExpression node) { |
3997 return node.accept(new ConstructorResolver(compiler, this)); | 3996 return node.accept(new ConstructorResolver( |
| 3997 compiler, this, inConstContext: node.isConst)); |
3998 } | 3998 } |
3999 | 3999 |
4000 ConstructorElement resolveRedirectingFactory(RedirectingFactoryBody node, | 4000 ConstructorResult resolveRedirectingFactory(RedirectingFactoryBody node, |
4001 {bool inConstContext: false}) { | 4001 {bool inConstContext: false}) { |
4002 return node.accept(new ConstructorResolver(compiler, this, | 4002 return node.accept(new ConstructorResolver( |
4003 inConstContext: inConstContext)); | 4003 compiler, this, inConstContext: inConstContext)); |
4004 } | 4004 } |
4005 | 4005 |
4006 DartType resolveTypeAnnotation(TypeAnnotation node, | 4006 DartType resolveTypeAnnotation(TypeAnnotation node, |
4007 {bool malformedIsError: false, | 4007 {bool malformedIsError: false, |
4008 bool deferredIsMalformed: true}) { | 4008 bool deferredIsMalformed: true}) { |
4009 DartType type = typeResolver.resolveTypeAnnotation( | 4009 DartType type = typeResolver.resolveTypeAnnotation( |
4010 this, node, malformedIsError: malformedIsError, | 4010 this, node, malformedIsError: malformedIsError, |
4011 deferredIsMalformed: deferredIsMalformed); | 4011 deferredIsMalformed: deferredIsMalformed); |
4012 if (inCheckContext) { | 4012 if (inCheckContext) { |
4013 registry.registerIsCheck(type); | 4013 registry.registerIsCheck(type); |
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4644 } | 4644 } |
4645 return const NoneResult(); | 4645 return const NoneResult(); |
4646 } | 4646 } |
4647 } | 4647 } |
4648 | 4648 |
4649 /// Looks up [name] in [scope] and unwraps the result. | 4649 /// Looks up [name] in [scope] and unwraps the result. |
4650 Element lookupInScope(Compiler compiler, Node node, | 4650 Element lookupInScope(Compiler compiler, Node node, |
4651 Scope scope, String name) { | 4651 Scope scope, String name) { |
4652 return Elements.unwrap(scope.lookup(name), compiler, node); | 4652 return Elements.unwrap(scope.lookup(name), compiler, node); |
4653 } | 4653 } |
OLD | NEW |