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 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
287 | 287 |
288 @override | 288 @override |
289 visitLabel(Label node) { | 289 visitLabel(Label node) { |
290 visitNode(node); | 290 visitNode(node); |
291 LabelDefinition labelDefinition = elements.getLabelDefinition(node); | 291 LabelDefinition labelDefinition = elements.getLabelDefinition(node); |
292 if (labelDefinition != null) { | 292 if (labelDefinition != null) { |
293 getNodeDataEncoder(node) | 293 getNodeDataEncoder(node) |
294 .setInt(Key.LABEL_DEFINITION, getLabelDefinitionId(labelDefinition)); | 294 .setInt(Key.LABEL_DEFINITION, getLabelDefinitionId(labelDefinition)); |
295 } | 295 } |
296 } | 296 } |
297 | |
298 @override | |
299 visitFunctionExpression(FunctionExpression node) { | |
300 visitExpression(node); | |
301 Element function = elements.getFunctionDefinition(node); | |
302 if (function != null && function.isFunction && function.isLocal) { | |
303 // Mark root nodes of local functions; these need their own ResolvedAst. | |
304 getNodeDataEncoder(node).setElement(Key.FUNCTION, function); | |
305 } | |
306 } | |
297 } | 307 } |
298 | 308 |
299 class ResolvedAstDeserializer { | 309 class ResolvedAstDeserializer { |
300 /// Find the [Token] at [offset] searching through successors of [token]. | 310 /// Find the [Token] at [offset] searching through successors of [token]. |
301 static Token findTokenInStream(Token token, int offset) { | 311 static Token findTokenInStream(Token token, int offset) { |
302 while (token.charOffset <= offset && token.next != token) { | 312 while (token.charOffset <= offset && token.next != token) { |
303 if (token.charOffset == offset) { | 313 if (token.charOffset == offset) { |
304 return token; | 314 return token; |
305 } | 315 } |
306 token = token.next; | 316 token = token.next; |
307 } | 317 } |
308 return null; | 318 return null; |
309 } | 319 } |
310 | 320 |
311 /// Deserializes the [ResolvedAst] for [element] from [objectDecoder]. | 321 /// Deserializes the [ResolvedAst]s for [element] and its nested local |
322 /// functions from [objectDecoder] and adds these to [resolvedAstMap]. | |
312 /// [parsing] and [getBeginToken] are used for parsing the [Node] for | 323 /// [parsing] and [getBeginToken] are used for parsing the [Node] for |
313 /// [element] from its source code. | 324 /// [element] from its source code. |
314 static ResolvedAst deserialize( | 325 static void deserialize( |
315 Element element, | 326 Element element, |
316 ObjectDecoder objectDecoder, | 327 ObjectDecoder objectDecoder, |
317 ParsingContext parsing, | 328 ParsingContext parsing, |
318 Token getBeginToken(Uri uri, int charOffset), | 329 Token getBeginToken(Uri uri, int charOffset), |
319 DeserializerPlugin nativeDataDeserializer) { | 330 DeserializerPlugin nativeDataDeserializer, |
331 Map<Element, ResolvedAst> resolvedAstMap) { | |
320 ResolvedAstKind kind = | 332 ResolvedAstKind kind = |
321 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); | 333 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); |
322 switch (kind) { | 334 switch (kind) { |
323 case ResolvedAstKind.PARSED: | 335 case ResolvedAstKind.PARSED: |
324 return deserializeParsed(element, objectDecoder, parsing, getBeginToken, | 336 deserializeParsed(element, objectDecoder, parsing, getBeginToken, |
325 nativeDataDeserializer); | 337 nativeDataDeserializer, resolvedAstMap); |
338 break; | |
326 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: | 339 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: |
327 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: | 340 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: |
328 return new SynthesizedResolvedAst(element, kind); | 341 resolvedAstMap[element] = new SynthesizedResolvedAst(element, kind); |
342 break; | |
329 } | 343 } |
330 } | 344 } |
331 | 345 |
332 /// Deserialize a [ResolvedAst] that is defined in terms of an AST together | 346 /// Deserialize a [ResolvedAst] that is defined in terms of an AST together |
333 /// with [TreeElements]. | 347 /// with [TreeElements]. |
Siggi Cherem (dart-lang)
2016/05/02 16:21:43
let's update the comment to say that this deserial
Johnni Winther
2016/05/04 09:56:25
Done.
| |
334 static ResolvedAst deserializeParsed( | 348 static void deserializeParsed( |
335 Element element, | 349 Element element, |
336 ObjectDecoder objectDecoder, | 350 ObjectDecoder objectDecoder, |
337 ParsingContext parsing, | 351 ParsingContext parsing, |
338 Token getBeginToken(Uri uri, int charOffset), | 352 Token getBeginToken(Uri uri, int charOffset), |
339 DeserializerPlugin nativeDataDeserializer) { | 353 DeserializerPlugin nativeDataDeserializer, |
354 Map<Element, ResolvedAst> resolvedAstMap) { | |
340 CompilationUnitElement compilationUnit = element.compilationUnit; | 355 CompilationUnitElement compilationUnit = element.compilationUnit; |
341 DiagnosticReporter reporter = parsing.reporter; | 356 DiagnosticReporter reporter = parsing.reporter; |
342 | 357 |
343 /// Returns the first [Token] for parsing the [Node] for [element]. | 358 /// Returns the first [Token] for parsing the [Node] for [element]. |
344 Token readBeginToken() { | 359 Token readBeginToken() { |
345 Uri uri = objectDecoder.getUri(Key.URI); | 360 Uri uri = objectDecoder.getUri(Key.URI); |
346 int charOffset = objectDecoder.getInt(Key.OFFSET); | 361 int charOffset = objectDecoder.getInt(Key.OFFSET); |
347 Token beginToken = getBeginToken(uri, charOffset); | 362 Token beginToken = getBeginToken(uri, charOffset); |
348 if (beginToken == null) { | 363 if (beginToken == null) { |
349 reporter.internalError( | 364 reporter.internalError( |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
545 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) { | 560 jumpTargetLabels.forEach((JumpTargetX jumpTarget, List<int> labelIds) { |
546 if (labelIds.isEmpty) return; | 561 if (labelIds.isEmpty) return; |
547 LinkBuilder<LabelDefinition> linkBuilder = | 562 LinkBuilder<LabelDefinition> linkBuilder = |
548 new LinkBuilder<LabelDefinition>(); | 563 new LinkBuilder<LabelDefinition>(); |
549 for (int labelId in labelIds) { | 564 for (int labelId in labelIds) { |
550 linkBuilder.addLast(labelDefinitions[labelId]); | 565 linkBuilder.addLast(labelDefinitions[labelId]); |
551 } | 566 } |
552 jumpTarget.labels = linkBuilder.toLink(); | 567 jumpTarget.labels = linkBuilder.toLink(); |
553 }); | 568 }); |
554 | 569 |
555 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA); | 570 ListDecoder dataDecoder = objectDecoder.getList(Key.DATA, isOptional: true); |
556 if (dataDecoder != null) { | 571 if (dataDecoder != null) { |
557 for (int i = 0; i < dataDecoder.length; i++) { | 572 for (int i = 0; i < dataDecoder.length; i++) { |
558 ObjectDecoder objectDecoder = dataDecoder.getObject(i); | 573 ObjectDecoder objectDecoder = dataDecoder.getObject(i); |
559 int id = objectDecoder.getInt(Key.ID); | 574 int id = objectDecoder.getInt(Key.ID); |
560 Node node = nodeList[id]; | 575 Node node = nodeList[id]; |
561 Element nodeElement = deserializeElementReference( | 576 Element nodeElement = deserializeElementReference( |
562 element, Key.ELEMENT, Key.NAME, objectDecoder, | 577 element, Key.ELEMENT, Key.NAME, objectDecoder, |
563 isOptional: true); | 578 isOptional: true); |
564 if (nodeElement != null) { | 579 if (nodeElement != null) { |
565 elements[node] = nodeElement; | 580 elements[node] = nodeElement; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
616 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); | 631 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); |
617 } | 632 } |
618 ObjectDecoder nativeDataDecoder = | 633 ObjectDecoder nativeDataDecoder = |
619 objectDecoder.getObject(Key.NATIVE, isOptional: true); | 634 objectDecoder.getObject(Key.NATIVE, isOptional: true); |
620 if (nativeDataDecoder != null) { | 635 if (nativeDataDecoder != null) { |
621 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); | 636 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); |
622 if (nativeData != null) { | 637 if (nativeData != null) { |
623 elements.registerNativeData(node, nativeData); | 638 elements.registerNativeData(node, nativeData); |
624 } | 639 } |
625 } | 640 } |
641 FunctionElement function = | |
642 objectDecoder.getElement(Key.FUNCTION, isOptional: true); | |
643 if (function != null) { | |
644 FunctionExpression functionExpression = node; | |
645 resolvedAstMap[function] = new ParsedResolvedAst( | |
Siggi Cherem (dart-lang)
2016/05/02 16:21:43
do we need to assert that the key doesn't exist al
Johnni Winther
2016/05/04 09:56:25
Invariant test added!
| |
646 function, functionExpression, functionExpression.body, elements); | |
647 } | |
626 } | 648 } |
627 } | 649 } |
628 return new ParsedResolvedAst(element, root, body, elements); | 650 resolvedAstMap[element] = |
651 new ParsedResolvedAst(element, root, body, elements); | |
629 } | 652 } |
630 } | 653 } |
OLD | NEW |