Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: pkg/compiler/lib/src/elements/modelx.dart

Issue 1302333006: Support metadata on patches. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Remove partial renaming Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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 elements.modelx; 5 library elements.modelx;
6 6
7 import '../compiler.dart' show 7 import '../compiler.dart' show
8 Compiler; 8 Compiler;
9 import '../constants/constant_constructors.dart'; 9 import '../constants/constant_constructors.dart';
10 import '../constants/constructors.dart'; 10 import '../constants/constructors.dart';
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 abstract class DeclarationSite { 52 abstract class DeclarationSite {
53 } 53 }
54 54
55 abstract class ElementX extends Element with ElementCommon { 55 abstract class ElementX extends Element with ElementCommon {
56 static int elementHashCode = 0; 56 static int elementHashCode = 0;
57 57
58 final String name; 58 final String name;
59 final ElementKind kind; 59 final ElementKind kind;
60 final Element enclosingElement; 60 final Element enclosingElement;
61 final int hashCode = ++elementHashCode; 61 final int hashCode = ++elementHashCode;
62 Link<MetadataAnnotation> metadata = const Link<MetadataAnnotation>(); 62 List<MetadataAnnotation> metadataInternal;
63 63
64 ElementX(this.name, this.kind, this.enclosingElement) { 64 ElementX(this.name, this.kind, this.enclosingElement) {
65 assert(isErroneous || implementationLibrary != null); 65 assert(isErroneous || implementationLibrary != null);
66 } 66 }
67 67
68 Modifiers get modifiers => Modifiers.EMPTY; 68 Modifiers get modifiers => Modifiers.EMPTY;
69 69
70 Node parseNode(DiagnosticListener listener) { 70 Node parseNode(DiagnosticListener listener) {
71 listener.internalError(this, 71 listener.internalError(this,
72 'parseNode not implemented on $this.'); 72 'parseNode not implemented on $this.');
73 return null; 73 return null;
74 } 74 }
75 75
76 void addMetadata(MetadataAnnotationX annotation) { 76 void set metadata(List<MetadataAnnotation> metadata) {
77 assert(annotation.annotatedElement == null); 77 assert(metadataInternal == null);
78 annotation.annotatedElement = this; 78 for (MetadataAnnotationX annotation in metadata) {
79 addMetadataInternal(annotation); 79 assert(annotation.annotatedElement == null);
80 annotation.annotatedElement = this;
81 }
82 metadataInternal = metadata;
80 } 83 }
81 84
82 void addMetadataInternal(MetadataAnnotation annotation) { 85 Iterable<MetadataAnnotation> get metadata {
83 metadata = metadata.prepend(annotation); 86 if (isPatch && metadataInternal != null) {
87 if (origin.metadata.isEmpty) {
88 return metadataInternal;
89 } else {
90 return <MetadataAnnotation>[]
91 ..addAll(origin.metadata)
92 ..addAll(metadataInternal);
93 }
94 }
95 return metadataInternal != null
96 ? metadataInternal : const <MetadataAnnotation>[];
84 } 97 }
85 98
86 bool get isClosure => false; 99 bool get isClosure => false;
87 bool get isClassMember { 100 bool get isClassMember {
88 // Check that this element is defined in the scope of a Class. 101 // Check that this element is defined in the scope of a Class.
89 return enclosingElement != null && enclosingElement.isClass; 102 return enclosingElement != null && enclosingElement.isClass;
90 } 103 }
91 bool get isInstanceMember => false; 104 bool get isInstanceMember => false;
92 bool get isDeferredLoaderGetter => false; 105 bool get isDeferredLoaderGetter => false;
93 106
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 286
274 PrefixElement get redirectionDeferredPrefix => null; 287 PrefixElement get redirectionDeferredPrefix => null;
275 288
276 AbstractFieldElement abstractField; 289 AbstractFieldElement abstractField;
277 290
278 unsupported() { 291 unsupported() {
279 throw 'unsupported operation on erroneous element'; 292 throw 'unsupported operation on erroneous element';
280 } 293 }
281 294
282 get asyncMarker => AsyncMarker.SYNC; 295 get asyncMarker => AsyncMarker.SYNC;
283 Link<MetadataAnnotation> get metadata => unsupported(); 296 Iterable<MetadataAnnotation> get metadata => unsupported();
284 bool get hasNode => false; 297 bool get hasNode => false;
285 get node => unsupported(); 298 get node => unsupported();
286 get hasResolvedAst => false; 299 get hasResolvedAst => false;
287 get resolvedAst => unsupported(); 300 get resolvedAst => unsupported();
288 get type => unsupported(); 301 get type => unsupported();
289 get cachedNode => unsupported(); 302 get cachedNode => unsupported();
290 get functionSignature => unsupported(); 303 get functionSignature => unsupported();
291 get parameters => unsupported(); 304 get parameters => unsupported();
292 get patch => null; 305 get patch => null;
293 get origin => this; 306 get origin => this;
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
671 : this.script = script, 684 : this.script = script,
672 super(script.name, 685 super(script.name,
673 ElementKind.COMPILATION_UNIT, 686 ElementKind.COMPILATION_UNIT,
674 library) { 687 library) {
675 library.addCompilationUnit(this); 688 library.addCompilationUnit(this);
676 } 689 }
677 690
678 @override 691 @override
679 LibraryElementX get library => enclosingElement.declaration; 692 LibraryElementX get library => enclosingElement.declaration;
680 693
694 void set metadata(List<MetadataAnnotation> metadata) {
695 for (MetadataAnnotationX annotation in metadata) {
696 assert(annotation.annotatedElement == null);
697 annotation.annotatedElement = this;
698 }
699 // TODO(johnniwinther): Remove this work-around when import, export,
700 // part, and part-of declarations are elements.
701 if (metadataInternal == null) {
702 metadataInternal = <MetadataAnnotation>[];
703 }
704 metadataInternal.addAll(metadata);
705 }
706
681 void forEachLocalMember(f(Element element)) { 707 void forEachLocalMember(f(Element element)) {
682 localMembers.forEach(f); 708 localMembers.forEach(f);
683 } 709 }
684 710
685 void addMember(Element element, DiagnosticListener listener) { 711 void addMember(Element element, DiagnosticListener listener) {
686 // Keep a list of top level members. 712 // Keep a list of top level members.
687 localMembers = localMembers.prepend(element); 713 localMembers = localMembers.prepend(element);
688 // Provide the member to the library to build scope. 714 // Provide the member to the library to build scope.
689 if (enclosingElement.isPatch) { 715 if (enclosingElement.isPatch) {
690 implementationLibrary.addMember(element, listener); 716 implementationLibrary.addMember(element, listener);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 : this.canonicalUri = 911 : this.canonicalUri =
886 ((canonicalUri == null) ? script.readableUri : canonicalUri), 912 ((canonicalUri == null) ? script.readableUri : canonicalUri),
887 this.isSynthesized = script.isSynthesized, 913 this.isSynthesized = script.isSynthesized,
888 super(script.name, ElementKind.LIBRARY, null) { 914 super(script.name, ElementKind.LIBRARY, null) {
889 entryCompilationUnit = new CompilationUnitElementX(script, this); 915 entryCompilationUnit = new CompilationUnitElementX(script, this);
890 if (origin != null) { 916 if (origin != null) {
891 origin.applyPatch(this); 917 origin.applyPatch(this);
892 } 918 }
893 } 919 }
894 920
895 Link<MetadataAnnotation> get metadata { 921 Iterable<MetadataAnnotation> get metadata {
896 return (libraryTag == null) ? super.metadata : libraryTag.metadata; 922 if (libraryTag != null) {
923 return libraryTag.metadata;
924 }
925 return const <MetadataAnnotation>[];
897 } 926 }
898 927
899 set metadata(value) { 928 void set metadata(value) {
900 // The metadata is stored on [libraryTag]. 929 // The metadata is stored on [libraryTag].
901 throw new SpannableAssertionFailure(this, 'Cannot set metadata on Library'); 930 throw new SpannableAssertionFailure(this, 'Cannot set metadata on Library');
902 } 931 }
903 932
904 CompilationUnitElement get compilationUnit => entryCompilationUnit; 933 CompilationUnitElement get compilationUnit => entryCompilationUnit;
905 934
906 Element get analyzableElement => this; 935 Element get analyzableElement => this;
907 936
908 void addCompilationUnit(CompilationUnitElement element) { 937 void addCompilationUnit(CompilationUnitElement element) {
909 compilationUnits = compilationUnits.prepend(element); 938 compilationUnits = compilationUnits.prepend(element);
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 AstElement get definingElement => this; 1240 AstElement get definingElement => this;
1212 } 1241 }
1213 1242
1214 // This class holds common information for a list of variable or field 1243 // This class holds common information for a list of variable or field
1215 // declarations. It contains the node, and the type. A [VariableElementX] 1244 // declarations. It contains the node, and the type. A [VariableElementX]
1216 // forwards its [computeType] and [parseNode] methods to this class. 1245 // forwards its [computeType] and [parseNode] methods to this class.
1217 class VariableList implements DeclarationSite { 1246 class VariableList implements DeclarationSite {
1218 VariableDefinitions definitions; 1247 VariableDefinitions definitions;
1219 DartType type; 1248 DartType type;
1220 final Modifiers modifiers; 1249 final Modifiers modifiers;
1221 Link<MetadataAnnotation> metadata = const Link<MetadataAnnotation>(); 1250 List<MetadataAnnotation> metadataInternal;
1222 1251
1223 VariableList(Modifiers this.modifiers); 1252 VariableList(Modifiers this.modifiers);
1224 1253
1225 VariableList.node(VariableDefinitions node, this.type) 1254 VariableList.node(VariableDefinitions node, this.type)
1226 : this.definitions = node, 1255 : this.definitions = node,
1227 this.modifiers = node.modifiers { 1256 this.modifiers = node.modifiers {
1228 assert(modifiers != null); 1257 assert(modifiers != null);
1229 } 1258 }
1230 1259
1260 Iterable<MetadataAnnotation> get metadata {
1261 return metadataInternal != null
1262 ? metadataInternal : const <MetadataAnnotation>[];
1263 }
1264
1265 void set metadata(List<MetadataAnnotation> metadata) {
1266 if (metadata.isEmpty) {
1267 // For a multi declaration like:
1268 //
1269 // @foo @bar var a, b, c
1270 //
1271 // the metadata list is reported through the declaration of `a`, and `b`
1272 // and `c` report an empty list of metadata.
1273 return;
1274 }
1275 assert(metadataInternal == null);
1276 metadataInternal = metadata;
1277 }
1278
1231 VariableDefinitions parseNode(Element element, DiagnosticListener listener) { 1279 VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
1232 return definitions; 1280 return definitions;
1233 } 1281 }
1234 1282
1235 DartType computeType(Element element, Compiler compiler) => type; 1283 DartType computeType(Element element, Compiler compiler) => type;
1236 } 1284 }
1237 1285
1238 abstract class ConstantVariableMixin implements VariableElement { 1286 abstract class ConstantVariableMixin implements VariableElement {
1239 ConstantExpression constantCache; 1287 ConstantExpression constantCache;
1240 1288
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1277 VariableElementX(String name, 1325 VariableElementX(String name,
1278 ElementKind kind, 1326 ElementKind kind,
1279 Element enclosingElement, 1327 Element enclosingElement,
1280 VariableList variables, 1328 VariableList variables,
1281 this.token) 1329 this.token)
1282 : this.variables = variables, 1330 : this.variables = variables,
1283 super(name, kind, enclosingElement); 1331 super(name, kind, enclosingElement);
1284 1332
1285 // TODO(johnniwinther): Ensure that the [TreeElements] for this variable hold 1333 // TODO(johnniwinther): Ensure that the [TreeElements] for this variable hold
1286 // the mappings for all its metadata. 1334 // the mappings for all its metadata.
1287 Link<MetadataAnnotation> get metadata => variables.metadata; 1335 Iterable<MetadataAnnotation> get metadata => variables.metadata;
1288 1336
1289 void addMetadataInternal(MetadataAnnotation annotation) { 1337 void set metadata(List<MetadataAnnotation> metadata) {
1290 variables.metadata = variables.metadata.prepend(annotation); 1338 for (MetadataAnnotationX annotation in metadata) {
1339 assert(annotation.annotatedElement == null);
1340 annotation.annotatedElement = this;
1341 }
1342 variables.metadata = metadata;
1291 } 1343 }
1292 1344
1293 // A variable cannot be patched therefore defines itself. 1345 // A variable cannot be patched therefore defines itself.
1294 AstElement get definingElement => this; 1346 AstElement get definingElement => this;
1295 1347
1296 bool get hasNode => definitionsCache != null; 1348 bool get hasNode => definitionsCache != null;
1297 1349
1298 VariableDefinitions get node { 1350 VariableDefinitions get node {
1299 assert(invariant(this, definitionsCache != null, 1351 assert(invariant(this, definitionsCache != null,
1300 message: "Node has not been computed for $this.")); 1352 message: "Node has not been computed for $this."));
(...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after
2090 ElementKind.GENERATIVE_CONSTRUCTOR_BODY, 2142 ElementKind.GENERATIVE_CONSTRUCTOR_BODY,
2091 Modifiers.EMPTY, 2143 Modifiers.EMPTY,
2092 constructor.enclosingElement) { 2144 constructor.enclosingElement) {
2093 functionSignatureCache = constructor.functionSignature; 2145 functionSignatureCache = constructor.functionSignature;
2094 } 2146 }
2095 2147
2096 bool get hasNode => constructor.hasNode; 2148 bool get hasNode => constructor.hasNode;
2097 2149
2098 FunctionExpression get node => constructor.node; 2150 FunctionExpression get node => constructor.node;
2099 2151
2100 Link<MetadataAnnotation> get metadata => constructor.metadata; 2152 List<MetadataAnnotation> get metadata => constructor.metadata;
2101 2153
2102 bool get isInstanceMember => true; 2154 bool get isInstanceMember => true;
2103 2155
2104 FunctionType computeType(Compiler compiler) { 2156 FunctionType computeType(Compiler compiler) {
2105 compiler.internalError(this, '$this.computeType.'); 2157 compiler.internalError(this, '$this.computeType.');
2106 return null; 2158 return null;
2107 } 2159 }
2108 2160
2109 Token get position => constructor.position; 2161 Token get position => constructor.position;
2110 2162
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after
2914 AstElement get definingElement; 2966 AstElement get definingElement;
2915 2967
2916 bool get hasResolvedAst => definingElement.hasTreeElements; 2968 bool get hasResolvedAst => definingElement.hasTreeElements;
2917 2969
2918 ResolvedAst get resolvedAst { 2970 ResolvedAst get resolvedAst {
2919 return new ResolvedAst(declaration, 2971 return new ResolvedAst(declaration,
2920 definingElement.node, definingElement.treeElements); 2972 definingElement.node, definingElement.treeElements);
2921 } 2973 }
2922 2974
2923 } 2975 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698