| Index: lib/src/source_report.dart
|
| diff --git a/lib/src/source_report.dart b/lib/src/source_report.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b1d9f3fb160771595fac193390bec31d2ecaf130
|
| --- /dev/null
|
| +++ b/lib/src/source_report.dart
|
| @@ -0,0 +1,120 @@
|
| +// 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.
|
| +
|
| +import 'script.dart';
|
| +import 'scope.dart';
|
| +import 'source_location.dart';
|
| +
|
| +VMSourceReport newSourceReport(Scope scope, Map json) {
|
| + if (json == null) return null;
|
| + assert(json["type"] == "SourceReport");
|
| +
|
| + var scripts = (json['scripts'] as List)
|
| + .map((script) => newVMScriptRef(scope, script))
|
| + .toList();
|
| +
|
| + var ranges = new List<VMSourceReportRange>.unmodifiable(
|
| + (json['ranges'] as List).map((rangeItem) =>
|
| + new VMSourceReportRange._fromJson(rangeItem, scripts)));
|
| +
|
| + return new VMSourceReport._(ranges);
|
| +}
|
| +
|
| +/// A report about ranges of source code.
|
| +///
|
| +/// [ranges] exposes code coverage and information on possible breakpoints.
|
| +class VMSourceReport {
|
| + /// Ranges in the program source corresponding to ranges of executable code in
|
| + /// the user's program.
|
| + ///
|
| + /// Ranges can include members such as functions, methods, and
|
| + /// constructors.
|
| + ///
|
| + /// Note: ranges may nest in other ranges, in the case of nested functions.
|
| + /// Ranges may be duplicated, in the case of mixins.
|
| + final List<VMSourceReportRange> ranges;
|
| +
|
| + VMSourceReport._(this.ranges);
|
| +}
|
| +
|
| +/// A range of executable code (function, method, constructor, etc)
|
| +/// in the running program.
|
| +///
|
| +/// This is part of a [VMSourceReport].
|
| +class VMSourceReportRange {
|
| + VMScriptRef get script => location.script;
|
| +
|
| + /// The location of the range in the target script.
|
| + final VMSourceLocation location;
|
| +
|
| + /// `true` if this range been compiled by the Dart VM.
|
| + ///
|
| + /// If `false`, `possibleBreakpoints`, `hits`, and `misses` will be `null`.
|
| + ///
|
| + /// Use `forceCompile` in `getSourceReport` to ensure the target scripts are
|
| + /// compiled.
|
| + final bool compiled;
|
| +
|
| + /// Token positions at which breakpoints can be set.
|
| + ///
|
| + /// Provided only when `includePossibleBreakpoints` in `getSourceReport`
|
| + /// is `true` and the range has been compiled.
|
| + final List<VMScriptToken> possibleBreakpoints;
|
| +
|
| + /// Token positions in this range which have been executed.
|
| + ///
|
| + /// Provided only when `includeCoverageReport` in `getSourceReport` is `true`
|
| + /// and the range has been compiled.
|
| + ///
|
| + /// Sorted by the position in the source file, starting with the first hit.
|
| + final List<VMScriptToken> hits;
|
| +
|
| + /// Token positions in this range which have not yet been executed.
|
| + ///
|
| + /// Provided only when `includeCoverageReport` in `getSourceReport` is `true`
|
| + /// and the range has been compiled.
|
| + ///
|
| + /// Sorted by the location in the source file, starting with the first miss.
|
| + final List<VMScriptToken> misses;
|
| +
|
| + /// Creates a new [VMSourceReportRange].
|
| + ///
|
| + /// [json] corresponds to data returned by the `getSourceReport` RPC.
|
| + ///
|
| + /// [scripts] is used to find the [VMScriptRef] referenced by index in [json].
|
| + factory VMSourceReportRange._fromJson(Map json, List<VMScriptRef> scripts) {
|
| + var script = scripts[json['scriptIndex']];
|
| +
|
| + var location = newVMSourceLocationFromPosition(
|
| + script, json['startPos'], json['endPos']);
|
| +
|
| + var compiled = json['compiled'];
|
| +
|
| + var hits = json['coverage'] == null
|
| + ? null
|
| + : _getTokens(script, json['coverage']['hits']);
|
| +
|
| + var misses = json['coverage'] == null
|
| + ? null
|
| + : _getTokens(script, json['coverage']['misses']);
|
| +
|
| + var possibleBreakpoints = json['possibleBreakpoints'] == null
|
| + ? null
|
| + : _getTokens(script, json['possibleBreakpoints']);
|
| +
|
| + return new VMSourceReportRange._(
|
| + compiled, hits, misses, possibleBreakpoints, location);
|
| + }
|
| +
|
| + VMSourceReportRange._(this.compiled, this.hits, this.misses,
|
| + this.possibleBreakpoints, this.location);
|
| +
|
| + /// Returns an unmodifiable [List<VMScriptToken>] corresponding to the
|
| + /// provided token [locations].
|
| + static List<VMScriptToken> _getTokens(
|
| + VMScriptRef script, Iterable<int> locations) {
|
| + return new List<VMScriptToken>.unmodifiable(locations
|
| + .map((position) => newVMScriptTokenFromPosition(script, position)));
|
| + }
|
| +}
|
|
|