OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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.resolved_ast; | 5 library dart2js.serialization.resolved_ast; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/resolution.dart'; | 8 import '../common/resolution.dart'; |
9 import '../constants/expressions.dart'; | 9 import '../constants/expressions.dart'; |
10 import '../dart_types.dart'; | 10 import '../dart_types.dart'; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 ENUM_INDEX_FIELD, | 49 ENUM_INDEX_FIELD, |
50 ENUM_VALUES_FIELD, | 50 ENUM_VALUES_FIELD, |
51 ENUM_TO_STRING, | 51 ENUM_TO_STRING, |
52 FACTORY, | 52 FACTORY, |
53 FIELD, | 53 FIELD, |
54 FUNCTION, | 54 FUNCTION, |
55 } | 55 } |
56 | 56 |
57 /// Serializer for [ResolvedAst]s. | 57 /// Serializer for [ResolvedAst]s. |
58 class ResolvedAstSerializer extends Visitor { | 58 class ResolvedAstSerializer extends Visitor { |
| 59 final SerializerPlugin nativeDataSerializer; |
59 final ObjectEncoder objectEncoder; | 60 final ObjectEncoder objectEncoder; |
60 final ResolvedAst resolvedAst; | 61 final ResolvedAst resolvedAst; |
61 final AstIndexComputer indexComputer = new AstIndexComputer(); | 62 final AstIndexComputer indexComputer = new AstIndexComputer(); |
62 final Map<int, ObjectEncoder> nodeData = <int, ObjectEncoder>{}; | 63 final Map<int, ObjectEncoder> nodeData = <int, ObjectEncoder>{}; |
63 ListEncoder _nodeDataEncoder; | 64 ListEncoder _nodeDataEncoder; |
64 | 65 |
65 ResolvedAstSerializer(this.objectEncoder, this.resolvedAst); | 66 ResolvedAstSerializer( |
| 67 this.objectEncoder, this.resolvedAst, this.nativeDataSerializer); |
66 | 68 |
67 AstElement get element => resolvedAst.element; | 69 AstElement get element => resolvedAst.element; |
68 | 70 |
69 TreeElements get elements => resolvedAst.elements; | 71 TreeElements get elements => resolvedAst.elements; |
70 | 72 |
71 Node get root => resolvedAst.node; | 73 Node get root => resolvedAst.node; |
72 | 74 |
73 Map<Node, int> get nodeIndices => indexComputer.nodeIndices; | 75 Map<Node, int> get nodeIndices => indexComputer.nodeIndices; |
74 List<Node> get nodeList => indexComputer.nodeList; | 76 List<Node> get nodeList => indexComputer.nodeList; |
75 | 77 |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 } | 234 } |
233 DartType cachedType = elements.typesCache[node]; | 235 DartType cachedType = elements.typesCache[node]; |
234 if (cachedType != null) { | 236 if (cachedType != null) { |
235 getNodeDataEncoder(node).setType(Key.CACHED_TYPE, cachedType); | 237 getNodeDataEncoder(node).setType(Key.CACHED_TYPE, cachedType); |
236 } | 238 } |
237 JumpTarget jumpTargetDefinition = elements.getTargetDefinition(node); | 239 JumpTarget jumpTargetDefinition = elements.getTargetDefinition(node); |
238 if (jumpTargetDefinition != null) { | 240 if (jumpTargetDefinition != null) { |
239 getNodeDataEncoder(node).setInt( | 241 getNodeDataEncoder(node).setInt( |
240 Key.JUMP_TARGET_DEFINITION, getJumpTargetId(jumpTargetDefinition)); | 242 Key.JUMP_TARGET_DEFINITION, getJumpTargetId(jumpTargetDefinition)); |
241 } | 243 } |
| 244 var nativeData = elements.getNativeData(node); |
| 245 if (nativeData != null) { |
| 246 nativeDataSerializer.onData( |
| 247 nativeData, getNodeDataEncoder(node).createObject(Key.NATIVE)); |
| 248 } |
242 node.visitChildren(this); | 249 node.visitChildren(this); |
243 } | 250 } |
244 | 251 |
245 @override | 252 @override |
246 visitSend(Send node) { | 253 visitSend(Send node) { |
247 visitExpression(node); | 254 visitExpression(node); |
248 SendStructure structure = elements.getSendStructure(node); | 255 SendStructure structure = elements.getSendStructure(node); |
249 if (structure != null) { | 256 if (structure != null) { |
250 serializeSendStructure( | 257 serializeSendStructure( |
251 structure, getNodeDataEncoder(node).createObject(Key.SEND_STRUCTURE)); | 258 structure, getNodeDataEncoder(node).createObject(Key.SEND_STRUCTURE)); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 return token; | 305 return token; |
299 } | 306 } |
300 token = token.next; | 307 token = token.next; |
301 } | 308 } |
302 return null; | 309 return null; |
303 } | 310 } |
304 | 311 |
305 /// Deserializes the [ResolvedAst] for [element] from [objectDecoder]. | 312 /// Deserializes the [ResolvedAst] for [element] from [objectDecoder]. |
306 /// [parsing] and [getBeginToken] are used for parsing the [Node] for | 313 /// [parsing] and [getBeginToken] are used for parsing the [Node] for |
307 /// [element] from its source code. | 314 /// [element] from its source code. |
308 static ResolvedAst deserialize(Element element, ObjectDecoder objectDecoder, | 315 static ResolvedAst deserialize( |
309 ParsingContext parsing, Token getBeginToken(Uri uri, int charOffset)) { | 316 Element element, |
| 317 ObjectDecoder objectDecoder, |
| 318 ParsingContext parsing, |
| 319 Token getBeginToken(Uri uri, int charOffset), |
| 320 DeserializerPlugin nativeDataDeserializer) { |
310 ResolvedAstKind kind = | 321 ResolvedAstKind kind = |
311 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); | 322 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); |
312 switch (kind) { | 323 switch (kind) { |
313 case ResolvedAstKind.PARSED: | 324 case ResolvedAstKind.PARSED: |
314 return deserializeParsed( | 325 return deserializeParsed(element, objectDecoder, parsing, getBeginToken, |
315 element, objectDecoder, parsing, getBeginToken); | 326 nativeDataDeserializer); |
316 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: | 327 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: |
317 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: | 328 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: |
318 return new SynthesizedResolvedAst(element, kind); | 329 return new SynthesizedResolvedAst(element, kind); |
319 } | 330 } |
320 } | 331 } |
321 | 332 |
322 /// Deserialize a [ResolvedAst] that is defined in terms of an AST together | 333 /// Deserialize a [ResolvedAst] that is defined in terms of an AST together |
323 /// with [TreeElements]. | 334 /// with [TreeElements]. |
324 static ResolvedAst deserializeParsed( | 335 static ResolvedAst deserializeParsed( |
325 Element element, | 336 Element element, |
326 ObjectDecoder objectDecoder, | 337 ObjectDecoder objectDecoder, |
327 ParsingContext parsing, | 338 ParsingContext parsing, |
328 Token getBeginToken(Uri uri, int charOffset)) { | 339 Token getBeginToken(Uri uri, int charOffset), |
| 340 DeserializerPlugin nativeDataDeserializer) { |
329 CompilationUnitElement compilationUnit = element.compilationUnit; | 341 CompilationUnitElement compilationUnit = element.compilationUnit; |
330 DiagnosticReporter reporter = parsing.reporter; | 342 DiagnosticReporter reporter = parsing.reporter; |
331 | 343 |
332 /// Returns the first [Token] for parsing the [Node] for [element]. | 344 /// Returns the first [Token] for parsing the [Node] for [element]. |
333 Token readBeginToken() { | 345 Token readBeginToken() { |
334 Uri uri = objectDecoder.getUri(Key.URI); | 346 Uri uri = objectDecoder.getUri(Key.URI); |
335 int charOffset = objectDecoder.getInt(Key.OFFSET); | 347 int charOffset = objectDecoder.getInt(Key.OFFSET); |
336 Token beginToken = getBeginToken(uri, charOffset); | 348 Token beginToken = getBeginToken(uri, charOffset); |
337 if (beginToken == null) { | 349 if (beginToken == null) { |
338 reporter.internalError( | 350 reporter.internalError( |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 int labelDefinitionId = | 605 int labelDefinitionId = |
594 objectDecoder.getInt(Key.LABEL_DEFINITION, isOptional: true); | 606 objectDecoder.getInt(Key.LABEL_DEFINITION, isOptional: true); |
595 if (labelDefinitionId != null) { | 607 if (labelDefinitionId != null) { |
596 elements.defineLabel(node, labelDefinitions[labelDefinitionId]); | 608 elements.defineLabel(node, labelDefinitions[labelDefinitionId]); |
597 } | 609 } |
598 int targetLabelId = | 610 int targetLabelId = |
599 objectDecoder.getInt(Key.TARGET_LABEL, isOptional: true); | 611 objectDecoder.getInt(Key.TARGET_LABEL, isOptional: true); |
600 if (targetLabelId != null) { | 612 if (targetLabelId != null) { |
601 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); | 613 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); |
602 } | 614 } |
| 615 ObjectDecoder nativeDataDecoder = |
| 616 objectDecoder.getObject(Key.NATIVE, isOptional: true); |
| 617 if (nativeDataDecoder != null) { |
| 618 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); |
| 619 if (nativeData != null) { |
| 620 elements.registerNativeData(node, nativeData); |
| 621 } |
| 622 } |
603 } | 623 } |
604 } | 624 } |
605 return new ParsedResolvedAst(element, root, body, elements); | 625 return new ParsedResolvedAst(element, root, body, elements); |
606 } | 626 } |
607 } | 627 } |
OLD | NEW |