| 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 '../elements/resolution_types.dart'; | 10 import '../elements/resolution_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'; | |
| 24 import 'keys.dart'; | 23 import 'keys.dart'; |
| 25 import 'modelz.dart'; | 24 import 'modelz.dart'; |
| 26 import 'serialization.dart'; | 25 import 'serialization.dart'; |
| 27 import 'serialization_util.dart'; | 26 import 'serialization_util.dart'; |
| 28 | 27 |
| 29 /// Visitor that computes a node-index mapping. | 28 /// Visitor that computes a node-index mapping. |
| 30 class AstIndexComputer extends Visitor { | 29 class AstIndexComputer extends Visitor { |
| 31 final Map<Node, int> nodeIndices = <Node, int>{}; | 30 final Map<Node, int> nodeIndices = <Node, int>{}; |
| 32 final List<Node> nodeList = <Node>[]; | 31 final List<Node> nodeList = <Node>[]; |
| 33 | 32 |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 | 366 |
| 368 /// Deserialize the [ResolvedAst]s for the member [element] (constructor, | 367 /// Deserialize the [ResolvedAst]s for the member [element] (constructor, |
| 369 /// method, or field) and its nested closures. The [ResolvedAst]s are added | 368 /// method, or field) and its nested closures. The [ResolvedAst]s are added |
| 370 /// to [resolvedAstMap]. | 369 /// to [resolvedAstMap]. |
| 371 static void deserializeParsed( | 370 static void deserializeParsed( |
| 372 AstElementMixinZ element, | 371 AstElementMixinZ element, |
| 373 ObjectDecoder objectDecoder, | 372 ObjectDecoder objectDecoder, |
| 374 ParsingContext parsing, | 373 ParsingContext parsing, |
| 375 Token getBeginToken(Uri uri, int charOffset), | 374 Token getBeginToken(Uri uri, int charOffset), |
| 376 DeserializerPlugin nativeDataDeserializer) { | 375 DeserializerPlugin nativeDataDeserializer) { |
| 377 CompilationUnitElement compilationUnit = element.compilationUnit; | |
| 378 DiagnosticReporter reporter = parsing.reporter; | 376 DiagnosticReporter reporter = parsing.reporter; |
| 379 Uri uri = objectDecoder.getUri(Key.URI); | 377 Uri uri = objectDecoder.getUri(Key.URI); |
| 380 | 378 |
| 381 /// Returns the first [Token] for parsing the [Node] for [element]. | 379 /// Returns the first [Token] for parsing the [Node] for [element]. |
| 382 Token readBeginToken() { | 380 Token readBeginToken() { |
| 383 int charOffset = objectDecoder.getInt(Key.OFFSET); | 381 int charOffset = objectDecoder.getInt(Key.OFFSET); |
| 384 Token beginToken = getBeginToken(uri, charOffset); | 382 Token beginToken = getBeginToken(uri, charOffset); |
| 385 if (beginToken == null) { | 383 if (beginToken == null) { |
| 386 // TODO(johnniwinther): Handle unfound tokens by adding an erronous | 384 // TODO(johnniwinther): Handle unfound tokens by adding an erronous |
| 387 // resolved ast kind. | 385 // resolved ast kind. |
| 388 reporter.internalError( | 386 reporter.internalError( |
| 389 element, "No token found for $element in $uri @ $charOffset"); | 387 element, "No token found for $element in $uri @ $charOffset"); |
| 390 } | 388 } |
| 391 return beginToken; | 389 return beginToken; |
| 392 } | 390 } |
| 393 | 391 |
| 394 /// Create the [Node] for the element by parsing the source code. | 392 /// Create the [Node] for the element by parsing the source code. |
| 395 Node doParse(parse(Parser parser)) { | 393 Node doParse(parse(Parser parser)) { |
| 396 return parsing.measure(() { | 394 return parsing.measure(() { |
| 397 return reporter.withCurrentElement(element, () { | 395 return reporter.withCurrentElement(element, () { |
| 398 CompilationUnitElement unit = element.compilationUnit; | |
| 399 NodeListener listener = new NodeListener( | 396 NodeListener listener = new NodeListener( |
| 400 parsing.getScannerOptionsFor(element), reporter, null); | 397 parsing.getScannerOptionsFor(element), reporter, null); |
| 401 listener.memberErrors = listener.memberErrors.prepend(false); | 398 listener.memberErrors = listener.memberErrors.prepend(false); |
| 402 try { | 399 try { |
| 403 Parser parser = new Parser(listener); | 400 Parser parser = new Parser(listener); |
| 404 parse(parser); | 401 parse(parser); |
| 405 } on ParserError catch (e) { | 402 } on ParserError catch (e) { |
| 406 reporter.internalError(element, '$e'); | 403 reporter.internalError(element, '$e'); |
| 407 } | 404 } |
| 408 return listener.popNode(); | 405 return listener.popNode(); |
| 409 }); | 406 }); |
| 410 }); | 407 }); |
| 411 } | 408 } |
| 412 | 409 |
| 413 /// Computes the [Node] for the element based on the [AstKind]. | 410 /// Computes the [Node] for the element based on the [AstKind]. |
| 414 Node computeNode(AstKind kind) { | 411 Node computeNode(AstKind kind) { |
| 415 switch (kind) { | 412 switch (kind) { |
| 416 case AstKind.ENUM_INDEX_FIELD: | 413 case AstKind.ENUM_INDEX_FIELD: |
| 417 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); | 414 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); |
| 418 Identifier identifier = builder.identifier('index'); | 415 Identifier identifier = builder.identifier('index'); |
| 419 VariableDefinitions node = new VariableDefinitions( | 416 VariableDefinitions node = new VariableDefinitions( |
| 420 null, | 417 null, |
| 421 builder.modifiers(isFinal: true), | 418 builder.modifiers(isFinal: true), |
| 422 new NodeList.singleton(identifier)); | 419 new NodeList.singleton(identifier)); |
| 423 return node; | 420 return node; |
| 424 case AstKind.ENUM_VALUES_FIELD: | 421 case AstKind.ENUM_VALUES_FIELD: |
| 425 EnumClassElement enumClass = element.enclosingClass; | 422 EnumClassElement enumClass = element.enclosingClass; |
| 426 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); | 423 AstBuilder builder = new AstBuilder(element.sourcePosition.begin); |
| 427 List<FieldElement> enumValues = <FieldElement>[]; | |
| 428 List<Node> valueReferences = <Node>[]; | 424 List<Node> valueReferences = <Node>[]; |
| 429 for (EnumConstantElement enumConstant in enumClass.enumValues) { | 425 for (EnumConstantElement enumConstant in enumClass.enumValues) { |
| 430 AstBuilder valueBuilder = | 426 AstBuilder valueBuilder = |
| 431 new AstBuilder(enumConstant.sourcePosition.begin); | 427 new AstBuilder(enumConstant.sourcePosition.begin); |
| 432 Identifier name = valueBuilder.identifier(enumConstant.name); | 428 Identifier name = valueBuilder.identifier(enumConstant.name); |
| 433 | 429 |
| 434 // Add reference for the `values` field. | 430 // Add reference for the `values` field. |
| 435 valueReferences.add(valueBuilder.reference(name)); | 431 valueReferences.add(valueBuilder.reference(name)); |
| 436 } | 432 } |
| 437 | 433 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 return doParse((parser) { | 521 return doParse((parser) { |
| 526 parser.parseFunction(beginToken, getOrSet); | 522 parser.parseFunction(beginToken, getOrSet); |
| 527 }); | 523 }); |
| 528 } | 524 } |
| 529 } | 525 } |
| 530 | 526 |
| 531 AstKind kind = objectDecoder.getEnum(Key.SUB_KIND, AstKind.values); | 527 AstKind kind = objectDecoder.getEnum(Key.SUB_KIND, AstKind.values); |
| 532 Node root = computeNode(kind); | 528 Node root = computeNode(kind); |
| 533 TreeElementMapping elements = new TreeElementMapping(element); | 529 TreeElementMapping elements = new TreeElementMapping(element); |
| 534 AstIndexComputer indexComputer = new AstIndexComputer(); | 530 AstIndexComputer indexComputer = new AstIndexComputer(); |
| 535 Map<Node, int> nodeIndices = indexComputer.nodeIndices; | |
| 536 List<Node> nodeList = indexComputer.nodeList; | 531 List<Node> nodeList = indexComputer.nodeList; |
| 537 root.accept(indexComputer); | 532 root.accept(indexComputer); |
| 538 elements.containsTryStatement = objectDecoder.getBool(Key.CONTAINS_TRY); | 533 elements.containsTryStatement = objectDecoder.getBool(Key.CONTAINS_TRY); |
| 539 | 534 |
| 540 Node body; | 535 Node body; |
| 541 int bodyNodeIndex = objectDecoder.getInt(Key.BODY, isOptional: true); | 536 int bodyNodeIndex = objectDecoder.getInt(Key.BODY, isOptional: true); |
| 542 if (bodyNodeIndex != null) { | 537 if (bodyNodeIndex != null) { |
| 543 assert(invariant(element, bodyNodeIndex < nodeList.length, | 538 assert(invariant(element, bodyNodeIndex < nodeList.length, |
| 544 message: "Body node index ${bodyNodeIndex} out of range. " | 539 message: "Body node index ${bodyNodeIndex} out of range. " |
| 545 "Node count: ${nodeList.length}")); | 540 "Node count: ${nodeList.length}")); |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 687 } | 682 } |
| 688 } | 683 } |
| 689 } | 684 } |
| 690 element.resolvedAst = | 685 element.resolvedAst = |
| 691 new ParsedResolvedAst(element, root, body, elements, uri); | 686 new ParsedResolvedAst(element, root, body, elements, uri); |
| 692 } | 687 } |
| 693 } | 688 } |
| 694 | 689 |
| 695 const Key PARAMETER_NODE = const Key('parameter.node'); | 690 const Key PARAMETER_NODE = const Key('parameter.node'); |
| 696 const Key PARAMETER_INITIALIZER = const Key('parameter.initializer'); | 691 const Key PARAMETER_INITIALIZER = const Key('parameter.initializer'); |
| OLD | NEW |