| Index: lib/src/script.dart
 | 
| diff --git a/lib/src/script.dart b/lib/src/script.dart
 | 
| index f92eb0c28e577afd6269d5f3916f178e58441e43..c11a4572372a88abd1a6fa67e87c8533b2a1e7be 100644
 | 
| --- a/lib/src/script.dart
 | 
| +++ b/lib/src/script.dart
 | 
| @@ -14,6 +14,7 @@ import 'library.dart';
 | 
|  import 'object.dart';
 | 
|  import 'scope.dart';
 | 
|  import 'source_location.dart';
 | 
| +import 'source_report.dart';
 | 
|  
 | 
|  VMScriptRef newVMScriptRef(Scope scope, Map json) {
 | 
|    if (json == null) return null;
 | 
| @@ -27,6 +28,11 @@ VMScriptToken newVMScriptToken(String isolateId, String scriptId,
 | 
|    return new VMScriptToken._(isolateId, scriptId, position);
 | 
|  }
 | 
|  
 | 
| +VMScriptToken newVMScriptTokenFromPosition(VMScriptRef script, int position) {
 | 
| +  if (position == null) return null;
 | 
| +  return new VMScriptToken._(script._scope.isolateId, script._id, position);
 | 
| +}
 | 
| +
 | 
|  /// A reference to a script in the Dart VM.
 | 
|  ///
 | 
|  /// A script contains information about the actual text of a library. Usually
 | 
| @@ -70,6 +76,50 @@ class VMScriptRef implements VMObjectRef {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  /// Generates a set of reports tied to this script.
 | 
| +  ///
 | 
| +  /// If [includeCoverageReport] is `true`, the report includes code coverage
 | 
| +  /// information via [VMSourceReportRange.coverage] in
 | 
| +  /// [VMSourceReport.ranges].
 | 
| +  /// Otherwise, [VMSourceReportRange.coverage] is `null`.
 | 
| +  ///
 | 
| +  /// If [includePossibleBreakpoints] is `true`, the report includes a list of
 | 
| +  /// token positions which correspond to possible breakpoints via
 | 
| +  /// [VMSourceReportRange.possibleBreakpoints] in [VMSourceReport.ranges].
 | 
| +  /// Otherwise, [VMSourceReportRange.possibleBreakpoints] is `null`.
 | 
| +  ///
 | 
| +  /// If [forceCompile] is `true`, all functions in the range of the report
 | 
| +  /// will be compiled. If `false`, functions that are never used may not appear
 | 
| +  /// in [VMSourceReportRange.misses].
 | 
| +  /// Forcing compilation can cause a compilation error, which could terminate
 | 
| +  /// the running Dart program.
 | 
| +  ///
 | 
| +  /// [location] can be provided to restrict analysis to a subrange of the
 | 
| +  /// script. An [ArgumentError] is thrown if `location.end` is `null`.
 | 
| +  Future<VMSourceReport> getSourceReport(
 | 
| +      {bool includeCoverageReport: true,
 | 
| +      bool includePossibleBreakpoints: true,
 | 
| +      bool forceCompile: false,
 | 
| +      VMSourceLocation location}) async {
 | 
| +    var reports = <String>[];
 | 
| +    if (includeCoverageReport) reports.add('Coverage');
 | 
| +    if (includePossibleBreakpoints) reports.add('PossibleBreakpoints');
 | 
| +
 | 
| +    var params = <String, dynamic>{'scriptId': _id, 'reports': reports};
 | 
| +    if (forceCompile) params['forceCompile'] = true;
 | 
| +    if (location != null) {
 | 
| +      if (location.end == null) {
 | 
| +        throw new ArgumentError.value(
 | 
| +            location, 'location', 'location.end cannot be null.');
 | 
| +      }
 | 
| +      params['tokenPos'] = location.token._position;
 | 
| +      params['endTokenPos'] = location.end._position;
 | 
| +    }
 | 
| +
 | 
| +    var json = await _scope.sendRequest('getSourceReport', params);
 | 
| +    return newSourceReport(_scope, json);
 | 
| +  }
 | 
| +
 | 
|    bool operator ==(other) => other is VMScriptRef &&
 | 
|        (_fixedId ? _id == other._id : super == other);
 | 
|  
 | 
| 
 |