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 part of resolution; | 5 part of resolution; |
6 | 6 |
7 abstract class TreeElements { | 7 abstract class TreeElements { |
8 Element operator[](Node node); | 8 Element operator[](Node node); |
9 Selector getSelector(Send send); | 9 Selector getSelector(Send send); |
10 DartType getType(Node node); | 10 DartType getType(Node node); |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 * Load and resolve the supertypes of [cls]. | 384 * Load and resolve the supertypes of [cls]. |
385 * | 385 * |
386 * Warning: do not call this method directly. It should only be | 386 * Warning: do not call this method directly. It should only be |
387 * called by [resolveClass] and [ClassSupertypeResolver]. | 387 * called by [resolveClass] and [ClassSupertypeResolver]. |
388 */ | 388 */ |
389 void loadSupertypes(ClassElement cls, Node from) { | 389 void loadSupertypes(ClassElement cls, Node from) { |
390 compiler.withCurrentElement(cls, () => measure(() { | 390 compiler.withCurrentElement(cls, () => measure(() { |
391 if (cls.supertypeLoadState == STATE_DONE) return; | 391 if (cls.supertypeLoadState == STATE_DONE) return; |
392 if (cls.supertypeLoadState == STATE_STARTED) { | 392 if (cls.supertypeLoadState == STATE_STARTED) { |
393 compiler.reportMessage( | 393 compiler.reportMessage( |
394 compiler.spanFromNode(from), | 394 compiler.spanFromSpannable(from), |
395 MessageKind.CYCLIC_CLASS_HIERARCHY.error([cls.name]), | 395 MessageKind.CYCLIC_CLASS_HIERARCHY.error([cls.name]), |
396 Diagnostic.ERROR); | 396 Diagnostic.ERROR); |
397 cls.supertypeLoadState = STATE_DONE; | 397 cls.supertypeLoadState = STATE_DONE; |
398 cls.allSupertypes = const Link<DartType>().prepend( | 398 cls.allSupertypes = const Link<DartType>().prepend( |
399 compiler.objectClass.computeType(compiler)); | 399 compiler.objectClass.computeType(compiler)); |
400 // TODO(ahe): We should also set cls.supertype here to avoid | 400 // TODO(ahe): We should also set cls.supertype here to avoid |
401 // creating a malformed class hierarchy. | 401 // creating a malformed class hierarchy. |
402 return; | 402 return; |
403 } | 403 } |
404 cls.supertypeLoadState = STATE_STARTED; | 404 cls.supertypeLoadState = STATE_STARTED; |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 if (signature.requiredParameterCount != requiredParameterCount) { | 632 if (signature.requiredParameterCount != requiredParameterCount) { |
633 Node errorNode = node; | 633 Node errorNode = node; |
634 if (node.parameters != null) { | 634 if (node.parameters != null) { |
635 if (signature.requiredParameterCount < requiredParameterCount) { | 635 if (signature.requiredParameterCount < requiredParameterCount) { |
636 errorNode = node.parameters; | 636 errorNode = node.parameters; |
637 } else { | 637 } else { |
638 errorNode = node.parameters.nodes.skip(requiredParameterCount).head; | 638 errorNode = node.parameters.nodes.skip(requiredParameterCount).head; |
639 } | 639 } |
640 } | 640 } |
641 compiler.reportMessage( | 641 compiler.reportMessage( |
642 compiler.spanFromNode(errorNode), | 642 compiler.spanFromSpannable(errorNode), |
643 messageKind.error([function.name]), | 643 messageKind.error([function.name]), |
644 Diagnostic.ERROR); | 644 Diagnostic.ERROR); |
645 } | 645 } |
646 if (signature.optionalParameterCount != 0) { | 646 if (signature.optionalParameterCount != 0) { |
647 Node errorNode = | 647 Node errorNode = |
648 node.parameters.nodes.skip(signature.requiredParameterCount).head; | 648 node.parameters.nodes.skip(signature.requiredParameterCount).head; |
649 if (signature.optionalParametersAreNamed) { | 649 if (signature.optionalParametersAreNamed) { |
650 compiler.reportMessage( | 650 compiler.reportMessage( |
651 compiler.spanFromNode(errorNode), | 651 compiler.spanFromSpannable(errorNode), |
652 MessageKind.OPERATOR_NAMED_PARAMETERS.error([function.name]), | 652 MessageKind.OPERATOR_NAMED_PARAMETERS.error([function.name]), |
653 Diagnostic.ERROR); | 653 Diagnostic.ERROR); |
654 } else { | 654 } else { |
655 compiler.reportMessage( | 655 compiler.reportMessage( |
656 compiler.spanFromNode(errorNode), | 656 compiler.spanFromSpannable(errorNode), |
657 MessageKind.OPERATOR_OPTIONAL_PARAMETERS.error([function.name]), | 657 MessageKind.OPERATOR_OPTIONAL_PARAMETERS.error([function.name]), |
658 Diagnostic.ERROR); | 658 Diagnostic.ERROR); |
659 } | 659 } |
660 } | 660 } |
661 } | 661 } |
662 | 662 |
663 reportErrorWithContext(Element errorneousElement, | 663 reportErrorWithContext(Element errorneousElement, |
664 MessageKind errorMessage, | 664 MessageKind errorMessage, |
665 Element contextElement, | 665 Element contextElement, |
666 MessageKind contextMessage) { | 666 MessageKind contextMessage) { |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1418 inCheckContext = compiler.enableTypeAssertions, | 1418 inCheckContext = compiler.enableTypeAssertions, |
1419 inCatchBlock = false, | 1419 inCatchBlock = false, |
1420 super(compiler); | 1420 super(compiler); |
1421 | 1421 |
1422 ResolutionEnqueuer get world => compiler.enqueuer.resolution; | 1422 ResolutionEnqueuer get world => compiler.enqueuer.resolution; |
1423 | 1423 |
1424 Element lookup(Node node, SourceString name) { | 1424 Element lookup(Node node, SourceString name) { |
1425 Element result = scope.lookup(name); | 1425 Element result = scope.lookup(name); |
1426 if (!Elements.isUnresolved(result)) { | 1426 if (!Elements.isUnresolved(result)) { |
1427 if (!inInstanceContext && result.isInstanceMember()) { | 1427 if (!inInstanceContext && result.isInstanceMember()) { |
1428 compiler.reportMessage(compiler.spanFromNode(node), | 1428 compiler.reportMessage(compiler.spanFromSpannable(node), |
1429 MessageKind.NO_INSTANCE_AVAILABLE.error([name]), | 1429 MessageKind.NO_INSTANCE_AVAILABLE.error([name]), |
1430 Diagnostic.ERROR); | 1430 Diagnostic.ERROR); |
1431 return new ErroneousElementX(MessageKind.NO_INSTANCE_AVAILABLE, | 1431 return new ErroneousElementX(MessageKind.NO_INSTANCE_AVAILABLE, |
1432 [name], | 1432 [name], |
1433 name, enclosingElement); | 1433 name, enclosingElement); |
1434 } else if (result.isAmbiguous()) { | 1434 } else if (result.isAmbiguous()) { |
1435 AmbiguousElement ambiguous = result; | 1435 AmbiguousElement ambiguous = result; |
1436 compiler.reportMessage(compiler.spanFromNode(node), | 1436 compiler.reportMessage(compiler.spanFromSpannable(node), |
1437 ambiguous.messageKind.error(ambiguous.messageArguments), | 1437 ambiguous.messageKind.error(ambiguous.messageArguments), |
1438 Diagnostic.ERROR); | 1438 Diagnostic.ERROR); |
1439 return new ErroneousElementX(ambiguous.messageKind, | 1439 return new ErroneousElementX(ambiguous.messageKind, |
1440 ambiguous.messageArguments, | 1440 ambiguous.messageArguments, |
1441 name, enclosingElement); | 1441 name, enclosingElement); |
1442 } | 1442 } |
1443 } | 1443 } |
1444 return result; | 1444 return result; |
1445 } | 1445 } |
1446 | 1446 |
(...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2140 if (node.isRedirectingFactoryBody) { | 2140 if (node.isRedirectingFactoryBody) { |
2141 handleRedirectingFactoryBody(node); | 2141 handleRedirectingFactoryBody(node); |
2142 } else { | 2142 } else { |
2143 visit(node.expression); | 2143 visit(node.expression); |
2144 } | 2144 } |
2145 } | 2145 } |
2146 | 2146 |
2147 void handleRedirectingFactoryBody(Return node) { | 2147 void handleRedirectingFactoryBody(Return node) { |
2148 if (!enclosingElement.isFactoryConstructor()) { | 2148 if (!enclosingElement.isFactoryConstructor()) { |
2149 compiler.reportMessage( | 2149 compiler.reportMessage( |
2150 compiler.spanFromNode(node), | 2150 compiler.spanFromSpannable(node), |
2151 MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY.error([]), | 2151 MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY.error([]), |
2152 Diagnostic.ERROR); | 2152 Diagnostic.ERROR); |
2153 compiler.reportMessage( | 2153 compiler.reportMessage( |
2154 compiler.spanFromElement(enclosingElement), | 2154 compiler.spanFromSpannable(enclosingElement), |
2155 MessageKind.MISSING_FACTORY_KEYWORD.error([]), | 2155 MessageKind.MISSING_FACTORY_KEYWORD.error([]), |
2156 Diagnostic.INFO); | 2156 Diagnostic.INFO); |
2157 } | 2157 } |
2158 Element redirectionTarget = resolveRedirectingFactory(node); | 2158 Element redirectionTarget = resolveRedirectingFactory(node); |
2159 var type = mapping.getType(node.expression); | 2159 var type = mapping.getType(node.expression); |
2160 if (type is InterfaceType && !type.isRaw) { | 2160 if (type is InterfaceType && !type.isRaw) { |
2161 unimplemented(node.expression, 'type arguments on redirecting factory'); | 2161 unimplemented(node.expression, 'type arguments on redirecting factory'); |
2162 } | 2162 } |
2163 useElement(node.expression, redirectionTarget); | 2163 useElement(node.expression, redirectionTarget); |
2164 FunctionElement constructor = enclosingElement; | 2164 FunctionElement constructor = enclosingElement; |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2775 if (interfaceType != null) { | 2775 if (interfaceType != null) { |
2776 if (identical(interfaceType.kind, TypeKind.MALFORMED_TYPE)) { | 2776 if (identical(interfaceType.kind, TypeKind.MALFORMED_TYPE)) { |
2777 // Error has already been reported. | 2777 // Error has already been reported. |
2778 } else if (!identical(interfaceType.kind, TypeKind.INTERFACE)) { | 2778 } else if (!identical(interfaceType.kind, TypeKind.INTERFACE)) { |
2779 // TODO(johnniwinther): Handle dynamic. | 2779 // TODO(johnniwinther): Handle dynamic. |
2780 TypeAnnotation typeAnnotation = link.head; | 2780 TypeAnnotation typeAnnotation = link.head; |
2781 error(typeAnnotation.typeName, MessageKind.CLASS_NAME_EXPECTED, []); | 2781 error(typeAnnotation.typeName, MessageKind.CLASS_NAME_EXPECTED, []); |
2782 } else { | 2782 } else { |
2783 if (interfaceType == element.supertype) { | 2783 if (interfaceType == element.supertype) { |
2784 compiler.reportMessage( | 2784 compiler.reportMessage( |
2785 compiler.spanFromNode(node.superclass), | 2785 compiler.spanFromSpannable(node.superclass), |
2786 MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS.error([interfaceType]), | 2786 MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS.error([interfaceType]), |
2787 Diagnostic.ERROR); | 2787 Diagnostic.ERROR); |
2788 compiler.reportMessage( | 2788 compiler.reportMessage( |
2789 compiler.spanFromNode(link.head), | 2789 compiler.spanFromSpannable(link.head), |
2790 MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS.error([interfaceType]), | 2790 MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS.error([interfaceType]), |
2791 Diagnostic.ERROR); | 2791 Diagnostic.ERROR); |
2792 } | 2792 } |
2793 if (interfaces.contains(interfaceType)) { | 2793 if (interfaces.contains(interfaceType)) { |
2794 compiler.reportMessage( | 2794 compiler.reportMessage( |
2795 compiler.spanFromNode(link.head), | 2795 compiler.spanFromSpannable(link.head), |
2796 MessageKind.DUPLICATE_IMPLEMENTS.error([interfaceType]), | 2796 MessageKind.DUPLICATE_IMPLEMENTS.error([interfaceType]), |
2797 Diagnostic.ERROR); | 2797 Diagnostic.ERROR); |
2798 } | 2798 } |
2799 interfaces = interfaces.prepend(interfaceType); | 2799 interfaces = interfaces.prepend(interfaceType); |
2800 if (isBlackListed(interfaceType)) { | 2800 if (isBlackListed(interfaceType)) { |
2801 error(link.head, MessageKind.CANNOT_IMPLEMENT, [interfaceType]); | 2801 error(link.head, MessageKind.CANNOT_IMPLEMENT, [interfaceType]); |
2802 } | 2802 } |
2803 } | 2803 } |
2804 } | 2804 } |
2805 } | 2805 } |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2968 Element element = context.lookup(node.source); | 2968 Element element = context.lookup(node.source); |
2969 if (element == null) { | 2969 if (element == null) { |
2970 error(node, MessageKind.CANNOT_RESOLVE_TYPE, [node]); | 2970 error(node, MessageKind.CANNOT_RESOLVE_TYPE, [node]); |
2971 } else if (!element.impliesType()) { | 2971 } else if (!element.impliesType()) { |
2972 error(node, MessageKind.NOT_A_TYPE, [node]); | 2972 error(node, MessageKind.NOT_A_TYPE, [node]); |
2973 } else { | 2973 } else { |
2974 if (element.isClass()) { | 2974 if (element.isClass()) { |
2975 loadSupertype(element, node); | 2975 loadSupertype(element, node); |
2976 } else { | 2976 } else { |
2977 compiler.reportMessage( | 2977 compiler.reportMessage( |
2978 compiler.spanFromNode(node), | 2978 compiler.spanFromSpannable(node), |
2979 MessageKind.CLASS_NAME_EXPECTED.error([]), | 2979 MessageKind.CLASS_NAME_EXPECTED.error([]), |
2980 Diagnostic.ERROR); | 2980 Diagnostic.ERROR); |
2981 } | 2981 } |
2982 } | 2982 } |
2983 } | 2983 } |
2984 | 2984 |
2985 void visitSend(Send node) { | 2985 void visitSend(Send node) { |
2986 Identifier prefix = node.receiver.asIdentifier(); | 2986 Identifier prefix = node.receiver.asIdentifier(); |
2987 if (prefix == null) { | 2987 if (prefix == null) { |
2988 error(node.receiver, MessageKind.NOT_A_PREFIX, [node.receiver]); | 2988 error(node.receiver, MessageKind.NOT_A_PREFIX, [node.receiver]); |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3195 Diagnostic.ERROR); | 3195 Diagnostic.ERROR); |
3196 } | 3196 } |
3197 } else { | 3197 } else { |
3198 if (element.isGetter()) { | 3198 if (element.isGetter()) { |
3199 if (!identical(formalParameters.getEndToken().next.stringValue, | 3199 if (!identical(formalParameters.getEndToken().next.stringValue, |
3200 // TODO(ahe): Remove the check for native keyword. | 3200 // TODO(ahe): Remove the check for native keyword. |
3201 'native')) { | 3201 'native')) { |
3202 if (compiler.rejectDeprecatedFeatures && | 3202 if (compiler.rejectDeprecatedFeatures && |
3203 // TODO(ahe): Remove isPlatformLibrary check. | 3203 // TODO(ahe): Remove isPlatformLibrary check. |
3204 !element.getLibrary().isPlatformLibrary) { | 3204 !element.getLibrary().isPlatformLibrary) { |
3205 compiler.reportMessage(compiler.spanFromNode(formalParameters), | 3205 compiler.reportMessage(compiler.spanFromSpannable(formalParameters), |
3206 MessageKind.EXTRA_FORMALS.error([]), | 3206 MessageKind.EXTRA_FORMALS.error([]), |
3207 Diagnostic.ERROR); | 3207 Diagnostic.ERROR); |
3208 } else { | 3208 } else { |
3209 compiler.onDeprecatedFeature(formalParameters, 'getter parameters'); | 3209 compiler.onDeprecatedFeature(formalParameters, 'getter parameters'); |
3210 } | 3210 } |
3211 } | 3211 } |
3212 } | 3212 } |
3213 LinkBuilder<Element> parametersBuilder = | 3213 LinkBuilder<Element> parametersBuilder = |
3214 visitor.analyzeNodes(formalParameters.nodes); | 3214 visitor.analyzeNodes(formalParameters.nodes); |
3215 requiredParameterCount = parametersBuilder.length; | 3215 requiredParameterCount = parametersBuilder.length; |
3216 parameters = parametersBuilder.toLink(); | 3216 parameters = parametersBuilder.toLink(); |
3217 } | 3217 } |
3218 DartType returnType = compiler.resolveReturnType(element, returnNode); | 3218 DartType returnType = compiler.resolveReturnType(element, returnNode); |
3219 if (element.isSetter() && (requiredParameterCount != 1 || | 3219 if (element.isSetter() && (requiredParameterCount != 1 || |
3220 visitor.optionalParameterCount != 0)) { | 3220 visitor.optionalParameterCount != 0)) { |
3221 // If there are no formal parameters, we already reported an error above. | 3221 // If there are no formal parameters, we already reported an error above. |
3222 if (formalParameters != null) { | 3222 if (formalParameters != null) { |
3223 compiler.reportMessage(compiler.spanFromNode(formalParameters), | 3223 compiler.reportMessage(compiler.spanFromSpannable(formalParameters), |
3224 MessageKind.ILLEGAL_SETTER_FORMALS.error([]), | 3224 MessageKind.ILLEGAL_SETTER_FORMALS.error([]), |
3225 Diagnostic.ERROR); | 3225 Diagnostic.ERROR); |
3226 } | 3226 } |
3227 } | 3227 } |
3228 return new FunctionSignatureX(parameters, | 3228 return new FunctionSignatureX(parameters, |
3229 visitor.optionalParameters, | 3229 visitor.optionalParameters, |
3230 requiredParameterCount, | 3230 requiredParameterCount, |
3231 visitor.optionalParameterCount, | 3231 visitor.optionalParameterCount, |
3232 visitor.optionalParametersAreNamed, | 3232 visitor.optionalParametersAreNamed, |
3233 returnType); | 3233 returnType); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3397 return e; | 3397 return e; |
3398 } | 3398 } |
3399 | 3399 |
3400 /// Assumed to be called by [resolveRedirectingFactory]. | 3400 /// Assumed to be called by [resolveRedirectingFactory]. |
3401 Element visitReturn(Return node) { | 3401 Element visitReturn(Return node) { |
3402 Node expression = node.expression; | 3402 Node expression = node.expression; |
3403 return finishConstructorReference(visit(expression), | 3403 return finishConstructorReference(visit(expression), |
3404 expression, expression); | 3404 expression, expression); |
3405 } | 3405 } |
3406 } | 3406 } |
OLD | NEW |