Chromium Code Reviews| 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 |