| OLD | NEW | 
|---|
| 1 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.constructors; | 5 library dart2js.resolution.constructors; | 
| 6 | 6 | 
| 7 import '../common.dart'; | 7 import '../common.dart'; | 
| 8 import '../common/resolution.dart' show | 8 import '../common/resolution.dart' show | 
| 9     Feature; | 9     Feature; | 
| 10 import '../compiler.dart' show | 10 import '../compiler.dart' show | 
| (...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 478 | 478 | 
| 479   ConstructorResult reportAndCreateErroneousConstructorElement( | 479   ConstructorResult reportAndCreateErroneousConstructorElement( | 
| 480       Spannable diagnosticNode, | 480       Spannable diagnosticNode, | 
| 481       ConstructorResultKind resultKind, | 481       ConstructorResultKind resultKind, | 
| 482       DartType type, | 482       DartType type, | 
| 483       Element enclosing, | 483       Element enclosing, | 
| 484       String name, | 484       String name, | 
| 485       MessageKind kind, | 485       MessageKind kind, | 
| 486       Map arguments, | 486       Map arguments, | 
| 487       {bool isError: false, | 487       {bool isError: false, | 
| 488        bool missingConstructor: false}) { | 488        bool missingConstructor: false, | 
|  | 489        List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) { | 
| 489     if (missingConstructor) { | 490     if (missingConstructor) { | 
| 490       registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 491       registry.registerFeature(Feature.THROW_NO_SUCH_METHOD); | 
| 491     } else { | 492     } else { | 
| 492       registry.registerFeature(Feature.THROW_RUNTIME_ERROR); | 493       registry.registerFeature(Feature.THROW_RUNTIME_ERROR); | 
| 493     } | 494     } | 
|  | 495     DiagnosticMessage message = | 
|  | 496         reporter.createMessage(diagnosticNode, kind, arguments); | 
| 494     if (isError || inConstContext) { | 497     if (isError || inConstContext) { | 
| 495       reporter.reportErrorMessage( | 498       reporter.reportError(message, infos); | 
| 496           diagnosticNode, kind, arguments); |  | 
| 497     } else { | 499     } else { | 
| 498       reporter.reportWarningMessage( | 500       reporter.reportWarning(message, infos); | 
| 499           diagnosticNode, kind, arguments); |  | 
| 500     } | 501     } | 
| 501     ErroneousElement error = new ErroneousConstructorElementX( | 502     ErroneousElement error = new ErroneousConstructorElementX( | 
| 502         kind, arguments, name, enclosing); | 503         kind, arguments, name, enclosing); | 
| 503     if (type == null) { | 504     if (type == null) { | 
| 504       type = new MalformedType(error, null); | 505       type = new MalformedType(error, null); | 
| 505     } | 506     } | 
| 506     return new ConstructorResult.forError(resultKind, error, type); | 507     return new ConstructorResult.forError(resultKind, error, type); | 
| 507   } | 508   } | 
| 508 | 509 | 
| 509   ConstructorResult resolveConstructor( | 510   ConstructorResult resolveConstructor( | 
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 609     // constructor. Therefore we allow deferred types. | 610     // constructor. Therefore we allow deferred types. | 
| 610     DartType type = resolver.resolveTypeAnnotation( | 611     DartType type = resolver.resolveTypeAnnotation( | 
| 611         node, | 612         node, | 
| 612         malformedIsError: inConstContext, | 613         malformedIsError: inConstContext, | 
| 613         deferredIsMalformed: false); | 614         deferredIsMalformed: false); | 
| 614     Send send = node.typeName.asSend(); | 615     Send send = node.typeName.asSend(); | 
| 615     PrefixElement prefix; | 616     PrefixElement prefix; | 
| 616     if (send != null) { | 617     if (send != null) { | 
| 617       // The type name is of the form [: prefix . identifier :]. | 618       // The type name is of the form [: prefix . identifier :]. | 
| 618       String name = send.receiver.asIdentifier().source; | 619       String name = send.receiver.asIdentifier().source; | 
| 619       Element element = resolver.reportLookupErrorIfAny( | 620       Element element = lookupInScope(reporter, send, resolver.scope, name); | 
| 620           lookupInScope(reporter, send, resolver.scope, name), node, name); |  | 
| 621       if (element != null && element.isPrefix) { | 621       if (element != null && element.isPrefix) { | 
| 622         prefix = element; | 622         prefix = element; | 
| 623       } | 623       } | 
| 624     } | 624     } | 
| 625     return constructorResultForType(node, type, prefix: prefix); | 625     return constructorResultForType(node, type, prefix: prefix); | 
| 626   } | 626   } | 
| 627 | 627 | 
| 628   ConstructorResult visitSend(Send node) { | 628   ConstructorResult visitSend(Send node) { | 
| 629     ConstructorResult receiver = visit(node.receiver); | 629     ConstructorResult receiver = visit(node.receiver); | 
| 630     assert(invariant(node.receiver, receiver != null, | 630     assert(invariant(node.receiver, receiver != null, | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 659       return constructorResultForElement( | 659       return constructorResultForElement( | 
| 660           node, name.source, member, prefix: prefix); | 660           node, name.source, member, prefix: prefix); | 
| 661     } else { | 661     } else { | 
| 662       return reporter.internalError( | 662       return reporter.internalError( | 
| 663           node.receiver, 'unexpected receiver $receiver'); | 663           node.receiver, 'unexpected receiver $receiver'); | 
| 664     } | 664     } | 
| 665   } | 665   } | 
| 666 | 666 | 
| 667   ConstructorResult visitIdentifier(Identifier node) { | 667   ConstructorResult visitIdentifier(Identifier node) { | 
| 668     String name = node.source; | 668     String name = node.source; | 
| 669     Element element = resolver.reportLookupErrorIfAny( | 669     Element element = lookupInScope(reporter, node, resolver.scope, name); | 
| 670         lookupInScope(reporter, node, resolver.scope, name), node, name); |  | 
| 671     registry.useElement(node, element); | 670     registry.useElement(node, element); | 
| 672     // TODO(johnniwinther): Change errors to warnings, cf. 11.11.1. |  | 
| 673     return constructorResultForElement(node, name, element); | 671     return constructorResultForElement(node, name, element); | 
| 674   } | 672   } | 
| 675 | 673 | 
| 676   /// Assumed to be called by [resolveRedirectingFactory]. | 674   /// Assumed to be called by [resolveRedirectingFactory]. | 
| 677   ConstructorResult visitRedirectingFactoryBody(RedirectingFactoryBody node) { | 675   ConstructorResult visitRedirectingFactoryBody(RedirectingFactoryBody node) { | 
| 678     Node constructorReference = node.constructorReference; | 676     Node constructorReference = node.constructorReference; | 
| 679     return finishConstructorReference(visit(constructorReference), | 677     return finishConstructorReference(visit(constructorReference), | 
| 680         constructorReference, node); | 678         constructorReference, node); | 
| 681   } | 679   } | 
| 682 | 680 | 
| 683   ConstructorResult constructorResultForElement( | 681   ConstructorResult constructorResultForElement( | 
| 684       Node node, String name, Element element, | 682       Node node, String name, Element element, | 
| 685       {PrefixElement prefix}) { | 683       {PrefixElement prefix}) { | 
| 686     element = Elements.unwrap(element, reporter, node); | 684     element = Elements.unwrap(element, reporter, node); | 
| 687     if (element == null) { | 685     if (element == null) { | 
| 688       return reportAndCreateErroneousConstructorElement( | 686       return reportAndCreateErroneousConstructorElement( | 
| 689           node, | 687           node, | 
| 690           ConstructorResultKind.INVALID_TYPE, null, | 688           ConstructorResultKind.INVALID_TYPE, null, | 
| 691           resolver.enclosingElement, name, | 689           resolver.enclosingElement, name, | 
| 692           MessageKind.CANNOT_RESOLVE, | 690           MessageKind.CANNOT_RESOLVE, | 
| 693           {'name': name}); | 691           {'name': name}); | 
|  | 692     } else if (element.isAmbiguous) { | 
|  | 693       AmbiguousElement ambiguous = element; | 
|  | 694       return reportAndCreateErroneousConstructorElement( | 
|  | 695           node, | 
|  | 696           ConstructorResultKind.INVALID_TYPE, null, | 
|  | 697           resolver.enclosingElement, name, | 
|  | 698           ambiguous.messageKind, | 
|  | 699           ambiguous.messageArguments, | 
|  | 700           infos: ambiguous.computeInfos(resolver.enclosingElement, reporter)); | 
| 694     } else if (element.isMalformed) { | 701     } else if (element.isMalformed) { | 
| 695       return constructorResultForErroneous(node, element); | 702       return constructorResultForErroneous(node, element); | 
| 696     } else if (element.isClass) { | 703     } else if (element.isClass) { | 
| 697       ClassElement cls = element; | 704       ClassElement cls = element; | 
| 698       cls.computeType(resolution); | 705       cls.computeType(resolution); | 
| 699       return constructorResultForType(node, cls.rawType, prefix: prefix); | 706       return constructorResultForType(node, cls.rawType, prefix: prefix); | 
| 700     } else if (element.isPrefix) { | 707     } else if (element.isPrefix) { | 
| 701       return new ConstructorResult.forPrefix(element); | 708       return new ConstructorResult.forPrefix(element); | 
| 702     } else if (element.isTypedef) { | 709     } else if (element.isTypedef) { | 
| 703       TypedefElement typdef = element; | 710       TypedefElement typdef = element; | 
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 860     // constructors. | 867     // constructors. | 
| 861     return null; | 868     return null; | 
| 862   } | 869   } | 
| 863   // TODO(johnniwinther): Use [Name] for lookup. | 870   // TODO(johnniwinther): Use [Name] for lookup. | 
| 864   ConstructorElement constructor = cls.lookupConstructor(constructorName); | 871   ConstructorElement constructor = cls.lookupConstructor(constructorName); | 
| 865   if (constructor != null) { | 872   if (constructor != null) { | 
| 866     constructor = constructor.declaration; | 873     constructor = constructor.declaration; | 
| 867   } | 874   } | 
| 868   return constructor; | 875   return constructor; | 
| 869 } | 876 } | 
| OLD | NEW | 
|---|