| 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 CompilationUnitElement compilationUnit = element.compilationUnit; | 373 CompilationUnitElement compilationUnit = element.compilationUnit; |
| 374 DiagnosticReporter reporter = parsing.reporter; | 374 DiagnosticReporter reporter = parsing.reporter; |
| 375 Uri uri = objectDecoder.getUri(Key.URI); | 375 Uri uri = objectDecoder.getUri(Key.URI); |
| 376 | 376 |
| 377 /// Returns the first [Token] for parsing the [Node] for [element]. | 377 /// Returns the first [Token] for parsing the [Node] for [element]. |
| 378 Token readBeginToken() { | 378 Token readBeginToken() { |
| 379 int charOffset = objectDecoder.getInt(Key.OFFSET); | 379 int charOffset = objectDecoder.getInt(Key.OFFSET); |
| 380 Token beginToken = getBeginToken(uri, charOffset); | 380 Token beginToken = getBeginToken(uri, charOffset); |
| 381 if (beginToken == null) { | 381 if (beginToken == null) { |
| 382 reporter.internalError( | 382 reporter.internalError( |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 473 VariableDefinitions indexDefinition = | 473 VariableDefinitions indexDefinition = |
| 474 builder.initializingFormal('index'); | 474 builder.initializingFormal('index'); |
| 475 FunctionExpression constructorNode = builder.functionExpression( | 475 FunctionExpression constructorNode = builder.functionExpression( |
| 476 builder.modifiers(isConst: true), | 476 builder.modifiers(isConst: true), |
| 477 element.enclosingClass.name, | 477 element.enclosingClass.name, |
| 478 null, | 478 null, |
| 479 builder.argumentList([indexDefinition]), | 479 builder.argumentList([indexDefinition]), |
| 480 builder.emptyStatement()); | 480 builder.emptyStatement()); |
| 481 return constructorNode; | 481 return constructorNode; |
| 482 case AstKind.ENUM_CONSTANT: | 482 case AstKind.ENUM_CONSTANT: |
| 483 EnumConstantElement enumConstant = element; | 483 EnumConstantElementZ enumConstant = element; |
| 484 EnumClassElement enumClass = element.enclosingClass; | 484 EnumClassElement enumClass = element.enclosingClass; |
| 485 int index = enumConstant.index; | 485 int index = enumConstant.index; |
| 486 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); | 486 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); |
| 487 Identifier name = builder.identifier(element.name); | 487 Identifier name = builder.identifier(element.name); |
| 488 | 488 |
| 489 Expression initializer = builder.newExpression( | 489 Expression initializer = builder.newExpression( |
| 490 enumClass.name, builder.argumentList([builder.literalInt(index)]), | 490 enumClass.name, builder.argumentList([builder.literalInt(index)]), |
| 491 isConst: true); | 491 isConst: true); |
| 492 SendSet definition = builder.createDefinition(name, initializer); | 492 SendSet definition = builder.createDefinition(name, initializer); |
| 493 | 493 |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 653 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); | 653 elements.registerTargetLabel(node, labelDefinitions[targetLabelId]); |
| 654 } | 654 } |
| 655 ObjectDecoder nativeDataDecoder = | 655 ObjectDecoder nativeDataDecoder = |
| 656 objectDecoder.getObject(Key.NATIVE, isOptional: true); | 656 objectDecoder.getObject(Key.NATIVE, isOptional: true); |
| 657 if (nativeDataDecoder != null) { | 657 if (nativeDataDecoder != null) { |
| 658 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); | 658 var nativeData = nativeDataDeserializer.onData(nativeDataDecoder); |
| 659 if (nativeData != null) { | 659 if (nativeData != null) { |
| 660 elements.registerNativeData(node, nativeData); | 660 elements.registerNativeData(node, nativeData); |
| 661 } | 661 } |
| 662 } | 662 } |
| 663 FunctionElement function = | 663 LocalFunctionElementZ function = |
| 664 objectDecoder.getElement(Key.FUNCTION, isOptional: true); | 664 objectDecoder.getElement(Key.FUNCTION, isOptional: true); |
| 665 if (function != null) { | 665 if (function != null) { |
| 666 FunctionExpression functionExpression = node; | 666 FunctionExpression functionExpression = node; |
| 667 assert(invariant(function, !resolvedAstMap.containsKey(function), | 667 function.resolvedAst = new ParsedResolvedAst(function, |
| 668 message: "ResolvedAst has already been computed for $function.")); | |
| 669 resolvedAstMap[function] = new ParsedResolvedAst(function, | |
| 670 functionExpression, functionExpression.body, elements, uri); | 668 functionExpression, functionExpression.body, elements, uri); |
| 671 } | 669 } |
| 672 // TODO(johnniwinther): Remove these when inference doesn't need `.node` | 670 // TODO(johnniwinther): Remove these when inference doesn't need `.node` |
| 673 // and `.initializer` of [ParameterElement]s. | 671 // and `.initializer` of [ParameterElement]s. |
| 674 ParameterElementZ parameter = | 672 ParameterElementZ parameter = |
| 675 objectDecoder.getElement(PARAMETER_NODE, isOptional: true); | 673 objectDecoder.getElement(PARAMETER_NODE, isOptional: true); |
| 676 if (parameter != null) { | 674 if (parameter != null) { |
| 677 parameter.node = node; | 675 parameter.node = node; |
| 678 } | 676 } |
| 679 parameter = | 677 parameter = |
| 680 objectDecoder.getElement(PARAMETER_INITIALIZER, isOptional: true); | 678 objectDecoder.getElement(PARAMETER_INITIALIZER, isOptional: true); |
| 681 if (parameter != null) { | 679 if (parameter != null) { |
| 682 parameter.initializer = node; | 680 parameter.initializer = node; |
| 683 } | 681 } |
| 684 } | 682 } |
| 685 } | 683 } |
| 686 assert(invariant(element, !resolvedAstMap.containsKey(element), | 684 element.resolvedAst = |
| 687 message: "ResolvedAst has already been computed for $element.")); | |
| 688 resolvedAstMap[element] = | |
| 689 new ParsedResolvedAst(element, root, body, elements, uri); | 685 new ParsedResolvedAst(element, root, body, elements, uri); |
| 690 } | 686 } |
| 691 } | 687 } |
| 692 | 688 |
| 693 const Key PARAMETER_NODE = const Key('parameter.node'); | 689 const Key PARAMETER_NODE = const Key('parameter.node'); |
| 694 const Key PARAMETER_INITIALIZER = const Key('parameter.initializer'); | 690 const Key PARAMETER_INITIALIZER = const Key('parameter.initializer'); |
| OLD | NEW |