| 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 |