| 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; | 5 library dart2js.resolution; |
| 6 | 6 |
| 7 import 'dart:collection' show Queue; | 7 import 'dart:collection' show Queue; |
| 8 | 8 |
| 9 import '../common/names.dart' show | 9 import '../common/names.dart' show |
| 10 Identifiers; | 10 Identifiers; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 return measure(() { | 71 return measure(() { |
| 72 if (Elements.isErroneous(element)) { | 72 if (Elements.isErroneous(element)) { |
| 73 // TODO(johnniwinther): Add a predicate for this. | 73 // TODO(johnniwinther): Add a predicate for this. |
| 74 assert(invariant(element, element is! ErroneousElement, | 74 assert(invariant(element, element is! ErroneousElement, |
| 75 message: "Element $element expected to have parse errors.")); | 75 message: "Element $element expected to have parse errors.")); |
| 76 _ensureTreeElements(element); | 76 _ensureTreeElements(element); |
| 77 return const WorldImpact(); | 77 return const WorldImpact(); |
| 78 } | 78 } |
| 79 | 79 |
| 80 WorldImpact processMetadata([WorldImpact result]) { | 80 WorldImpact processMetadata([WorldImpact result]) { |
| 81 for (MetadataAnnotation metadata in element.metadata) { | 81 for (MetadataAnnotation metadata in element.implementation.metadata) { |
| 82 metadata.ensureResolved(compiler); | 82 metadata.ensureResolved(compiler); |
| 83 } | 83 } |
| 84 return result; | 84 return result; |
| 85 } | 85 } |
| 86 | 86 |
| 87 ElementKind kind = element.kind; | 87 ElementKind kind = element.kind; |
| 88 if (identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR) || | 88 if (identical(kind, ElementKind.GENERATIVE_CONSTRUCTOR) || |
| 89 identical(kind, ElementKind.FUNCTION) || | 89 identical(kind, ElementKind.FUNCTION) || |
| 90 identical(kind, ElementKind.GETTER) || | 90 identical(kind, ElementKind.GETTER) || |
| 91 identical(kind, ElementKind.SETTER)) { | 91 identical(kind, ElementKind.SETTER)) { |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 587 // Stepwise assignment to ensure invariant. | 587 // Stepwise assignment to ensure invariant. |
| 588 element.supertypeLoadState = STATE_STARTED; | 588 element.supertypeLoadState = STATE_STARTED; |
| 589 element.supertypeLoadState = STATE_DONE; | 589 element.supertypeLoadState = STATE_DONE; |
| 590 element.resolutionState = STATE_DONE; | 590 element.resolutionState = STATE_DONE; |
| 591 // TODO(johnniwinther): Check matching type variables and | 591 // TODO(johnniwinther): Check matching type variables and |
| 592 // empty extends/implements clauses. | 592 // empty extends/implements clauses. |
| 593 } | 593 } |
| 594 } | 594 } |
| 595 | 595 |
| 596 void _postProcessClassElement(BaseClassElementX element) { | 596 void _postProcessClassElement(BaseClassElementX element) { |
| 597 for (MetadataAnnotation metadata in element.metadata) { | 597 for (MetadataAnnotation metadata in element.implementation.metadata) { |
| 598 metadata.ensureResolved(compiler); | 598 metadata.ensureResolved(compiler); |
| 599 ConstantValue value = | 599 ConstantValue value = |
| 600 compiler.constants.getConstantValue(metadata.constant); | 600 compiler.constants.getConstantValue(metadata.constant); |
| 601 if (!element.isProxy && value == compiler.proxyConstant) { | 601 if (!element.isProxy && value == compiler.proxyConstant) { |
| 602 element.isProxy = true; | 602 element.isProxy = true; |
| 603 } | 603 } |
| 604 } | 604 } |
| 605 | 605 |
| 606 // Force resolution of metadata on non-instance members since they may be | 606 // Force resolution of metadata on non-instance members since they may be |
| 607 // inspected by the backend while emitting. Metadata on instance members is | 607 // inspected by the backend while emitting. Metadata on instance members is |
| 608 // handled as a result of processing instantiated class members in the | 608 // handled as a result of processing instantiated class members in the |
| 609 // enqueuer. | 609 // enqueuer. |
| 610 // TODO(ahe): Avoid this eager resolution. | 610 // TODO(ahe): Avoid this eager resolution. |
| 611 element.forEachMember((_, Element member) { | 611 element.forEachMember((_, Element member) { |
| 612 if (!member.isInstanceMember) { | 612 if (!member.isInstanceMember) { |
| 613 compiler.withCurrentElement(member, () { | 613 compiler.withCurrentElement(member, () { |
| 614 for (MetadataAnnotation metadata in member.metadata) { | 614 for (MetadataAnnotation metadata in member.implementation.metadata) { |
| 615 metadata.ensureResolved(compiler); | 615 metadata.ensureResolved(compiler); |
| 616 } | 616 } |
| 617 }); | 617 }); |
| 618 } | 618 } |
| 619 }); | 619 }); |
| 620 | 620 |
| 621 computeClassMember(element, Identifiers.call); | 621 computeClassMember(element, Identifiers.call); |
| 622 } | 622 } |
| 623 | 623 |
| 624 void computeClassMembers(ClassElement element) { | 624 void computeClassMembers(ClassElement element) { |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 989 assert(invariant(node, context != null, | 989 assert(invariant(node, context != null, |
| 990 message: "No context found for metadata annotation " | 990 message: "No context found for metadata annotation " |
| 991 "on $annotatedElement.")); | 991 "on $annotatedElement.")); |
| 992 ResolverVisitor visitor = visitorFor(context, useEnclosingScope: true); | 992 ResolverVisitor visitor = visitorFor(context, useEnclosingScope: true); |
| 993 ResolutionRegistry registry = visitor.registry; | 993 ResolutionRegistry registry = visitor.registry; |
| 994 node.accept(visitor); | 994 node.accept(visitor); |
| 995 // TODO(johnniwinther): Avoid passing the [TreeElements] to | 995 // TODO(johnniwinther): Avoid passing the [TreeElements] to |
| 996 // [compileMetadata]. | 996 // [compileMetadata]. |
| 997 annotation.constant = | 997 annotation.constant = |
| 998 constantCompiler.compileMetadata(annotation, node, registry.mapping); | 998 constantCompiler.compileMetadata(annotation, node, registry.mapping); |
| 999 constantCompiler.evaluate(annotation.constant); |
| 999 // TODO(johnniwinther): Register the relation between the annotation | 1000 // TODO(johnniwinther): Register the relation between the annotation |
| 1000 // and the annotated element instead. This will allow the backend to | 1001 // and the annotated element instead. This will allow the backend to |
| 1001 // retrieve the backend constant and only register metadata on the | 1002 // retrieve the backend constant and only register metadata on the |
| 1002 // elements for which it is needed. (Issue 17732). | 1003 // elements for which it is needed. (Issue 17732). |
| 1003 registry.registerMetadataConstant(annotation, annotatedElement); | 1004 registry.registerMetadataConstant(annotation, annotatedElement); |
| 1004 annotation.resolutionState = STATE_DONE; | 1005 annotation.resolutionState = STATE_DONE; |
| 1005 })); | 1006 })); |
| 1006 } | 1007 } |
| 1007 | 1008 |
| 1008 error(Spannable node, MessageKind kind, [arguments = const {}]) { | 1009 error(Spannable node, MessageKind kind, [arguments = const {}]) { |
| 1009 compiler.reportError(node, kind, arguments); | 1010 compiler.reportError(node, kind, arguments); |
| 1010 } | 1011 } |
| 1011 | 1012 |
| 1012 Link<MetadataAnnotation> resolveMetadata(Element element, | 1013 List<MetadataAnnotation> resolveMetadata(Element element, |
| 1013 VariableDefinitions node) { | 1014 VariableDefinitions node) { |
| 1014 LinkBuilder<MetadataAnnotation> metadata = | 1015 List<MetadataAnnotation> metadata = <MetadataAnnotation>[]; |
| 1015 new LinkBuilder<MetadataAnnotation>(); | |
| 1016 for (Metadata annotation in node.metadata.nodes) { | 1016 for (Metadata annotation in node.metadata.nodes) { |
| 1017 ParameterMetadataAnnotation metadataAnnotation = | 1017 ParameterMetadataAnnotation metadataAnnotation = |
| 1018 new ParameterMetadataAnnotation(annotation); | 1018 new ParameterMetadataAnnotation(annotation); |
| 1019 metadataAnnotation.annotatedElement = element; | 1019 metadataAnnotation.annotatedElement = element; |
| 1020 metadata.addLast(metadataAnnotation.ensureResolved(compiler)); | 1020 metadata.add(metadataAnnotation.ensureResolved(compiler)); |
| 1021 } | 1021 } |
| 1022 return metadata.toLink(); | 1022 return metadata; |
| 1023 } | 1023 } |
| 1024 } | 1024 } |
| 1025 | 1025 |
| 1026 TreeElements _ensureTreeElements(AnalyzableElementX element) { | 1026 TreeElements _ensureTreeElements(AnalyzableElementX element) { |
| 1027 if (element._treeElements == null) { | 1027 if (element._treeElements == null) { |
| 1028 element._treeElements = new TreeElementMapping(element); | 1028 element._treeElements = new TreeElementMapping(element); |
| 1029 } | 1029 } |
| 1030 return element._treeElements; | 1030 return element._treeElements; |
| 1031 } | 1031 } |
| 1032 | 1032 |
| 1033 abstract class AnalyzableElementX implements AnalyzableElement { | 1033 abstract class AnalyzableElementX implements AnalyzableElement { |
| 1034 TreeElements _treeElements; | 1034 TreeElements _treeElements; |
| 1035 | 1035 |
| 1036 bool get hasTreeElements => _treeElements != null; | 1036 bool get hasTreeElements => _treeElements != null; |
| 1037 | 1037 |
| 1038 TreeElements get treeElements { | 1038 TreeElements get treeElements { |
| 1039 assert(invariant(this, _treeElements !=null, | 1039 assert(invariant(this, _treeElements !=null, |
| 1040 message: "TreeElements have not been computed for $this.")); | 1040 message: "TreeElements have not been computed for $this.")); |
| 1041 return _treeElements; | 1041 return _treeElements; |
| 1042 } | 1042 } |
| 1043 | 1043 |
| 1044 void reuseElement() { | 1044 void reuseElement() { |
| 1045 _treeElements = null; | 1045 _treeElements = null; |
| 1046 } | 1046 } |
| 1047 } | 1047 } |
| OLD | NEW |