OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// Source information system mapping that attempts a semantic mapping between | 5 /// Source information system mapping that attempts a semantic mapping between |
6 /// offsets of JavaScript code points to offsets of Dart code points. | 6 /// offsets of JavaScript code points to offsets of Dart code points. |
7 | 7 |
8 library dart2js.source_information.position; | 8 library dart2js.source_information.position; |
9 | 9 |
10 import '../common.dart'; | 10 import '../common.dart'; |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 sourceFile = element.implementation.compilationUnit.script.file, | 156 sourceFile = element.implementation.compilationUnit.script.file, |
157 name = computeElementNameForSourceMaps(element); | 157 name = computeElementNameForSourceMaps(element); |
158 | 158 |
159 SourceInformation buildDeclaration(AstElement element) { | 159 SourceInformation buildDeclaration(AstElement element) { |
160 if (element.isSynthesized) { | 160 if (element.isSynthesized) { |
161 return new PositionSourceInformation( | 161 return new PositionSourceInformation( |
162 new OffsetSourceLocation( | 162 new OffsetSourceLocation( |
163 sourceFile, element.position.charOffset, name)); | 163 sourceFile, element.position.charOffset, name)); |
164 } else { | 164 } else { |
165 return new PositionSourceInformation( | 165 return new PositionSourceInformation( |
166 null, | 166 new OffsetSourceLocation(sourceFile, |
| 167 element.resolvedAst.node.getBeginToken().charOffset, name), |
167 new OffsetSourceLocation(sourceFile, | 168 new OffsetSourceLocation(sourceFile, |
168 element.resolvedAst.node.getEndToken().charOffset, name)); | 169 element.resolvedAst.node.getEndToken().charOffset, name)); |
169 } | 170 } |
170 } | 171 } |
171 | 172 |
172 /// Builds a source information object pointing the start position of [node]. | 173 /// Builds a source information object pointing the start position of [node]. |
173 SourceInformation buildBegin(Node node) { | 174 SourceInformation buildBegin(Node node) { |
174 return new PositionSourceInformation(new OffsetSourceLocation( | 175 return new PositionSourceInformation(new OffsetSourceLocation( |
175 sourceFile, node.getBeginToken().charOffset, name)); | 176 sourceFile, node.getBeginToken().charOffset, name)); |
176 } | 177 } |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 class PositionTraceListener extends TraceListener with | 494 class PositionTraceListener extends TraceListener with |
494 NodeToSourceInformationMixin { | 495 NodeToSourceInformationMixin { |
495 final SourceMapper sourceMapper; | 496 final SourceMapper sourceMapper; |
496 | 497 |
497 PositionTraceListener(this.sourceMapper); | 498 PositionTraceListener(this.sourceMapper); |
498 | 499 |
499 @override | 500 @override |
500 void onStep(js.Node node, Offset offset, StepKind kind) { | 501 void onStep(js.Node node, Offset offset, StepKind kind) { |
501 SourceInformation sourceInformation = computeSourceInformation(node); | 502 SourceInformation sourceInformation = computeSourceInformation(node); |
502 if (sourceInformation == null) return; | 503 if (sourceInformation == null) return; |
| 504 int codeLocation = offset.subexpressionOffset; |
| 505 if (codeLocation == null) return; |
503 | 506 |
504 SourcePositionKind sourcePositionKind = SourcePositionKind.START; | 507 void registerPosition(SourcePositionKind sourcePositionKind) { |
| 508 SourceLocation sourceLocation = |
| 509 getSourceLocation(sourceInformation, sourcePositionKind); |
| 510 if (sourceLocation != null) { |
| 511 sourceMapper.register(node, codeLocation, sourceLocation); |
| 512 } |
| 513 } |
| 514 |
505 switch (kind) { | 515 switch (kind) { |
506 case StepKind.FUN: | 516 case StepKind.FUN_ENTRY: |
507 sourcePositionKind = SourcePositionKind.INNER; | 517 // TODO(johnniwinther): Remove this when fully transitioned to the |
| 518 // new source info system. |
| 519 registerPosition(SourcePositionKind.START); |
| 520 break; |
| 521 case StepKind.FUN_EXIT: |
| 522 registerPosition(SourcePositionKind.INNER); |
508 break; | 523 break; |
509 case StepKind.CALL: | 524 case StepKind.CALL: |
510 CallPosition callPosition = | 525 CallPosition callPosition = |
511 CallPosition.getSemanticPositionForCall(node); | 526 CallPosition.getSemanticPositionForCall(node); |
512 sourcePositionKind = callPosition.sourcePositionKind; | 527 registerPosition(callPosition.sourcePositionKind); |
513 break; | 528 break; |
514 case StepKind.NEW: | 529 case StepKind.NEW: |
515 case StepKind.RETURN: | 530 case StepKind.RETURN: |
516 case StepKind.BREAK: | 531 case StepKind.BREAK: |
517 case StepKind.CONTINUE: | 532 case StepKind.CONTINUE: |
518 case StepKind.THROW: | 533 case StepKind.THROW: |
519 case StepKind.EXPRESSION_STATEMENT: | 534 case StepKind.EXPRESSION_STATEMENT: |
520 case StepKind.IF_CONDITION: | 535 case StepKind.IF_CONDITION: |
521 case StepKind.FOR_INITIALIZER: | 536 case StepKind.FOR_INITIALIZER: |
522 case StepKind.FOR_CONDITION: | 537 case StepKind.FOR_CONDITION: |
523 case StepKind.FOR_UPDATE: | 538 case StepKind.FOR_UPDATE: |
524 case StepKind.WHILE_CONDITION: | 539 case StepKind.WHILE_CONDITION: |
525 case StepKind.DO_CONDITION: | 540 case StepKind.DO_CONDITION: |
526 case StepKind.SWITCH_EXPRESSION: | 541 case StepKind.SWITCH_EXPRESSION: |
| 542 registerPosition(SourcePositionKind.START); |
527 break; | 543 break; |
528 } | 544 } |
529 int codeLocation = offset.subexpressionOffset; | |
530 SourceLocation sourceLocation = | |
531 getSourceLocation(sourceInformation, sourcePositionKind); | |
532 if (codeLocation != null && sourceLocation != null) { | |
533 sourceMapper.register(node, codeLocation, sourceLocation); | |
534 } | |
535 } | 545 } |
536 } | 546 } |
537 | 547 |
538 /// The position of a [js.Call] node. | 548 /// The position of a [js.Call] node. |
539 class CallPosition { | 549 class CallPosition { |
540 final js.Node node; | 550 final js.Node node; |
541 final CodePositionKind codePositionKind; | 551 final CodePositionKind codePositionKind; |
542 final SourcePositionKind sourcePositionKind; | 552 final SourcePositionKind sourcePositionKind; |
543 | 553 |
544 CallPosition(this.node, this.codePositionKind, this.sourcePositionKind); | 554 CallPosition(this.node, this.codePositionKind, this.sourcePositionKind); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 | 675 |
666 enum BranchKind { | 676 enum BranchKind { |
667 CONDITION, | 677 CONDITION, |
668 LOOP, | 678 LOOP, |
669 CATCH, | 679 CATCH, |
670 FINALLY, | 680 FINALLY, |
671 CASE, | 681 CASE, |
672 } | 682 } |
673 | 683 |
674 enum StepKind { | 684 enum StepKind { |
675 FUN, | 685 FUN_ENTRY, |
| 686 FUN_EXIT, |
676 CALL, | 687 CALL, |
677 NEW, | 688 NEW, |
678 RETURN, | 689 RETURN, |
679 BREAK, | 690 BREAK, |
680 CONTINUE, | 691 CONTINUE, |
681 THROW, | 692 THROW, |
682 EXPRESSION_STATEMENT, | 693 EXPRESSION_STATEMENT, |
683 IF_CONDITION, | 694 IF_CONDITION, |
684 FOR_INITIALIZER, | 695 FOR_INITIALIZER, |
685 FOR_CONDITION, | 696 FOR_CONDITION, |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 } | 801 } |
791 } | 802 } |
792 } | 803 } |
793 | 804 |
794 @override | 805 @override |
795 visitFun(js.Fun node) { | 806 visitFun(js.Fun node) { |
796 bool activeBefore = active; | 807 bool activeBefore = active; |
797 if (!active) { | 808 if (!active) { |
798 active = node.sourceInformation != null; | 809 active = node.sourceInformation != null; |
799 } | 810 } |
| 811 leftToRightOffset = statementOffset = |
| 812 getSyntaxOffset(node, kind: CodePositionKind.START); |
| 813 Offset entryOffset = getOffsetForNode(node, statementOffset); |
| 814 notifyStep(node, entryOffset, StepKind.FUN_ENTRY); |
| 815 |
800 visit(node.body); | 816 visit(node.body); |
| 817 |
801 leftToRightOffset = statementOffset = | 818 leftToRightOffset = statementOffset = |
802 getSyntaxOffset(node, kind: CodePositionKind.CLOSING); | 819 getSyntaxOffset(node, kind: CodePositionKind.CLOSING); |
803 Offset offset = getOffsetForNode(node, statementOffset); | 820 Offset exitOffset = getOffsetForNode(node, statementOffset); |
804 notifyStep(node, offset, StepKind.FUN); | 821 notifyStep(node, exitOffset, StepKind.FUN_EXIT); |
805 active = activeBefore; | 822 active = activeBefore; |
806 } | 823 } |
807 | 824 |
808 @override | 825 @override |
809 visitBlock(js.Block node) { | 826 visitBlock(js.Block node) { |
810 for (js.Statement statement in node.statements) { | 827 for (js.Statement statement in node.statements) { |
811 visit(statement); | 828 visit(statement); |
812 } | 829 } |
813 } | 830 } |
814 | 831 |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1267 | 1284 |
1268 @override | 1285 @override |
1269 CodePosition operator [](js.Node node) { | 1286 CodePosition operator [](js.Node node) { |
1270 CodePosition codePosition = codePositions[node]; | 1287 CodePosition codePosition = codePositions[node]; |
1271 if (codePosition == null) { | 1288 if (codePosition == null) { |
1272 coverage.registerNodesWithoutOffset(node); | 1289 coverage.registerNodesWithoutOffset(node); |
1273 } | 1290 } |
1274 return codePosition; | 1291 return codePosition; |
1275 } | 1292 } |
1276 } | 1293 } |
OLD | NEW |