| 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 |