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 |