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