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'; |
11 import '../diagnostics/diagnostic_listener.dart'; | 11 import '../diagnostics/diagnostic_listener.dart'; |
12 import '../elements/elements.dart'; | 12 import '../elements/elements.dart'; |
13 import '../elements/modelx.dart'; | 13 import '../elements/modelx.dart'; |
14 import '../parser/listener.dart' show ParserError; | 14 import '../parser/listener.dart' show ParserError; |
15 import '../parser/node_listener.dart' show NodeListener; | 15 import '../parser/node_listener.dart' show NodeListener; |
16 import '../parser/parser.dart' show Parser; | 16 import '../parser/parser.dart' show Parser; |
17 import '../resolution/enum_creator.dart'; | 17 import '../resolution/enum_creator.dart'; |
18 import '../resolution/send_structure.dart'; | 18 import '../resolution/send_structure.dart'; |
19 import '../resolution/tree_elements.dart'; | 19 import '../resolution/tree_elements.dart'; |
20 import '../tokens/token.dart'; | 20 import '../tokens/token.dart'; |
21 import '../tree/tree.dart'; | 21 import '../tree/tree.dart'; |
22 import '../universe/selector.dart'; | 22 import '../universe/selector.dart'; |
23 import '../util/util.dart'; | 23 import '../util/util.dart'; |
24 import 'keys.dart'; | 24 import 'keys.dart'; |
25 import 'modelz.dart'; | 25 import 'modelz.dart'; |
26 import 'serialization.dart'; | 26 import 'serialization.dart'; |
27 import 'serialization_util.dart'; | 27 import 'serialization_util.dart'; |
28 import 'modelz.dart'; | |
28 | 29 |
29 /// Visitor that computes a node-index mapping. | 30 /// Visitor that computes a node-index mapping. |
30 class AstIndexComputer extends Visitor { | 31 class AstIndexComputer extends Visitor { |
31 final Map<Node, int> nodeIndices = <Node, int>{}; | 32 final Map<Node, int> nodeIndices = <Node, int>{}; |
32 final List<Node> nodeList = <Node>[]; | 33 final List<Node> nodeList = <Node>[]; |
33 | 34 |
34 @override | 35 @override |
35 visitNode(Node node) { | 36 visitNode(Node node) { |
36 nodeIndices.putIfAbsent(node, () { | 37 nodeIndices.putIfAbsent(node, () { |
37 // Some nodes (like Modifier and empty NodeList) can be reused. | 38 // Some nodes (like Modifier and empty NodeList) can be reused. |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
337 | 338 |
338 /// Deserializes the [ResolvedAst]s for [element] and its nested local | 339 /// Deserializes the [ResolvedAst]s for [element] and its nested local |
339 /// functions from [objectDecoder] and adds these to [resolvedAstMap]. | 340 /// functions from [objectDecoder] and adds these to [resolvedAstMap]. |
340 /// [parsing] and [getBeginToken] are used for parsing the [Node] for | 341 /// [parsing] and [getBeginToken] are used for parsing the [Node] for |
341 /// [element] from its source code. | 342 /// [element] from its source code. |
342 static void deserialize( | 343 static void deserialize( |
343 Element element, | 344 Element element, |
344 ObjectDecoder objectDecoder, | 345 ObjectDecoder objectDecoder, |
345 ParsingContext parsing, | 346 ParsingContext parsing, |
346 Token getBeginToken(Uri uri, int charOffset), | 347 Token getBeginToken(Uri uri, int charOffset), |
347 DeserializerPlugin nativeDataDeserializer, | 348 DeserializerPlugin nativeDataDeserializer) { |
348 Map<Element, ResolvedAst> resolvedAstMap) { | |
349 ResolvedAstKind kind = | 349 ResolvedAstKind kind = |
350 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); | 350 objectDecoder.getEnum(Key.KIND, ResolvedAstKind.values); |
351 switch (kind) { | 351 switch (kind) { |
352 case ResolvedAstKind.PARSED: | 352 case ResolvedAstKind.PARSED: |
353 deserializeParsed(element, objectDecoder, parsing, getBeginToken, | 353 deserializeParsed(element, objectDecoder, parsing, getBeginToken, |
354 nativeDataDeserializer, resolvedAstMap); | 354 nativeDataDeserializer); |
355 break; | 355 break; |
356 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: | 356 case ResolvedAstKind.DEFAULT_CONSTRUCTOR: |
357 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: | 357 case ResolvedAstKind.FORWARDING_CONSTRUCTOR: |
358 resolvedAstMap[element] = new SynthesizedResolvedAst(element, kind); | 358 (element as AstElementMixinZ).resolvedAst = |
359 new SynthesizedResolvedAst(element, kind); | |
359 break; | 360 break; |
360 } | 361 } |
361 } | 362 } |
362 | 363 |
363 /// Deserialize the [ResolvedAst]s for the member [element] (constructor, | 364 /// Deserialize the [ResolvedAst]s for the member [element] (constructor, |
364 /// method, or field) and its nested closures. The [ResolvedAst]s are added | 365 /// method, or field) and its nested closures. The [ResolvedAst]s are added |
365 /// to [resolvedAstMap]. | 366 /// to [resolvedAstMap]. |
366 static void deserializeParsed( | 367 static void deserializeParsed( |
367 Element element, | 368 AstElementMixinZ element, |
368 ObjectDecoder objectDecoder, | 369 ObjectDecoder objectDecoder, |
369 ParsingContext parsing, | 370 ParsingContext parsing, |
370 Token getBeginToken(Uri uri, int charOffset), | 371 Token getBeginToken(Uri uri, int charOffset), |
371 DeserializerPlugin nativeDataDeserializer, | 372 DeserializerPlugin nativeDataDeserializer/*, |
372 Map<Element, ResolvedAst> resolvedAstMap) { | 373 Map<Element, ResolvedAst> resolvedAstMap*/) { |
Siggi Cherem (dart-lang)
2016/05/13 19:43:51
delete?
Johnni Winther
2016/05/17 11:59:51
Done.
| |
373 CompilationUnitElement compilationUnit = element.compilationUnit; | 374 CompilationUnitElement compilationUnit = element.compilationUnit; |
374 DiagnosticReporter reporter = parsing.reporter; | 375 DiagnosticReporter reporter = parsing.reporter; |
375 Uri uri = objectDecoder.getUri(Key.URI); | 376 Uri uri = objectDecoder.getUri(Key.URI); |
376 | 377 |
377 /// Returns the first [Token] for parsing the [Node] for [element]. | 378 /// Returns the first [Token] for parsing the [Node] for [element]. |
378 Token readBeginToken() { | 379 Token readBeginToken() { |
379 int charOffset = objectDecoder.getInt(Key.OFFSET); | 380 int charOffset = objectDecoder.getInt(Key.OFFSET); |
380 Token beginToken = getBeginToken(uri, charOffset); | 381 Token beginToken = getBeginToken(uri, charOffset); |
381 if (beginToken == null) { | 382 if (beginToken == null) { |
382 reporter.internalError( | 383 reporter.internalError( |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
473 VariableDefinitions indexDefinition = | 474 VariableDefinitions indexDefinition = |
474 builder.initializingFormal('index'); | 475 builder.initializingFormal('index'); |
475 FunctionExpression constructorNode = builder.functionExpression( | 476 FunctionExpression constructorNode = builder.functionExpression( |
476 builder.modifiers(isConst: true), | 477 builder.modifiers(isConst: true), |
477 element.enclosingClass.name, | 478 element.enclosingClass.name, |
478 null, | 479 null, |
479 builder.argumentList([indexDefinition]), | 480 builder.argumentList([indexDefinition]), |
480 builder.emptyStatement()); | 481 builder.emptyStatement()); |
481 return constructorNode; | 482 return constructorNode; |
482 case AstKind.ENUM_CONSTANT: | 483 case AstKind.ENUM_CONSTANT: |
483 EnumConstantElement enumConstant = element; | 484 EnumConstantElementZ enumConstant = element; |
484 EnumClassElement enumClass = element.enclosingClass; | 485 EnumClassElement enumClass = element.enclosingClass; |
485 int index = enumConstant.index; | 486 int index = enumConstant.index; |
486 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); | 487 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); |
487 Identifier name = builder.identifier(element.name); | 488 Identifier name = builder.identifier(element.name); |
488 | 489 |
489 Expression initializer = builder.newExpression( | 490 Expression initializer = builder.newExpression( |
490 enumClass.name, builder.argumentList([builder.literalInt(index)]), | 491 enumClass.name, builder.argumentList([builder.literalInt(index)]), |
491 isConst: true); | 492 isConst: true); |
492 SendSet definition = builder.createDefinition(name, initializer); | 493 SendSet definition = builder.createDefinition(name, initializer); |
493 | 494 |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
653 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); | 654 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); |
654 } | 655 } |
655 ObjectDecoder nativeDataDecoder = | 656 ObjectDecoder nativeDataDecoder = |
656 objectDecoder.getObject(Key.NATIVE, isOptional: true); | 657 objectDecoder.getObject(Key.NATIVE, isOptional: true); |
657 if (nativeDataDecoder != null) { | 658 if (nativeDataDecoder != null) { |
658 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); | 659 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); |
659 if (nativeData != null) { | 660 if (nativeData != null) { |
660 elements.registerNativeData(node, nativeData); | 661 elements.registerNativeData(node, nativeData); |
661 } | 662 } |
662 } | 663 } |
663 FunctionElement function = | 664 LocalFunctionElementZ function = |
664 objectDecoder.getElement(Key.FUNCTION, isOptional: true); | 665 objectDecoder.getElement(Key.FUNCTION, isOptional: true); |
665 if (function != null) { | 666 if (function != null) { |
666 FunctionExpression functionExpression = node; | 667 FunctionExpression functionExpression = node; |
667 assert(invariant(function, !resolvedAstMap.containsKey(function), | 668 function.resolvedAst |
668 message: "ResolvedAst has already been computed for $function.")); | 669 = new ParsedResolvedAst(function, functionExpression, |
Siggi Cherem (dart-lang)
2016/05/13 19:43:51
nit: dartfmt
Johnni Winther
2016/05/17 11:59:51
Done.
| |
669 resolvedAstMap[function] = new ParsedResolvedAst(function, | 670 functionExpression.body, elements, uri); |
670 functionExpression, functionExpression.body, elements, uri); | |
671 } | 671 } |
672 // TODO(johnniwinther): Remove these when inference doesn't need `.node` | 672 // TODO(johnniwinther): Remove these when inference doesn't need `.node` |
673 // and `.initializer` of [ParameterElement]s. | 673 // and `.initializer` of [ParameterElement]s. |
674 ParameterElementZ parameter = | 674 ParameterElementZ parameter = |
675 objectDecoder.getElement(PARAMETER_NODE, isOptional: true); | 675 objectDecoder.getElement(PARAMETER_NODE, isOptional: true); |
676 if (parameter != null) { | 676 if (parameter != null) { |
677 parameter.node = node; | 677 parameter.node = node; |
678 } | 678 } |
679 parameter = | 679 parameter = |
680 objectDecoder.getElement(PARAMETER_INITIALIZER, isOptional: true); | 680 objectDecoder.getElement(PARAMETER_INITIALIZER, isOptional: true); |
681 if (parameter != null) { | 681 if (parameter != null) { |
682 parameter.initializer = node; | 682 parameter.initializer = node; |
683 } | 683 } |
684 } | 684 } |
685 } | 685 } |
686 assert(invariant(element, !resolvedAstMap.containsKey(element), | 686 (element as AstElementMixinZ).resolvedAst |
Siggi Cherem (dart-lang)
2016/05/13 19:43:51
it seems like the cast here is not necessary (elem
Johnni Winther
2016/05/17 11:59:51
Done.
| |
687 message: "ResolvedAst has already been computed for $element.")); | 687 = new ParsedResolvedAst(element, root, body, elements, uri); |
688 resolvedAstMap[element] = | |
689 new ParsedResolvedAst(element, root, body, elements, uri); | |
690 } | 688 } |
691 } | 689 } |
692 | 690 |
693 const Key PARAMETER_NODE = const Key('parameter.node'); | 691 const Key PARAMETER_NODE = const Key('parameter.node'); |
694 const Key PARAMETER_INITIALIZER = const Key('parameter.initializer'); | 692 const Key PARAMETER_INITIALIZER = const Key('parameter.initializer'); |
OLD | NEW |