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

Side by Side Diff: pkg/compiler/lib/src/serialization/element_serialization.dart

Issue 1802883002: Use JS backend in serialization_analysis_test (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Serialize ClassElement.isUnnamedMixinApplication and test added properties. Created 4 years, 9 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
« no previous file with comments | « pkg/compiler/lib/src/native/enqueue.dart ('k') | pkg/compiler/lib/src/serialization/keys.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.serialization.elements; 5 library dart2js.serialization.elements;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../constants/constructors.dart'; 8 import '../constants/constructors.dart';
9 import '../constants/expressions.dart'; 9 import '../constants/expressions.dart';
10 import '../dart_types.dart'; 10 import '../dart_types.dart';
11 import '../elements/elements.dart'; 11 import '../elements/elements.dart';
12 import 'constant_serialization.dart'; 12 import 'constant_serialization.dart';
13 import 'keys.dart'; 13 import 'keys.dart';
14 import 'modelz.dart'; 14 import 'modelz.dart';
15 import 'serialization.dart'; 15 import 'serialization.dart';
16 16
17 /// Enum kinds used for encoding [Element]s. 17 /// Enum kinds used for encoding [Element]s.
18 enum SerializedElementKind { 18 enum SerializedElementKind {
19 LIBRARY, 19 LIBRARY,
20 COMPILATION_UNIT, 20 COMPILATION_UNIT,
21 CLASS, 21 CLASS,
22 ENUM,
22 GENERATIVE_CONSTRUCTOR, 23 GENERATIVE_CONSTRUCTOR,
23 FACTORY_CONSTRUCTOR, 24 FACTORY_CONSTRUCTOR,
24 TOPLEVEL_FIELD, 25 TOPLEVEL_FIELD,
25 STATIC_FIELD, 26 STATIC_FIELD,
26 INSTANCE_FIELD, 27 INSTANCE_FIELD,
27 TOPLEVEL_FUNCTION, 28 TOPLEVEL_FUNCTION,
28 TOPLEVEL_GETTER, 29 TOPLEVEL_GETTER,
29 TOPLEVEL_SETTER, 30 TOPLEVEL_SETTER,
30 STATIC_FUNCTION, 31 STATIC_FUNCTION,
31 STATIC_GETTER, 32 STATIC_GETTER,
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 110
110 /// Serialize the parameters of [element] into [encoder]. 111 /// Serialize the parameters of [element] into [encoder].
111 static void serializeParameters(FunctionElement element, 112 static void serializeParameters(FunctionElement element,
112 ObjectEncoder encoder) { 113 ObjectEncoder encoder) {
113 FunctionType type = element.type; 114 FunctionType type = element.type;
114 encoder.setType(Key.RETURN_TYPE, type.returnType); 115 encoder.setType(Key.RETURN_TYPE, type.returnType);
115 encoder.setElements(Key.PARAMETERS, element.parameters); 116 encoder.setElements(Key.PARAMETERS, element.parameters);
116 } 117 }
117 118
118 /// Returns a function that adds the underlying declared elements for a 119 /// Returns a function that adds the underlying declared elements for a
119 /// particular element into [list]. 120 /// particular element into [set].
120 /// 121 ///
121 /// For instance, for an [AbstractFieldElement] the getter and setter elements 122 /// For instance, for an [AbstractFieldElement] the getter and setter elements
122 /// are added, if available. 123 /// are added, if available.
123 static flattenElements(List<Element> list) { 124 static flattenElements(Set<Element> set) {
124 return (Element element) { 125 return (Element element) {
126 if (element.isPatch) return;
125 // TODO(johnniwinther): Handle ambiguous elements. 127 // TODO(johnniwinther): Handle ambiguous elements.
126 if (element.isAmbiguous) return; 128 if (element.isAmbiguous) return;
127 if (element.isAbstractField) { 129 if (element.isAbstractField) {
128 AbstractFieldElement abstractField = element; 130 AbstractFieldElement abstractField = element;
129 if (abstractField.getter != null) { 131 if (abstractField.getter != null) {
130 list.add(abstractField.getter); 132 set.add(abstractField.getter);
131 } 133 }
132 if (abstractField.setter != null) { 134 if (abstractField.setter != null) {
133 list.add(abstractField.setter); 135 set.add(abstractField.setter);
134 } 136 }
135 } else { 137 } else {
136 list.add(element); 138 set.add(element);
137 } 139 }
138 }; 140 };
139 } 141 }
140 } 142 }
141 143
142 class LibrarySerializer implements ElementSerializer { 144 class LibrarySerializer implements ElementSerializer {
143 const LibrarySerializer(); 145 const LibrarySerializer();
144 146
145 SerializedElementKind getSerializedKind(Element element) { 147 SerializedElementKind getSerializedKind(Element element) {
146 if (element.isLibrary) { 148 if (element.isLibrary) {
147 return SerializedElementKind.LIBRARY; 149 return SerializedElementKind.LIBRARY;
148 } 150 }
149 return null; 151 return null;
150 } 152 }
151 153
154 static List<CompilationUnitElement> getCompilationUnits(
155 LibraryElement element) {
156 List<CompilationUnitElement> compilationUnits = <CompilationUnitElement>[];
157 compilationUnits.addAll(element.compilationUnits.toList());
158 if (element.isPatched) {
159 compilationUnits.addAll(element.implementation.compilationUnits.toList());
160 }
161 return compilationUnits;
162 }
163
164 static List<ImportElement> getImports(LibraryElement element) {
165 List<ImportElement> imports = <ImportElement>[];
166 imports.addAll(element.imports);
167 if (element.isPatched) {
168 imports.addAll(element.implementation.imports);
169 }
170 return imports;
171 }
172
173 static List<Element> getImportedElements(
174 LibraryElement element) {
175 Set<Element> importedElements = new Set<Element>();
176 element.forEachImport(SerializerUtil.flattenElements(importedElements));
177 if (element.isPatched) {
178 element.implementation.forEachImport(
179 SerializerUtil.flattenElements(importedElements));
180 }
181 return importedElements.toList();
182 }
183
184 static List<Element> getExportedElements(
185 LibraryElement element) {
186 Set<Element> exportedElements = new Set<Element>();
187 element.forEachExport(SerializerUtil.flattenElements(exportedElements));
188 return exportedElements.toList();
189 }
190
152 void serialize(LibraryElement element, 191 void serialize(LibraryElement element,
153 ObjectEncoder encoder, 192 ObjectEncoder encoder,
154 SerializedElementKind kind) { 193 SerializedElementKind kind) {
155 encoder.setUri( 194 encoder.setUri(
156 Key.CANONICAL_URI, element.canonicalUri, element.canonicalUri); 195 Key.CANONICAL_URI, element.canonicalUri, element.canonicalUri);
157 encoder.setString(Key.LIBRARY_NAME, element.libraryName); 196 encoder.setString(Key.LIBRARY_NAME, element.libraryName);
158 SerializerUtil.serializeMembers(element, encoder); 197 SerializerUtil.serializeMembers(element, encoder);
159 encoder.setElement(Key.COMPILATION_UNIT, element.entryCompilationUnit); 198 encoder.setElement(Key.COMPILATION_UNIT, element.entryCompilationUnit);
160 encoder.setElements( 199 encoder.setElements(Key.COMPILATION_UNITS, getCompilationUnits(element));
161 Key.COMPILATION_UNITS, element.compilationUnits.toList()); 200 encoder.setElements(Key.IMPORTS, getImports(element));
162 encoder.setElements(Key.IMPORTS, element.imports);
163 encoder.setElements(Key.EXPORTS, element.exports); 201 encoder.setElements(Key.EXPORTS, element.exports);
164 202
165 List<Element> importedElements = <Element>[]; 203 encoder.setElements(Key.IMPORT_SCOPE, getImportedElements(element));
166 element.forEachImport(SerializerUtil.flattenElements(importedElements));
167 encoder.setElements(Key.IMPORT_SCOPE, importedElements);
168 204
169 List<Element> exportedElements = <Element>[]; 205 encoder.setElements(Key.EXPORT_SCOPE, getExportedElements(element));
170 element.forEachExport(SerializerUtil.flattenElements(exportedElements));
171 encoder.setElements(Key.EXPORT_SCOPE, exportedElements);
172 206
173 } 207 }
174 } 208 }
175 209
176 class CompilationUnitSerializer implements ElementSerializer { 210 class CompilationUnitSerializer implements ElementSerializer {
177 const CompilationUnitSerializer(); 211 const CompilationUnitSerializer();
178 212
179 SerializedElementKind getSerializedKind(Element element) { 213 SerializedElementKind getSerializedKind(Element element) {
180 if (element.isCompilationUnit) { 214 if (element.isCompilationUnit) {
181 return SerializedElementKind.COMPILATION_UNIT; 215 return SerializedElementKind.COMPILATION_UNIT;
182 } 216 }
183 return null; 217 return null;
184 } 218 }
185 219
186 void serialize(CompilationUnitElement element, 220 void serialize(CompilationUnitElement element,
187 ObjectEncoder encoder, 221 ObjectEncoder encoder,
188 SerializedElementKind kind) { 222 SerializedElementKind kind) {
189 encoder.setElement(Key.LIBRARY, element.library); 223 encoder.setElement(Key.LIBRARY, element.library);
190 encoder.setUri( 224 encoder.setUri(
191 Key.URI, element.library.canonicalUri, element.script.resourceUri); 225 Key.URI, element.library.canonicalUri, element.script.resourceUri);
192 List<Element> elements = <Element>[]; 226 List<Element> elements = <Element>[];
193 element.forEachLocalMember((e) => elements.add(e)); 227 element.forEachLocalMember((e) {
228 if (!element.isPatch) {
229 elements.add(e);
230 }
231 });
194 encoder.setElements(Key.ELEMENTS, elements); 232 encoder.setElements(Key.ELEMENTS, elements);
195 } 233 }
196 } 234 }
197 235
198 class ClassSerializer implements ElementSerializer { 236 class ClassSerializer implements ElementSerializer {
199 const ClassSerializer(); 237 const ClassSerializer();
200 238
201 SerializedElementKind getSerializedKind(Element element) { 239 SerializedElementKind getSerializedKind(Element element) {
202 if (element.isClass) { 240 if (element.isClass) {
241 ClassElement cls = element;
242 if (cls.isEnumClass) {
243 return SerializedElementKind.ENUM;
244 }
203 return SerializedElementKind.CLASS; 245 return SerializedElementKind.CLASS;
204 } 246 }
205 return null; 247 return null;
206 } 248 }
207 249
208 void serialize(ClassElement element, 250 void serialize(ClassElement element,
209 ObjectEncoder encoder, 251 ObjectEncoder encoder,
210 SerializedElementKind kind) { 252 SerializedElementKind kind) {
211 encoder.setElement(Key.LIBRARY, element.library); 253 encoder.setElement(Key.LIBRARY, element.library);
212 encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit); 254 encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
213 encoder.setString(Key.NAME, element.name); 255 encoder.setString(Key.NAME, element.name);
214 SerializerUtil.serializePosition(element, encoder); 256 SerializerUtil.serializePosition(element, encoder);
215 encoder.setTypes(Key.TYPE_VARIABLES, element.typeVariables); 257 encoder.setTypes(Key.TYPE_VARIABLES, element.typeVariables);
216 encoder.setBool(Key.IS_ABSTRACT, element.isAbstract); 258 encoder.setBool(Key.IS_ABSTRACT, element.isAbstract);
259 if (element.isUnnamedMixinApplication) {
260 encoder.setBool(Key.IS_UNNAMED_MIXIN_APPLICATION, true);
261 }
217 if (element.supertype != null) { 262 if (element.supertype != null) {
218 encoder.setType(Key.SUPERTYPE, element.supertype); 263 encoder.setType(Key.SUPERTYPE, element.supertype);
219 } 264 }
220 // TODO(johnniwinther): Make [OrderedTypeSet] easier to (de)serialize. 265 // TODO(johnniwinther): Make [OrderedTypeSet] easier to (de)serialize.
221 ObjectEncoder supertypes = encoder.createObject(Key.SUPERTYPES); 266 ObjectEncoder supertypes = encoder.createObject(Key.SUPERTYPES);
222 supertypes.setTypes(Key.TYPES, 267 supertypes.setTypes(Key.TYPES,
223 element.allSupertypesAndSelf.types.toList()); 268 element.allSupertypesAndSelf.types.toList());
224 supertypes.setTypes(Key.SUPERTYPES, 269 supertypes.setTypes(Key.SUPERTYPES,
225 element.allSupertypesAndSelf.supertypes.toList()); 270 element.allSupertypesAndSelf.supertypes.toList());
226 supertypes.setInts(Key.OFFSETS, element.allSupertypesAndSelf.levelOffsets); 271 supertypes.setInts(Key.OFFSETS, element.allSupertypesAndSelf.levelOffsets);
227 encoder.setTypes(Key.INTERFACES, element.interfaces.toList()); 272 encoder.setTypes(Key.INTERFACES, element.interfaces.toList());
228 SerializerUtil.serializeMembers(element, encoder); 273 SerializerUtil.serializeMembers(element, encoder);
274 if (kind == SerializedElementKind.ENUM) {
275 EnumClassElement enumClass = element;
276 encoder.setElements(Key.FIELDS, enumClass.enumValues);
277 }
229 } 278 }
230 } 279 }
231 280
232 class ConstructorSerializer implements ElementSerializer { 281 class ConstructorSerializer implements ElementSerializer {
233 const ConstructorSerializer(); 282 const ConstructorSerializer();
234 283
235 SerializedElementKind getSerializedKind(Element element) { 284 SerializedElementKind getSerializedKind(Element element) {
236 if (element.isGenerativeConstructor) { 285 if (element.isGenerativeConstructor) {
237 return SerializedElementKind.GENERATIVE_CONSTRUCTOR; 286 return SerializedElementKind.GENERATIVE_CONSTRUCTOR;
238 } else if (element.isFactoryConstructor) { 287 } else if (element.isFactoryConstructor) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 encoder.setType(Key.TYPE, element.type); 382 encoder.setType(Key.TYPE, element.type);
334 if (element.isFunction) { 383 if (element.isFunction) {
335 encoder.setBool(Key.IS_OPERATOR, element.isOperator); 384 encoder.setBool(Key.IS_OPERATOR, element.isOperator);
336 } 385 }
337 if (element.enclosingClass != null) { 386 if (element.enclosingClass != null) {
338 encoder.setElement(Key.CLASS, element.enclosingClass); 387 encoder.setElement(Key.CLASS, element.enclosingClass);
339 } else { 388 } else {
340 encoder.setElement(Key.LIBRARY, element.library); 389 encoder.setElement(Key.LIBRARY, element.library);
341 encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit); 390 encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
342 } 391 }
392 encoder.setBool(Key.IS_EXTERNAL, element.isExternal);
343 } 393 }
344 } 394 }
345 395
346 class TypedefSerializer implements ElementSerializer { 396 class TypedefSerializer implements ElementSerializer {
347 const TypedefSerializer(); 397 const TypedefSerializer();
348 398
349 SerializedElementKind getSerializedKind(Element element) { 399 SerializedElementKind getSerializedKind(Element element) {
350 if (element.isTypedef) { 400 if (element.isTypedef) {
351 return SerializedElementKind.TYPEDEF; 401 return SerializedElementKind.TYPEDEF;
352 } 402 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 static Element deserialize(ObjectDecoder decoder) { 551 static Element deserialize(ObjectDecoder decoder) {
502 SerializedElementKind elementKind = 552 SerializedElementKind elementKind =
503 decoder.getEnum(Key.KIND, SerializedElementKind.values); 553 decoder.getEnum(Key.KIND, SerializedElementKind.values);
504 switch (elementKind) { 554 switch (elementKind) {
505 case SerializedElementKind.LIBRARY: 555 case SerializedElementKind.LIBRARY:
506 return new LibraryElementZ(decoder); 556 return new LibraryElementZ(decoder);
507 case SerializedElementKind.COMPILATION_UNIT: 557 case SerializedElementKind.COMPILATION_UNIT:
508 return new CompilationUnitElementZ(decoder); 558 return new CompilationUnitElementZ(decoder);
509 case SerializedElementKind.CLASS: 559 case SerializedElementKind.CLASS:
510 return new ClassElementZ(decoder); 560 return new ClassElementZ(decoder);
561 case SerializedElementKind.ENUM:
562 return new EnumClassElementZ(decoder);
511 case SerializedElementKind.TOPLEVEL_FIELD: 563 case SerializedElementKind.TOPLEVEL_FIELD:
512 return new TopLevelFieldElementZ(decoder); 564 return new TopLevelFieldElementZ(decoder);
513 case SerializedElementKind.STATIC_FIELD: 565 case SerializedElementKind.STATIC_FIELD:
514 return new StaticFieldElementZ(decoder); 566 return new StaticFieldElementZ(decoder);
515 case SerializedElementKind.INSTANCE_FIELD: 567 case SerializedElementKind.INSTANCE_FIELD:
516 return new InstanceFieldElementZ(decoder); 568 return new InstanceFieldElementZ(decoder);
517 case SerializedElementKind.GENERATIVE_CONSTRUCTOR: 569 case SerializedElementKind.GENERATIVE_CONSTRUCTOR:
518 return new GenerativeConstructorElementZ(decoder); 570 return new GenerativeConstructorElementZ(decoder);
519 case SerializedElementKind.FACTORY_CONSTRUCTOR: 571 case SerializedElementKind.FACTORY_CONSTRUCTOR:
520 return new FactoryConstructorElementZ(decoder); 572 return new FactoryConstructorElementZ(decoder);
(...skipping 26 matching lines...) Expand all
547 case SerializedElementKind.IMPORT: 599 case SerializedElementKind.IMPORT:
548 return new ImportElementZ(decoder); 600 return new ImportElementZ(decoder);
549 case SerializedElementKind.EXPORT: 601 case SerializedElementKind.EXPORT:
550 return new ExportElementZ(decoder); 602 return new ExportElementZ(decoder);
551 case SerializedElementKind.PREFIX: 603 case SerializedElementKind.PREFIX:
552 return new PrefixElementZ(decoder); 604 return new PrefixElementZ(decoder);
553 } 605 }
554 throw new UnsupportedError("Unexpected element kind '${elementKind}."); 606 throw new UnsupportedError("Unexpected element kind '${elementKind}.");
555 } 607 }
556 } 608 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/native/enqueue.dart ('k') | pkg/compiler/lib/src/serialization/keys.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698