blob: 0f881e19783fa7d8fa51d5e2318a2b6fa30f43d0 [file] [log] [blame]
// Copyright (c) 2015, 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 'dart:async';
import 'dart:collection';
import 'class.dart';
import 'field.dart';
import 'function.dart';
import 'instance.dart';
import 'object.dart';
import 'scope.dart';
import 'script.dart';
VMLibraryRef newVMLibraryRef(Scope scope, Map json) {
if (json == null) return null;
assert(json["type"] == "@Library" || json["type"] == "Library");
return new VMLibraryRef._(scope, json);
}
/// A reference to a Dart library—that is, a single importable Dart file.
class VMLibraryRef implements VMObjectRef {
final Scope _scope;
/// The ID for this library, which is unique relative to its isolate.
final String _id;
/// Whether [_id] is guaranteed to be the same for different VM service
/// library objects that refer to the same library.
final bool _fixedId;
Uri get observatoryUrl => _scope.observatoryUrlFor(_id);
/// The name of this library, derived from its library tag.
final String name;
/// The canonical URI for this library.
final Uri uri;
VMLibraryRef._(this._scope, Map json)
: _id = json["id"],
_fixedId = json["fixedId"] ?? false,
name = json["name"],
uri = Uri.parse(json["uri"]);
Future<VMLibrary> load() async =>
new VMLibrary._(_scope, await _scope.loadObject(_id));
/// Enables breakpoints and stepping for this library.
Future setDebuggable() async {
await _scope.sendRequest(
"setLibraryDebuggable", {"libraryId": _id, "isDebuggable": true});
}
/// Disables breakpoints and stepping for this library.
Future setNotDebuggable() async {
await _scope.sendRequest(
"setLibraryDebuggable", {"libraryId": _id, "isDebuggable": false});
}
/// Evaluates [expression] in the context of this library.
///
/// Throws a [VMErrorException] if evaluating the expression throws an error.
Future<VMInstanceRef> evaluate(String expression) =>
_scope.evaluate(_id, expression);
bool operator ==(other) =>
other is VMLibraryRef && (_fixedId ? _id == other._id : super == other);
int get hashCode => _fixedId ? _id.hashCode : super.hashCode;
String toString() => uri.toString();
}
/// A a Dart library—that is, a single importable Dart file.
class VMLibrary extends VMLibraryRef implements VMObject {
final VMClassRef klass;
final int size;
/// Whether breakpoints and stepping are enabled for this library.
final bool isDebuggable;
/// The imports and exports for this library.
final List<VMLibraryDependency> dependencies;
/// The scripts that make up the library.
///
/// Most libraries have only one script, but the `part` directive means that
/// it can have multiple.
final List<VMScriptRef> scripts;
/// The fields defined in this library, indexed by name.
final Map<String, VMFieldRef> fields;
/// The top-level functions defined in this library, indexed by name.
final Map<String, VMFunctionRef> functions;
/// The classes defined in this library, indexed by name.
final Map<String, VMClassRef> classes;
VMLibrary._(Scope scope, Map json)
: klass = newVMClassRef(scope, json["class"]),
size = json["size"],
isDebuggable = json["debuggable"],
dependencies = new List.unmodifiable(json["dependencies"]
.map((dependency) => new VMLibraryDependency._(scope, dependency))),
scripts = new List.unmodifiable(
json["scripts"].map((script) => newVMScriptRef(scope, script))),
fields = new UnmodifiableMapView(new Map.fromIterable(json["variables"],
key: (field) => field["name"],
value: (field) => newVMFieldRef(scope, field))),
functions = new UnmodifiableMapView(new Map.fromIterable(
json["functions"],
key: (function) => function["name"],
value: (function) => newVMFunctionRef(scope, function))),
classes = new UnmodifiableMapView(new Map.fromIterable(json["classes"],
key: (klass) => klass["name"],
value: (klass) => newVMClassRef(scope, klass))),
super._(scope, json);
}
/// A single dependency—that is, an import or an export.
class VMLibraryDependency {
/// Whether this is an import.
///
/// This is always the opposite of [isExport].
final bool isImport;
/// Whether this is an export.
///
/// This is always the opposite of [isImport].
bool get isExport => !isImport;
/// Whether this is a deferred import.
final bool isDeferred;
/// The prefix for this import, or `null` if it's unprefixed or an export.
final String prefix;
/// The library that's imported or exported.
final VMLibraryRef target;
VMLibraryDependency._(Scope scope, Map json)
: isImport = json["isImport"],
isDeferred = json["isDeferred"],
prefix = json["prefix"],
target = new VMLibraryRef._(scope, json["target"]);
String toString() {
var buffer = new StringBuffer(isImport ? "import" : "export");
buffer.write(' "${target.uri}"');
if (isDeferred) buffer.write(" deferred");
if (prefix != null) buffer.write(" as $prefix");
return buffer.toString();
}
}