| Index: tests/compiler/dart2js/sourcemaps/js_tracer.dart
|
| diff --git a/tests/compiler/dart2js/sourcemaps/js_tracer.dart b/tests/compiler/dart2js/sourcemaps/js_tracer.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1aa40fec21b3f570fe437b07787e035c10fb1b56
|
| --- /dev/null
|
| +++ b/tests/compiler/dart2js/sourcemaps/js_tracer.dart
|
| @@ -0,0 +1,138 @@
|
| +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library sourcemap.js_tracer;
|
| +
|
| +import 'package:compiler/src/io/source_information.dart';
|
| +import 'package:compiler/src/io/position_information.dart';
|
| +import 'package:compiler/src/js/js.dart' as js;
|
| +import 'sourcemap_helper.dart';
|
| +import 'trace_graph.dart';
|
| +
|
| +/// Create a [TraceGraph] for [info] registering usage in [coverage].
|
| +TraceGraph createTraceGraph(SourceMapInfo info, Coverage coverage) {
|
| + TraceGraph graph = new TraceGraph();
|
| + TraceListener listener = new StepTraceListener(graph);
|
| + CodePositionMap codePositions =
|
| + new CodePositionCoverage(info.jsCodePositions, coverage);
|
| + JavaScriptTracer tracer = new JavaScriptTracer(
|
| + codePositions, [new CoverageListener(coverage), listener]);
|
| + info.node.accept(tracer);
|
| + return graph;
|
| +}
|
| +
|
| +class StepTraceListener extends TraceListener {
|
| + Map<js.Node, TraceStep> steppableMap = <js.Node, TraceStep>{};
|
| + final TraceGraph graph;
|
| +
|
| + StepTraceListener(this.graph);
|
| +
|
| + @override
|
| + void onStep(js.Node node, Offset offset, StepKind kind) {
|
| + SourceInformation sourceInformation = node.sourceInformation;
|
| + SourcePositionKind sourcePositionKind = SourcePositionKind.START;
|
| + List text = [node];
|
| + switch (kind) {
|
| + case StepKind.FUN:
|
| + sourcePositionKind = SourcePositionKind.INNER;
|
| + text = ['<exit>'];
|
| + break;
|
| + case StepKind.CALL:
|
| + CallPosition callPosition =
|
| + CallPosition.getSemanticPositionForCall(node);
|
| + sourcePositionKind = callPosition.sourcePositionKind;
|
| + break;
|
| + case StepKind.NEW:
|
| + case StepKind.RETURN:
|
| + case StepKind.BREAK:
|
| + case StepKind.CONTINUE:
|
| + case StepKind.THROW:
|
| + case StepKind.EXPRESSION_STATEMENT:
|
| + break;
|
| + case StepKind.IF_CONDITION:
|
| + js.If ifNode = node;
|
| + text = ['if(', ifNode.condition, ') ...'];
|
| + break;
|
| + case StepKind.FOR_INITIALIZER:
|
| + js.For forNode = node;
|
| + text = ['for(', forNode.init, '; ...) ...'];
|
| + break;
|
| + case StepKind.FOR_CONDITION:
|
| + js.For forNode = node;
|
| + text = ['for(...;', forNode.condition, '; ...) ...'];
|
| + break;
|
| + case StepKind.FOR_UPDATE:
|
| + js.For forNode = node;
|
| + text = ['for(...; ...', forNode.update, ') ...'];
|
| + break;
|
| + case StepKind.WHILE_CONDITION:
|
| + js.While whileNode = node;
|
| + text = ['while(', whileNode.condition, ') ...'];
|
| + break;
|
| + case StepKind.DO_CONDITION:
|
| + js.Do doNode = node;
|
| + text = ['do {... } (', doNode.condition, ')'];
|
| + break;
|
| + case StepKind.SWITCH_EXPRESSION:
|
| + js.Switch switchNode = node;
|
| + text = ['switch(', switchNode.key, ') ...'];
|
| + break;
|
| +
|
| + }
|
| + createTraceStep(
|
| + node,
|
| + offset: offset,
|
| + sourceLocation: getSourceLocation(
|
| + node.sourceInformation, sourcePositionKind),
|
| + text: text);
|
| + }
|
| +
|
| + void createTraceStep(
|
| + js.Node node,
|
| + {Offset offset,
|
| + List text,
|
| + String note,
|
| + SourceLocation sourceLocation}) {
|
| + int id = steppableMap.length;
|
| +
|
| + if (text == null) {
|
| + text = [node];
|
| + }
|
| +
|
| + TraceStep step = new TraceStep(
|
| + id, node,
|
| + offset,
|
| + text, sourceLocation);
|
| + graph.addStep(step);
|
| +
|
| + steppableMap[node] = step;
|
| + }
|
| +
|
| +
|
| + void pushBranch(BranchKind kind, [value]) {
|
| + var branch;
|
| + switch (kind) {
|
| + case BranchKind.CONDITION:
|
| + branch = value ? 't' : 'f';
|
| + break;
|
| + case BranchKind.LOOP:
|
| + branch = 'l';
|
| + break;
|
| + case BranchKind.CATCH:
|
| + branch = 'c';
|
| + break;
|
| + case BranchKind.FINALLY:
|
| + branch = 'F';
|
| + break;
|
| + case BranchKind.CASE:
|
| + branch = '$value';
|
| + break;
|
| + }
|
| + graph.pushBranch(branch);
|
| + }
|
| +
|
| + void popBranch() {
|
| + graph.popBranch();
|
| + }
|
| +}
|
|
|