blob: 8e2f672263f3fae3dde3fc2c3245cf89c9a60f60 [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 'error.dart';
import 'field.dart';
import 'function.dart';
import 'instance.dart';
import 'library.dart';
import 'object.dart';
import 'scope.dart';
import 'source_location.dart';
VMClassRef newVMClassRef(Scope scope, Map json) {
if (json == null) return null;
assert(json["type"] == "@Class" || json["type"] == "Class");
return new VMClassRef._(scope, json);
}
/// A reference to a Dart class.
class VMClassRef implements VMObjectRef {
final Scope _scope;
/// The ID for this class, which is unique relative to its isolate.
final String _id;
/// Whether [_id] is guaranteed to be the same for different VM service class
/// objects that refer to the same class.
final bool _fixedId;
Uri get observatoryUrl => _scope.observatoryUrlFor(_id);
/// The name of this class.
final String name;
VMClassRef._(this._scope, Map json)
: _id = json["id"],
_fixedId = json["fixedId"] ?? false,
name = json["name"];
Future<VMClass> load() async => new VMClass._(
_scope, await _scope.loadObject(_id));
/// Evaluates [expression] in the context of this class.
///
/// Throws a [VMErrorException] if evaluating the expression throws an error.
Future<VMInstanceRef> evaluate(String expression) =>
_scope.evaluate(_id, expression);
bool operator ==(other) => other is VMClassRef &&
(_fixedId ? _id == other._id : super == other);
int get hashCode => _fixedId ? _id.hashCode : super.hashCode;
String toString() => name;
}
/// A Dart class.
class VMClass extends VMClassRef implements VMObject {
final VMClassRef klass;
final int size;
/// The error that occurred during class finalization, or `null` if no error
/// occurred.
final VMErrorRef error;
/// Whether this class is abstract.
final bool isAbstract;
/// Whether this class is const.
final bool isConst;
/// The library that contains this class.
final VMLibraryRef library;
/// The location of this class in the isolate's source code.
final VMSourceLocation location;
/// The superclass of this class, or `null` if it has no superclass.
final VMClassRef superclass;
/// This class's interface types.
final List<VMTypeInstanceRef> interfaces;
/// The fields defined in this class, indexed by name.
///
/// This doesn't include fields from superclasses.
final Map<String, VMFieldRef> fields;
/// The functions defined in this class, indexed by name.
///
/// This includes both static and instance functions, but doesn't include
/// functions from superclasses.
final Map<String, VMFunctionRef> functions;
/// This class's subclasses.
final List<VMClassRef> subclasses;
VMClass._(Scope scope, Map json)
: klass = new VMClassRef._(scope, json["class"]),
size = json["size"],
error = newVMErrorRef(scope, json["error"]),
isAbstract = json["abstract"],
isConst = json["const"],
library = newVMLibraryRef(scope, json["library"]),
location = newVMSourceLocation(scope, json["location"]),
superclass = newVMClassRef(scope, json["super"]),
interfaces = new List.unmodifiable(json["interfaces"]
.map((interfaceJson) =>
newVMTypeInstanceRef(scope, interfaceJson))),
fields = new UnmodifiableMapView(new Map.fromIterable(json["fields"],
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))),
subclasses = new List.unmodifiable(json["subclasses"]
.map((subclass) => newVMClassRef(scope, subclass))),
super._(scope, json);
}