[vm, service, observatory] Bang Bang (My Type System Shot Me Down).

Port the service tests and Observatory to Dart 3.

Change-Id: I8a8b20d8f90acd3b5f741c93f10ba99971aa0c52
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/154825
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Ben Konyi <bkonyi@google.com>
This commit is contained in:
Ryan Macnak 2020-10-14 18:16:27 +00:00 committed by commit-bot@chromium.org
parent ece17f73b0
commit 37ed87b038
314 changed files with 3845 additions and 3727 deletions

View file

@ -443,7 +443,7 @@
"name": "observatory",
"rootUri": "../runtime/observatory",
"packageUri": "lib/",
"languageVersion": "2.2"
"languageVersion": "2.10"
},
{
"name": "observatory_2",
@ -454,7 +454,7 @@
{
"name": "observatory_test_package",
"rootUri": "../runtime/observatory/tests/service/observatory_test_package",
"languageVersion": "2.7"
"languageVersion": "2.10"
},
{
"name": "observatory_test_package_2",

View file

@ -202,6 +202,12 @@ const AllowedExperimentalFlags defaultAllowedExperimentalFlags =
"native_stack_traces": {
ExperimentalFlag.nonNullable,
},
"observatory": {
ExperimentalFlag.nonNullable,
},
"observatory_test_package": {
ExperimentalFlag.nonNullable,
},
"path": {
ExperimentalFlag.nonNullable,
},

View file

@ -37,6 +37,8 @@ prebuilt_dart2js_action("build_observatory") {
"-o",
rebase_path(output),
"--packages=" + rebase_path("../../.packages"),
"--enable-experiment=non-nullable",
"--no-sound-null-safety",
]
if (is_debug) {
args += [ "--enable-asserts" ]

View file

@ -1,7 +1,10 @@
analyzer:
enable-experiment:
- non-nullable
errors:
dead_code: ignore
unused_local_variable: ignore
getter_not_subtype_setter_types: ignore
exclude:
- tests/service/bad_reload/v2/main.dart
- tests/service/complex_reload/v2/main.dart

View file

@ -22,14 +22,14 @@ Future<SnapshotGraph> load(String uri) async {
reader.onProgress.listen(print);
ws.listen((dynamic response) {
if (response is String) {
response = json.decode(response);
ws.listen((dynamic dynResponse) {
if (dynResponse is String) {
final response = json.decode(dynResponse);
if (response['id'] == 1) {
getVM.complete(response['result']['isolates'][0]['id']);
}
} else if (response is List<int>) {
response = new Uint8List.fromList(response);
} else if (dynResponse is List<int>) {
final response = new Uint8List.fromList(dynResponse);
final dataOffset =
new ByteData.view(response.buffer).getUint32(0, Endian.little);
dynamic metadata = new Uint8List.view(response.buffer, 4, dataOffset - 4);

View file

@ -30,7 +30,7 @@ void repl(VM vm, Isolate isolate, String lastResult) {
void main() {
String addr = 'ws://localhost:8181/ws';
new WebSocketVM(new WebSocketVMTarget(addr)).load().then((serviceObject) {
VM vm = serviceObject;
VM vm = serviceObject as VM;
Isolate isolate = vm.isolates.first;
repl(vm, isolate, 'isolate ${isolate.id}');
});

View file

@ -108,7 +108,7 @@ class PauseBreakpointEvent implements M.PauseBreakpointEvent {
final bool atAsyncSuspension;
/// [optional]
final M.Breakpoint breakpoint;
final M.Breakpoint? breakpoint;
PauseBreakpointEvent(
this.timestamp,
this.isolate,
@ -128,7 +128,7 @@ class PauseBreakpointEvent implements M.PauseBreakpointEvent {
class PauseInterruptedEvent implements M.PauseInterruptedEvent {
final DateTime timestamp;
final M.IsolateRef isolate;
final M.Frame topFrame;
final M.Frame? topFrame;
final bool atAsyncSuspension;
PauseInterruptedEvent(
this.timestamp, this.isolate, this.topFrame, this.atAsyncSuspension) {
@ -141,7 +141,7 @@ class PauseInterruptedEvent implements M.PauseInterruptedEvent {
class PausePostRequestEvent implements M.PausePostRequestEvent {
final DateTime timestamp;
final M.IsolateRef isolate;
final M.Frame topFrame;
final M.Frame? topFrame;
final bool atAsyncSuspension;
PausePostRequestEvent(
this.timestamp, this.isolate, this.topFrame, this.atAsyncSuspension) {
@ -168,7 +168,7 @@ class PauseExceptionEvent implements M.PauseExceptionEvent {
class ResumeEvent implements M.ResumeEvent {
final DateTime timestamp;
final M.IsolateRef isolate;
final M.Frame topFrame;
final M.Frame? topFrame;
ResumeEvent(this.timestamp, this.isolate, this.topFrame) {
assert(timestamp != null);
assert(isolate != null);
@ -309,69 +309,71 @@ class ServiceUnregisteredEvent implements M.ServiceUnregisteredEvent {
}
}
M.Event createEventFromServiceEvent(S.ServiceEvent event) {
M.Event? createEventFromServiceEvent(S.ServiceEvent event) {
switch (event.kind) {
case S.ServiceEvent.kVMUpdate:
return new VMUpdateEvent(event.timestamp, event.vm);
return new VMUpdateEvent(event.timestamp!, event.vm);
case S.ServiceEvent.kIsolateStart:
return new IsolateStartEvent(event.timestamp, event.isolate);
return new IsolateStartEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kIsolateRunnable:
return new IsolateRunnableEvent(event.timestamp, event.isolate);
return new IsolateRunnableEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kIsolateUpdate:
return new IsolateUpdateEvent(event.timestamp, event.isolate);
return new IsolateUpdateEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kIsolateReload:
return new IsolateReloadEvent(
event.timestamp, event.isolate, event.error);
event.timestamp!, event.isolate!, event.error!);
case S.ServiceEvent.kIsolateExit:
return new IsolateExitEvent(event.timestamp, event.isolate);
return new IsolateExitEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kBreakpointAdded:
return new BreakpointAddedEvent(
event.timestamp, event.isolate, event.breakpoint);
event.timestamp!, event.isolate!, event.breakpoint!);
case S.ServiceEvent.kBreakpointResolved:
return new BreakpointResolvedEvent(
event.timestamp, event.isolate, event.breakpoint);
event.timestamp!, event.isolate!, event.breakpoint!);
case S.ServiceEvent.kBreakpointRemoved:
return new BreakpointRemovedEvent(
event.timestamp, event.isolate, event.breakpoint);
event.timestamp!, event.isolate!, event.breakpoint!);
case S.ServiceEvent.kDebuggerSettingsUpdate:
return new DebuggerSettingsUpdateEvent(event.timestamp, event.isolate);
return new DebuggerSettingsUpdateEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kResume:
return new ResumeEvent(event.timestamp, event.isolate, event.topFrame);
return new ResumeEvent(event.timestamp!, event.isolate!, event.topFrame);
case S.ServiceEvent.kPauseStart:
return new PauseStartEvent(event.timestamp, event.isolate);
return new PauseStartEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kPauseExit:
return new PauseExitEvent(event.timestamp, event.isolate);
return new PauseExitEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kPausePostRequest:
return new PausePostRequestEvent(event.timestamp, event.isolate,
event.topFrame, event.atAsyncSuspension);
return new PausePostRequestEvent(event.timestamp!, event.isolate!,
event.topFrame, event.atAsyncSuspension!);
case S.ServiceEvent.kPauseBreakpoint:
return new PauseBreakpointEvent(
event.timestamp,
event.isolate,
event.pauseBreakpoints,
event.topFrame,
event.atAsyncSuspension,
event.timestamp!,
event.isolate!,
event.pauseBreakpoints!,
event.topFrame!,
event.atAsyncSuspension!,
event.breakpoint);
case S.Isolate.kLoggingStream:
return new LoggingEvent(event.timestamp, event.isolate, event.logRecord);
return new LoggingEvent(
event.timestamp!, event.isolate!, event.logRecord!);
case S.ServiceEvent.kPauseInterrupted:
return new PauseInterruptedEvent(event.timestamp, event.isolate,
event.topFrame, event.atAsyncSuspension);
return new PauseInterruptedEvent(event.timestamp!, event.isolate!,
event.topFrame, event.atAsyncSuspension!);
case S.ServiceEvent.kPauseException:
return new PauseExceptionEvent(
event.timestamp, event.isolate, event.topFrame, event.exception);
event.timestamp!, event.isolate!, event.topFrame!, event.exception!);
case S.ServiceEvent.kInspect:
return new InspectEvent(event.timestamp, event.isolate, event.inspectee);
return new InspectEvent(
event.timestamp!, event.isolate!, event.inspectee!);
case S.ServiceEvent.kGC:
return new GCEvent(event.timestamp, event.isolate);
return new GCEvent(event.timestamp!, event.isolate!);
case S.ServiceEvent.kServiceRegistered:
return new ServiceRegisteredEvent(
event.timestamp, event.service, event.method, event.alias);
event.timestamp!, event.service!, event.method!, event.alias!);
case S.ServiceEvent.kServiceUnregistered:
return new ServiceUnregisteredEvent(
event.timestamp, event.service, event.method);
event.timestamp!, event.service!, event.method!);
case S.ServiceEvent.kNone:
return new NoneEvent(event.timestamp, event.isolate);
return new NoneEvent(event.timestamp!, event.isolate!);
default:
// Ignore unrecognized events.
Logger.root.severe('Unrecognized event: $event');

View file

@ -22,7 +22,7 @@ abstract class SnapshotReader {
class _SnapshotReader implements SnapshotReader {
bool _closed = false;
var _chunks = <Uint8List>[];
List<Uint8List>? _chunks = <Uint8List>[];
final _onProgress = new StreamController<String>.broadcast();
final _done = new Completer<SnapshotGraph>();
@ -32,8 +32,8 @@ class _SnapshotReader implements SnapshotReader {
if (_closed) {
throw new StateError("Stream is closed");
}
_chunks.add(chunk);
_onProgress.add("Receiving snapshot chunk ${_chunks.length}...");
_chunks!.add(chunk);
_onProgress.add("Receiving snapshot chunk ${_chunks!.length}...");
// TODO(rmacnak): Incremental loading.
}
@ -45,7 +45,7 @@ class _SnapshotReader implements SnapshotReader {
_closed = true;
var graph = new _SnapshotGraph._new();
var chunks = _chunks;
var chunks = _chunks!;
_chunks = null; // Let the binary chunks be GCable.
_done.complete(graph._load(chunks, _onProgress));
return _done.future;
@ -270,39 +270,39 @@ class _SnapshotObject implements SnapshotObject {
int get hashCode => _id ^ _graph.hashCode;
int get shallowSize => internalSize + externalSize;
int get internalSize => _graph._internalSizes[_id];
int get externalSize => _graph._externalSizes[_id];
int get retainedSize => _graph._retainedSizes[_id];
int get internalSize => _graph._internalSizes![_id];
int get externalSize => _graph._externalSizes![_id];
int get retainedSize => _graph._retainedSizes![_id];
String get description => _graph._describeObject(_id);
SnapshotClass get klass => _graph._classes[_graph._cids[_id]];
SnapshotClass get klass => _graph._classes![_graph._cids![_id]]!;
Iterable<SnapshotObject> get successors sync* {
final id = _id;
final cid = _graph._cids[id];
final startSuccIndex = _graph._firstSuccs[id];
final limitSuccIndex = _graph._firstSuccs[id + 1];
final cid = _graph._cids![id];
final startSuccIndex = _graph._firstSuccs![id];
final limitSuccIndex = _graph._firstSuccs![id + 1];
for (var nextSuccIndex = startSuccIndex;
nextSuccIndex < limitSuccIndex;
nextSuccIndex++) {
final index = nextSuccIndex - startSuccIndex;
final succId = _graph._succs[nextSuccIndex];
final succId = _graph._succs![nextSuccIndex];
final name = _graph._edgeName(cid, index);
yield _SnapshotObject._new(succId, _graph, name);
}
}
Iterable<SnapshotObject> get predecessors sync* {
var firstSuccs = _graph._firstSuccs;
var succs = _graph._succs;
var firstSuccs = _graph._firstSuccs!;
var succs = _graph._succs!;
var id = _id;
var N = _graph._N;
var N = _graph._N!;
for (var predId = 1; predId <= N; predId++) {
var base = firstSuccs[predId];
var limit = firstSuccs[predId + 1];
for (var i = base; i < limit; i++) {
if (succs[i] == id) {
var cid = _graph._cids[predId];
var cid = _graph._cids![predId];
var name = _graph._edgeName(cid, i - base);
yield _SnapshotObject._new(predId, _graph, name);
}
@ -314,12 +314,12 @@ class _SnapshotObject implements SnapshotObject {
if (_id == _ROOT) {
return this;
}
return _SnapshotObject._new(_graph._doms[_id], _graph, "");
return _SnapshotObject._new(_graph._doms![_id], _graph, "");
}
Iterable<SnapshotObject> get children sync* {
var N = _graph._N;
var doms = _graph._doms;
var N = _graph._N!;
var doms = _graph._doms!;
var parentId = _id;
for (var childId = _ROOT; childId <= N; childId++) {
if (doms[childId] == parentId) {
@ -334,17 +334,17 @@ class _SnapshotObject implements SnapshotObject {
}
class _SyntheticSnapshotObject implements SnapshotObject {
String _description;
SnapshotClass _klass;
int _internalSize;
int _externalSize;
int _retainedSize;
List<SnapshotObject> _successors;
List<SnapshotObject> _predecessors;
SnapshotObject _parent;
List<SnapshotObject> _children;
late String _description;
late SnapshotClass _klass;
late int _internalSize;
late int _externalSize;
late int _retainedSize;
late List<SnapshotObject> _successors;
late List<SnapshotObject> _predecessors;
late SnapshotObject _parent;
late List<SnapshotObject> _children;
String get label => null;
String get label => "";
String get description => _description;
SnapshotClass get klass => _klass;
@ -404,7 +404,7 @@ abstract class SnapshotMergedDominator {
class _SnapshotMergedDominator implements SnapshotMergedDominator {
final int _id;
final _SnapshotGraph _graph;
final _SnapshotMergedDominator _parent;
final _SnapshotMergedDominator? _parent;
_SnapshotMergedDominator._new(this._id, this._graph, this._parent);
@ -423,70 +423,78 @@ class _SnapshotMergedDominator implements SnapshotMergedDominator {
: "$instanceCount instances of ${klass.name}";
}
SnapshotClass get klass => _graph._classes[_graph._cids[_id]];
SnapshotClass get klass => _graph._classes![_graph._cids![_id]]!;
int get shallowSize => internalSize + externalSize;
int get internalSize {
var cids = _graph._cids;
var cids = _graph._cids!;
var internalSizes = _graph._internalSizes!;
var mergedDomNext = _graph._mergedDomNext!;
var size = 0;
var sibling = _id;
while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
size += _graph._internalSizes[sibling];
sibling = _graph._mergedDomNext[sibling];
size += internalSizes[sibling];
sibling = mergedDomNext[sibling];
}
return size;
}
int get externalSize {
var cids = _graph._cids;
var cids = _graph._cids!;
var externalSizes = _graph._externalSizes!;
var mergedDomNext = _graph._mergedDomNext!;
var size = 0;
var sibling = _id;
while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
size += _graph._externalSizes[sibling];
sibling = _graph._mergedDomNext[sibling];
size += externalSizes[sibling];
sibling = mergedDomNext[sibling];
}
return size;
}
int get retainedSize {
var cids = _graph._cids;
var cids = _graph._cids!;
var retainedSizes = _graph._retainedSizes!;
var mergedDomNext = _graph._mergedDomNext!;
var size = 0;
var sibling = _id;
while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
size += _graph._retainedSizes[sibling];
sibling = _graph._mergedDomNext[sibling];
size += retainedSizes[sibling];
sibling = mergedDomNext[sibling];
}
return size;
}
int get instanceCount {
var cids = _graph._cids;
var cids = _graph._cids!;
var mergedDomNext = _graph._mergedDomNext!;
var count = 0;
var sibling = _id;
while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
count++;
sibling = _graph._mergedDomNext[sibling];
sibling = mergedDomNext[sibling];
}
return count;
}
Iterable<SnapshotObject> get objects sync* {
var cids = _graph._cids;
var cids = _graph._cids!;
var mergedDomNext = _graph._mergedDomNext!;
var sibling = _id;
while (sibling != _SENTINEL && cids[sibling] == cids[_id]) {
yield _SnapshotObject._new(sibling, _graph, "");
sibling = _graph._mergedDomNext[sibling];
sibling = mergedDomNext[sibling];
}
}
SnapshotMergedDominator get parent => _parent ?? this;
Iterable<SnapshotMergedDominator> get children sync* {
var next = _graph._mergedDomNext;
var cids = _graph._cids;
var next = _graph._mergedDomNext!;
var cids = _graph._cids!;
var prev = _SENTINEL;
var child = _graph._mergedDomHead[_id];
var child = _graph._mergedDomHead![_id];
// Walk the list of children and look for the representative objects, i.e.
// the first sibling of each cid.
while (child != _SENTINEL) {
@ -500,14 +508,14 @@ class _SnapshotMergedDominator implements SnapshotMergedDominator {
}
class _SyntheticSnapshotMergedDominator implements SnapshotMergedDominator {
String _description;
SnapshotClass _klass;
int _internalSize;
int _externalSize;
int _retainedSize;
List<SnapshotObject> _objects;
SnapshotMergedDominator _parent;
List<SnapshotMergedDominator> _children;
late String _description;
late SnapshotClass _klass;
late int _internalSize;
late int _externalSize;
late int _retainedSize;
late List<SnapshotObject> _objects;
late SnapshotMergedDominator _parent;
late List<SnapshotMergedDominator> _children;
SnapshotClass get klass => _klass;
String get description => _description;
@ -560,9 +568,11 @@ class _SnapshotClass implements SnapshotClass {
int get instanceCount => liveInstanceCount;
Iterable<SnapshotObject> get instances sync* {
final N = _graph._N;
final N = _graph._N!;
final cids = _graph._cids!;
final retainedSizes = _graph._retainedSizes!;
for (var id = 1; id <= N; id++) {
if (_graph._cids[id] == _cid && _graph._retainedSizes[id] > 0) {
if (cids[id] == _cid && retainedSizes[id] > 0) {
yield _SnapshotObject._new(id, _graph, "");
}
}
@ -613,36 +623,36 @@ const _kRootName = "Live Objects + External";
const _kUnknownFieldName = "<unknown>";
class _SnapshotGraph implements SnapshotGraph {
List<Uint8List> _chunks;
List<Uint8List> get chunks => _chunks;
List<Uint8List>? _chunks;
List<Uint8List> get chunks => _chunks!;
_SnapshotGraph._new();
String get description => _description;
String get description => _description!;
int get size => _liveInternalSize + _liveExternalSize;
int get internalSize => _liveInternalSize;
int get externalSize => _liveExternalSize;
int get capacity => _capacity;
int get size => _liveInternalSize! + _liveExternalSize!;
int get internalSize => _liveInternalSize!;
int get externalSize => _liveExternalSize!;
int get capacity => _capacity!;
SnapshotObject get root => _SnapshotObject._new(_ROOT, this, "Root");
SnapshotMergedDominator get mergedRoot =>
_SnapshotMergedDominator._new(_ROOT, this, null);
SnapshotObject _extendedRoot;
SnapshotObject? _extendedRoot;
SnapshotObject get extendedRoot {
if (_extendedRoot == null) {
_createExtended();
}
return _extendedRoot;
return _extendedRoot!;
}
SnapshotMergedDominator _extendedMergedRoot;
SnapshotMergedDominator? _extendedMergedRoot;
SnapshotMergedDominator get extendedMergedRoot {
if (_extendedMergedRoot == null) {
_createExtended();
}
return _extendedMergedRoot;
return _extendedMergedRoot!;
}
void _createExtended() {
@ -657,8 +667,8 @@ class _SnapshotGraph implements SnapshotGraph {
capacity._description = "Capacity + External";
capacity._klass = live.klass;
capacity._internalSize = _capacity;
capacity._externalSize = _totalExternalSize;
capacity._internalSize = _capacity!;
capacity._externalSize = _totalExternalSize!;
capacity._retainedSize = capacity._internalSize + capacity._externalSize;
capacity._successors = <SnapshotObject>[live, uncollected, fragmentation];
capacity._predecessors = <SnapshotObject>[];
@ -666,8 +676,8 @@ class _SnapshotGraph implements SnapshotGraph {
mcapacity._description = "Capacity + External";
mcapacity._klass = mlive.klass;
mcapacity._internalSize = _capacity;
mcapacity._externalSize = _totalExternalSize;
mcapacity._internalSize = _capacity!;
mcapacity._externalSize = _totalExternalSize!;
mcapacity._retainedSize = mcapacity._internalSize + mcapacity._externalSize;
mcapacity._children = <SnapshotMergedDominator>[
mlive,
@ -678,8 +688,8 @@ class _SnapshotGraph implements SnapshotGraph {
uncollected._description = "Uncollected Garbage";
uncollected._klass = live.klass;
uncollected._internalSize = _totalInternalSize - _liveInternalSize;
uncollected._externalSize = _totalExternalSize - _liveExternalSize;
uncollected._internalSize = _totalInternalSize! - _liveInternalSize!;
uncollected._externalSize = _totalExternalSize! - _liveExternalSize!;
uncollected._retainedSize =
uncollected._internalSize + uncollected._externalSize;
uncollected._successors = <SnapshotObject>[];
@ -689,8 +699,8 @@ class _SnapshotGraph implements SnapshotGraph {
muncollected._description = "Uncollected Garbage";
muncollected._klass = mlive.klass;
muncollected._internalSize = _totalInternalSize - _liveInternalSize;
muncollected._externalSize = _totalExternalSize - _liveExternalSize;
muncollected._internalSize = _totalInternalSize! - _liveInternalSize!;
muncollected._externalSize = _totalExternalSize! - _liveExternalSize!;
muncollected._retainedSize =
muncollected._internalSize + muncollected._externalSize;
muncollected._parent = mcapacity;
@ -699,7 +709,7 @@ class _SnapshotGraph implements SnapshotGraph {
fragmentation._description = "Free";
fragmentation._klass = live.klass;
fragmentation._internalSize = _capacity - _totalInternalSize;
fragmentation._internalSize = _capacity! - _totalInternalSize!;
fragmentation._externalSize = 0;
fragmentation._retainedSize = fragmentation._internalSize;
fragmentation._successors = <SnapshotObject>[];
@ -709,7 +719,7 @@ class _SnapshotGraph implements SnapshotGraph {
mfragmentation._description = "Free";
mfragmentation._klass = mlive.klass;
mfragmentation._internalSize = _capacity - _totalInternalSize;
mfragmentation._internalSize = _capacity! - _totalInternalSize!;
mfragmentation._externalSize = 0;
mfragmentation._retainedSize = mfragmentation._internalSize;
mfragmentation._parent = mcapacity;
@ -721,9 +731,10 @@ class _SnapshotGraph implements SnapshotGraph {
}
Iterable<SnapshotObject> get objects sync* {
final N = _N;
final N = _N!;
final retainedSizes = _retainedSizes!;
for (var id = 1; id <= N; id++) {
if (_retainedSizes[id] > 0) {
if (retainedSizes[id] > 0) {
yield _SnapshotObject._new(id, this, "");
}
}
@ -737,7 +748,7 @@ class _SnapshotGraph implements SnapshotGraph {
return _kRootName;
}
var cls = _className(oid);
var data = _nonReferenceData[oid];
var data = _nonReferenceData![oid];
if (data == null) {
return cls;
} else {
@ -746,8 +757,8 @@ class _SnapshotGraph implements SnapshotGraph {
}
String _className(int oid) {
var cid = _cids[oid];
var cls = _classes[cid];
var cid = _cids![oid];
var cls = _classes![cid];
if (cls == null) {
return "Class$cid";
}
@ -755,7 +766,7 @@ class _SnapshotGraph implements SnapshotGraph {
}
String _edgeName(int cid, int index) {
var c = _classes[cid];
var c = _classes![cid];
if (c == null) {
return _kUnknownFieldName;
}
@ -767,7 +778,7 @@ class _SnapshotGraph implements SnapshotGraph {
}
Iterable<SnapshotClass> get classes sync* {
for (final c in _classes) {
for (final c in _classes!) {
// Not all CIDs are occupied.
if (c != null) {
yield c;
@ -776,9 +787,9 @@ class _SnapshotGraph implements SnapshotGraph {
}
Future<SnapshotGraph> _load(
List<Uint8List> chunks, StreamController<String> onProgress) async {
List<Uint8List>? chunks, StreamController<String> onProgress) async {
_chunks = chunks;
var stream = _ReadStream._new(chunks);
_ReadStream? stream = _ReadStream._new(chunks!);
chunks = null;
// The phases of loading are placed in explicit `new Future(compuation)` so
@ -786,13 +797,13 @@ class _SnapshotGraph implements SnapshotGraph {
// defer to the microtask loop.
onProgress.add("Loading classes...");
await new Future(() => _readClasses(stream));
await new Future(() => _readClasses(stream!));
onProgress.add("Loading objects...");
await new Future(() => _readObjects(stream));
await new Future(() => _readObjects(stream!));
onProgress.add("Loading external properties...");
await new Future(() => _readExternalProperties(stream));
await new Future(() => _readExternalProperties(stream!));
stream = null;
@ -839,46 +850,46 @@ class _SnapshotGraph implements SnapshotGraph {
return this;
}
Uint8List _encoded;
Uint8List? _encoded;
String _description;
String? _description;
int _kStackCid;
int _kFieldCid;
int _numCids;
int _N; // Objects in the snapshot.
int _Nconnected; // Objects reachable from root.
int _E; // References in the snapshot.
int? _kStackCid;
int? _kFieldCid;
int? _numCids;
int? _N; // Objects in the snapshot.
int? _Nconnected; // Objects reachable from root.
int? _E; // References in the snapshot.
int _capacity;
int _liveInternalSize;
int _liveExternalSize;
int _totalInternalSize;
int _totalExternalSize;
int? _capacity;
int? _liveInternalSize;
int? _liveExternalSize;
int? _totalInternalSize;
int? _totalExternalSize;
List<_SnapshotClass> _classes;
List<_SnapshotClass?>? _classes;
// Indexed by node id, with id 0 representing invalid/uninitialized.
// From snapshot.
List _nonReferenceData;
Uint16List _cids;
Uint32List _internalSizes;
Uint32List _externalSizes;
Uint32List _firstSuccs;
Uint32List _succs;
List? _nonReferenceData;
Uint16List? _cids;
Uint32List? _internalSizes;
Uint32List? _externalSizes;
Uint32List? _firstSuccs;
Uint32List? _succs;
// Intermediates.
Uint32List _vertex;
Uint32List _parent;
Uint32List _semi;
Uint32List _firstPreds; // Offset into preds.
Uint32List _preds;
Uint32List? _vertex;
Uint32List? _parent;
Uint32List? _semi;
Uint32List? _firstPreds; // Offset into preds.
Uint32List? _preds;
// Outputs.
Uint32List _doms;
Uint32List _retainedSizes;
Uint32List _mergedDomHead;
Uint32List _mergedDomNext;
Uint32List? _doms;
Uint32List? _retainedSizes;
Uint32List? _mergedDomHead;
Uint32List? _mergedDomNext;
void _readClasses(_ReadStream stream) {
for (var i = 0; i < 8; i++) {
@ -892,7 +903,7 @@ class _SnapshotGraph implements SnapshotGraph {
_totalExternalSize = stream.readUnsigned();
var K = stream.readUnsigned();
var classes = new List<_SnapshotClass>.filled(K + 1, null);
var classes = new List<_SnapshotClass?>.filled(K + 1, null);
classes[0] = _SnapshotClass._new(this, 0, "Root", "", "");
for (var cid = 1; cid <= K; cid++) {
@ -935,7 +946,7 @@ class _SnapshotGraph implements SnapshotGraph {
var internalSizes = _newUint32Array(N + 1);
var cids = _newUint16Array(N + 1);
var nonReferenceData = new List(N + 1);
var nonReferenceData = new List<dynamic>.filled(N + 1, null);
var firstSuccs = _newUint32Array(N + 2);
var succs = _newUint32Array(E);
var eid = 0;
@ -1011,7 +1022,7 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _readExternalProperties(_ReadStream stream) {
final N = _N;
final N = _N!;
final externalPropertyCount = stream.readUnsigned();
final externalSizes = _newUint32Array(N + 1);
@ -1026,11 +1037,11 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _computeClassTable() {
final N = _N;
final classes = _classes;
final cids = _cids;
final internalSizes = _internalSizes;
final externalSizes = _externalSizes;
final N = _N!;
final classes = _classes!;
final cids = _cids!;
final internalSizes = _internalSizes!;
final externalSizes = _externalSizes!;
var totalInternalSize = 0;
var totalExternalSize = 0;
@ -1041,7 +1052,7 @@ class _SnapshotGraph implements SnapshotGraph {
var externalSize = externalSizes[oid];
totalExternalSize += externalSize;
var cls = classes[cids[oid]];
var cls = classes[cids[oid]]!;
cls.totalInternalSize += internalSize;
cls.totalExternalSize += externalSize;
cls.totalInstanceCount++;
@ -1052,9 +1063,9 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _dfs() {
final N = _N;
final firstSuccs = _firstSuccs;
final succs = _succs;
final N = _N!;
final firstSuccs = _firstSuccs!;
final succs = _succs!;
final stackNodes = _newUint32Array(N);
final stackCurrentEdgePos = _newUint32Array(N);
@ -1142,11 +1153,11 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _buildPredecessors() {
final N = _N;
final Nconnected = _Nconnected;
final E = _E;
final firstSuccs = _firstSuccs;
final succs = _succs;
final N = _N!;
final Nconnected = _Nconnected!;
final E = _E!;
final firstSuccs = _firstSuccs!;
final succs = _succs!;
// This is first filled with the predecessor counts, then reused to hold the
// offset to the first predecessor (see alias below).
@ -1201,17 +1212,17 @@ class _SnapshotGraph implements SnapshotGraph {
// Fold the size of any object with in-degree(1) into its parent.
// Requires the DFS numbering and predecessor lists.
void _buildOwnedSizes() {
final N = _N;
final Nconnected = _Nconnected;
final N = _N!;
final Nconnected = _Nconnected!;
final kStackCid = _kStackCid;
final kFieldCid = _kFieldCid;
final cids = _cids;
final internalSizes = _internalSizes;
final externalSizes = _externalSizes;
final vertex = _vertex;
final firstPreds = _firstPreds;
final preds = _preds;
final cids = _cids!;
final internalSizes = _internalSizes!;
final externalSizes = _externalSizes!;
final vertex = _vertex!;
final firstPreds = _firstPreds!;
final preds = _preds!;
final ownedSizes = _newUint32Array(N + 1);
for (var i = 1; i <= Nconnected; i++) {
@ -1256,11 +1267,11 @@ class _SnapshotGraph implements SnapshotGraph {
// TODO(rmacnak): Maybe keep the per-objects sizes to be able to provide
// examples of large owners for each class.
final classes = _classes;
final classes = _classes!;
for (var i = 1; i <= Nconnected; i++) {
final v = vertex[i];
final cid = cids[v];
final cls = classes[cid];
final cls = classes[cid]!;
cls.ownedSize += ownedSizes[v];
}
}
@ -1342,14 +1353,14 @@ class _SnapshotGraph implements SnapshotGraph {
// T. Lengauer and R. E. Tarjan. "A Fast Algorithm for Finding Dominators
// in a Flowgraph."
void _buildDominators() {
final N = _N;
final Nconnected = _Nconnected;
final N = _N!;
final Nconnected = _Nconnected!;
final vertex = _vertex;
final semi = _semi;
final parent = _parent;
final firstPreds = _firstPreds;
final preds = _preds;
final vertex = _vertex!;
final semi = _semi!;
final parent = _parent!;
final firstPreds = _firstPreds!;
final preds = _preds!;
final dom = _newUint32Array(N + 1);
@ -1358,7 +1369,7 @@ class _SnapshotGraph implements SnapshotGraph {
for (var i = 1; i <= N; i++) {
label[i] = i;
}
final buckets = new List(N + 1);
final buckets = new List<dynamic>.filled(N + 1, null);
final child = _newUint32Array(N + 1);
final size = _newUint32Array(N + 1);
for (var i = 1; i <= N; i++) {
@ -1385,7 +1396,7 @@ class _SnapshotGraph implements SnapshotGraph {
// w.semi.bucket.add(w);
var tmp = vertex[semi[w]];
if (buckets[tmp] == null) {
buckets[tmp] = new List();
buckets[tmp] = [];
}
buckets[tmp].add(w);
@ -1417,17 +1428,17 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _calculateRetainedSizes() {
final N = _N;
final Nconnected = _Nconnected;
final N = _N!;
final Nconnected = _Nconnected!;
var liveInternalSize = 0;
var liveExternalSize = 0;
final classes = _classes;
final cids = _cids;
final internalSizes = _internalSizes;
final externalSizes = _externalSizes;
final vertex = _vertex;
final doms = _doms;
final classes = _classes!;
final cids = _cids!;
final internalSizes = _internalSizes!;
final externalSizes = _externalSizes!;
final vertex = _vertex!;
final doms = _doms!;
// Sum internal and external sizes.
for (var i = 1; i <= Nconnected; i++) {
@ -1437,7 +1448,7 @@ class _SnapshotGraph implements SnapshotGraph {
liveInternalSize += internalSize;
liveExternalSize += externalSize;
var cls = classes[cids[v]];
var cls = classes[cids[v]]!;
cls.liveInternalSize += internalSize;
cls.liveExternalSize += externalSize;
cls.liveInstanceCount++;
@ -1468,18 +1479,18 @@ class _SnapshotGraph implements SnapshotGraph {
_liveInternalSize = liveInternalSize;
_liveExternalSize = liveExternalSize;
print("internal-garbage: ${_totalInternalSize - _liveInternalSize}");
print("external-garbage: ${_totalExternalSize - _liveExternalSize}");
print("fragmentation: ${_capacity - _totalInternalSize}");
assert(_liveInternalSize <= _totalInternalSize);
assert(_liveExternalSize <= _totalExternalSize);
assert(_totalInternalSize <= _capacity);
print("internal-garbage: ${_totalInternalSize! - _liveInternalSize!}");
print("external-garbage: ${_totalExternalSize! - _liveExternalSize!}");
print("fragmentation: ${_capacity! - _totalInternalSize!}");
assert(_liveInternalSize! <= _totalInternalSize!);
assert(_liveExternalSize! <= _totalExternalSize!);
assert(_totalInternalSize! <= _capacity!);
}
// Build linked lists of the children for each node in the dominator tree.
void _linkDominatorChildren() {
final N = _N;
final doms = _doms;
final N = _N!;
final doms = _doms!;
final head = _newUint32Array(N + 1);
final next = _newUint32Array(N + 1);
@ -1533,10 +1544,10 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _sortDominatorChildren() {
final N = _N;
final cids = _cids;
final head = _mergedDomHead;
final next = _mergedDomNext;
final N = _N!;
final cids = _cids!;
final head = _mergedDomHead!;
final next = _mergedDomNext!;
// Returns the new head of the sorted list.
int sort(int head) {
@ -1570,10 +1581,10 @@ class _SnapshotGraph implements SnapshotGraph {
}
void _mergeDominatorSiblings() {
var N = _N;
var cids = _cids;
var head = _mergedDomHead;
var next = _mergedDomNext;
var N = _N!;
var cids = _cids!;
var head = _mergedDomHead!;
var next = _mergedDomNext!;
var workStack = _newUint32Array(N);
var workStackTop = 0;

View file

@ -26,9 +26,9 @@ class WebSocketVMTarget implements M.Target {
bool get standalone => !chrome;
// User defined name.
String name;
late String name;
// Network address of VM.
String networkAddress;
late String networkAddress;
WebSocketVMTarget(this.networkAddress) {
name = networkAddress;
@ -89,7 +89,7 @@ abstract class CommonWebSocketVM extends VM {
String get displayName => '${name}@${target.name}';
CommonWebSocket _webSocket;
CommonWebSocket? _webSocket;
CommonWebSocketVM(this.target, this._webSocket) {
assert(target != null);
@ -120,7 +120,7 @@ abstract class CommonWebSocketVM extends VM {
void disconnect({String reason: 'WebSocket closed'}) {
if (_hasInitiatedConnect) {
if (_webSocket != null) {
_webSocket.close();
_webSocket!.close();
}
}
// We don't need to cancel requests and notify here. These
@ -135,8 +135,8 @@ abstract class CommonWebSocketVM extends VM {
if (!_hasInitiatedConnect) {
_hasInitiatedConnect = true;
try {
await _webSocket.connect(
target, _onOpen, _onMessage, _onError, _onClose);
await _webSocket!
.connect(target, _onOpen, _onMessage, _onError, _onClose);
} catch (_, stack) {
_webSocket = null;
var exception = new NetworkRpcException('WebSocket closed');
@ -150,7 +150,7 @@ abstract class CommonWebSocketVM extends VM {
}
String serial = (_requestSerial++).toString();
var request = new _WebSocketRequest(method, params);
if ((_webSocket != null) && _webSocket.isOpen) {
if ((_webSocket != null) && _webSocket!.isOpen) {
// Already connected, send request immediately.
_sendRequest(serial, request);
} else {
@ -180,7 +180,7 @@ abstract class CommonWebSocketVM extends VM {
_notifyConnect();
}
Map _parseJSON(String message) {
Map? _parseJSON(String message) {
var map;
try {
map = json.decode(message);
@ -198,7 +198,7 @@ abstract class CommonWebSocketVM extends VM {
}
void _onBinaryMessage(dynamic data) {
_webSocket.nonStringToByteData(data).then((ByteData bytes) {
_webSocket!.nonStringToByteData(data).then((ByteData bytes) {
var metadataOffset = 4;
var dataOffset = bytes.getUint32(0, Endian.little);
var metadataLength = dataOffset - metadataOffset;
@ -292,7 +292,7 @@ abstract class CommonWebSocketVM extends VM {
/// Send all delayed requests.
void _sendAllDelayedRequests() {
assert(_webSocket.isOpen);
assert(_webSocket!.isOpen);
if (_delayedRequests.length == 0) {
return;
}
@ -305,7 +305,7 @@ abstract class CommonWebSocketVM extends VM {
/// Send the request over WebSocket.
void _sendRequest(String serial, _WebSocketRequest request) {
assert(_webSocket.isOpen);
assert(_webSocket!.isOpen);
// Mark request as pending.
assert(_pendingRequests.containsKey(serial) == false);
_pendingRequests[serial] = request;
@ -332,7 +332,7 @@ abstract class CommonWebSocketVM extends VM {
'GET [${serial}] ${request.method}(${request.params}) from ${target.networkAddress}');
}
// Send message.
_webSocket.send(message);
_webSocket!.send(message);
}
String toString() => displayName;

View file

@ -15,7 +15,7 @@ import 'package:observatory/service_common.dart';
export 'package:observatory/service_common.dart';
class _HtmlWebSocket implements CommonWebSocket {
WebSocket _webSocket;
WebSocket? _webSocket;
Future<void> connect(WebSocketVMTarget target, void onOpen(),
void onMessage(dynamic data), void onError(), void onClose()) async {
@ -43,20 +43,20 @@ class _HtmlWebSocket implements CommonWebSocket {
target.networkAddress = response['result']['uri'];
*/
_webSocket = new WebSocket(target.networkAddress);
_webSocket.onClose.listen((CloseEvent) => onClose());
_webSocket.onError.listen((Event) => onError());
_webSocket.onOpen.listen((Event) => onOpen());
_webSocket.onMessage.listen((MessageEvent event) => onMessage(event.data));
_webSocket!.onClose.listen((CloseEvent) => onClose());
_webSocket!.onError.listen((Event) => onError());
_webSocket!.onOpen.listen((Event) => onOpen());
_webSocket!.onMessage.listen((MessageEvent event) => onMessage(event.data));
}
bool get isOpen => _webSocket.readyState == WebSocket.OPEN;
bool get isOpen => _webSocket!.readyState == WebSocket.OPEN;
void send(dynamic data) {
_webSocket.send(data);
_webSocket!.send(data);
}
void close() {
_webSocket.close();
_webSocket!.close();
}
Future<ByteData> nonStringToByteData(dynamic data) {

View file

@ -15,13 +15,13 @@ import 'package:observatory/service_common.dart';
export 'package:observatory/service_common.dart';
class _IOWebSocket implements CommonWebSocket {
WebSocket _webSocket;
WebSocket? _webSocket;
Future<void> connect(WebSocketVMTarget target, void onOpen(),
void onMessage(dynamic data), void onError(), void onClose()) async {
try {
_webSocket = await WebSocket.connect(target.networkAddress);
_webSocket.listen(onMessage,
_webSocket!.listen(onMessage,
onError: (dynamic) => onError(),
onDone: onClose,
cancelOnError: true);
@ -32,16 +32,14 @@ class _IOWebSocket implements CommonWebSocket {
}
bool get isOpen =>
(_webSocket != null) && (_webSocket.readyState == WebSocket.open);
(_webSocket != null) && (_webSocket!.readyState == WebSocket.open);
void send(dynamic data) {
_webSocket.add(data);
_webSocket!.add(data);
}
void close() {
if (_webSocket != null) {
_webSocket.close();
}
_webSocket?.close();
}
Future<ByteData> nonStringToByteData(dynamic data) {

View file

@ -6,15 +6,16 @@ part of allocation_profiler;
class AllocationProfile implements M.AllocationProfile {
static const _lastServiceGC = 'dateLastServiceGC';
final DateTime lastServiceGC;
final DateTime? lastServiceGC;
static const _lastAccumulatorReset = 'dateLastAccumulatorReset';
final DateTime lastAccumulatorReset;
final DateTime? lastAccumulatorReset;
final S.HeapSpace newSpace;
final S.HeapSpace oldSpace;
final S.HeapSpace totalSpace;
final Iterable<M.ClassHeapStats> members;
AllocationProfile(S.ServiceMap map, {Map/*<String, List<String>>*/ defaults})
AllocationProfile(S.ServiceMap map,
{Map/*<String, List<String>>*/ ? defaults})
: lastAccumulatorReset = _intString2DateTime(map[_lastAccumulatorReset]),
lastServiceGC = _intString2DateTime(map[_lastServiceGC]),
oldSpace = new S.HeapSpace()..update(map['_heaps']['old']),
@ -25,7 +26,7 @@ class AllocationProfile implements M.AllocationProfile {
totalSpace.add(newSpace);
}
static DateTime _intString2DateTime(String milliseconds) {
static DateTime? _intString2DateTime(String milliseconds) {
if ((milliseconds == null) || milliseconds == '') {
return null;
}
@ -38,7 +39,7 @@ class AllocationProfile implements M.AllocationProfile {
}
static List<M.ClassHeapStats> _convertMembers(Iterable/*<S.ServiceMap>*/ raw,
{Map/*<String, List<String>>*/ defaults}) {
{Map/*<String, List<String>>*/ ? defaults}) {
final List<M.ClassHeapStats> members =
raw.map<ClassHeapStats>(_convertMember).toList();
if (defaults == null) {
@ -49,26 +50,26 @@ class AllocationProfile implements M.AllocationProfile {
final Map<String, List<ClassHeapStats>> accumulators =
<String, List<ClassHeapStats>>{};
defaults.forEach((/*String*/ key, /*List<String>*/ values) {
final classes = aliases[key];
final classes = aliases[key]!;
accumulators.addAll(new Map.fromIterable(values, value: (_) => classes));
});
final List<M.ClassHeapStats> result = <M.ClassHeapStats>[];
members.forEach((M.ClassHeapStats member) {
if (accumulators.containsKey(member.clazz.id)) {
accumulators[member.clazz.id].add(member);
if (accumulators.containsKey(member.clazz!.id)) {
accumulators[member.clazz!.id]!.add(member as ClassHeapStats);
} else {
result.add(member);
result.add(member as ClassHeapStats);
}
});
return result
..addAll(
aliases.keys.map((key) => new ClassesHeapStats(key, aliases[key])));
aliases.keys.map((key) => new ClassesHeapStats(key, aliases[key]!)));
}
}
class ClassHeapStats implements M.ClassHeapStats {
final S.Class clazz;
final String displayName = null;
final S.Class? clazz;
final String? displayName = null;
final S.Allocations newSpace;
final S.Allocations oldSpace;
@ -79,8 +80,8 @@ class ClassHeapStats implements M.ClassHeapStats {
}
class ClassesHeapStats implements M.ClassHeapStats {
final S.Class clazz = null;
final String displayName;
final S.Class? clazz = null;
final String? displayName;
final S.Allocations newSpace;
final S.Allocations oldSpace;

View file

@ -7,30 +7,30 @@ part of app;
/// The observatory application. Instances of this are created and owned
/// by the observatory_application custom element.
class ObservatoryApplication {
static ObservatoryApplication app;
static late ObservatoryApplication app;
final RenderingQueue queue = new RenderingQueue();
final TargetRepository targets = new TargetRepository(isConnectedVMTarget);
final EventRepository events = new EventRepository();
final NotificationRepository notifications = new NotificationRepository();
final _pageRegistry = <Page>[];
LocationManager _locationManager;
late LocationManager _locationManager;
LocationManager get locationManager => _locationManager;
Page currentPage;
Page? currentPage;
bool _vmConnected = false;
VM _vm;
VM get vm => _vm;
VM? _vm;
VM get vm => _vm!;
static bool isConnectedVMTarget(M.Target target) {
if (app._vm is CommonWebSocketVM) {
if ((app._vm as CommonWebSocketVM).target == target) {
return app._vm.isConnected;
return app._vm!.isConnected;
}
}
return false;
}
_switchVM(VM newVM) {
final VM oldVM = _vm;
_switchVM(VM? newVM) {
final VM? oldVM = _vm;
Logger.root.info('_switchVM from:${oldVM} to:${newVM}');
@ -89,14 +89,14 @@ class ObservatoryApplication {
_vm = newVM;
}
StreamSubscription _gcSubscription;
StreamSubscription _loggingSubscription;
StreamSubscription? _gcSubscription;
StreamSubscription? _loggingSubscription;
Future startGCEventListener() async {
if (_gcSubscription != null || _vm == null) {
return;
}
_gcSubscription = await _vm.listenEventStream(VM.kGCStream, _onEvent);
_gcSubscription = await _vm!.listenEventStream(VM.kGCStream, _onEvent);
}
Future startLoggingEventListener() async {
@ -104,14 +104,14 @@ class ObservatoryApplication {
return;
}
_loggingSubscription =
await _vm.listenEventStream(Isolate.kLoggingStream, _onEvent);
await _vm!.listenEventStream(Isolate.kLoggingStream, _onEvent);
}
Future stopGCEventListener() async {
if (_gcSubscription == null) {
return;
}
_gcSubscription.cancel();
_gcSubscription!.cancel();
_gcSubscription = null;
}
@ -119,16 +119,15 @@ class ObservatoryApplication {
if (_loggingSubscription == null) {
return;
}
_loggingSubscription.cancel();
_loggingSubscription!.cancel();
_loggingSubscription = null;
}
final ObservatoryApplicationElement rootElement;
ServiceObject lastErrorOrException;
ServiceObject? lastErrorOrException;
void _initOnce() {
assert(app == null);
app = this;
_registerPages();
// Visit the current page.
@ -145,7 +144,7 @@ class ObservatoryApplication {
void _onEvent(ServiceEvent event) {
assert(event.kind != ServiceEvent.kNone);
M.Event e = createEventFromServiceEvent(event);
M.Event? e = createEventFromServiceEvent(event);
if (e != null) {
events.add(e);
}
@ -179,7 +178,7 @@ class ObservatoryApplication {
_pageRegistry.add(new ErrorPage(this));
}
void _visit(Uri uri, Map internalArguments) {
void _visit(Uri uri, Map<String, String> internalArguments) {
if (internalArguments['trace'] != null) {
var traceArg = internalArguments['trace'];
if (traceArg == 'on') {
@ -189,7 +188,7 @@ class ObservatoryApplication {
}
}
if (Tracer.current != null) {
Tracer.current.reset();
Tracer.current!.reset();
}
for (var i = 0; i < _pageRegistry.length; i++) {
var page = _pageRegistry[i];
@ -211,7 +210,7 @@ class ObservatoryApplication {
}
if (currentPage != null) {
Logger.root.info('Uninstalling page: $currentPage');
currentPage.onUninstall();
currentPage!.onUninstall();
// Clear children.
rootElement.children.clear();
}
@ -222,7 +221,7 @@ class ObservatoryApplication {
Logger.root.severe('Failed to install page: $e');
}
// Add new page.
rootElement.children.add(page.element);
rootElement.children.add(page.element!);
// Remember page.
currentPage = page;
@ -239,22 +238,22 @@ class ObservatoryApplication {
_switchVM(null);
} else {
final bool currentTarget =
(_vm as WebSocketVM)?.target == targets.current;
final bool currentTargetConnected = (_vm != null) && _vm.isConnected;
(_vm as WebSocketVM?)?.target == targets.current;
final bool currentTargetConnected = (_vm != null) && _vm!.isConnected;
if (!currentTarget || !currentTargetConnected) {
_switchVM(new WebSocketVM(targets.current));
_vm.onConnect.then((_) {
_switchVM(new WebSocketVM(targets.current!));
_vm!.onConnect.then((_) {
app.locationManager.go(Uris.vm());
});
_vm.load();
_vm!.load();
} else if (currentTargetConnected) {
app.locationManager.go(Uris.vm());
}
}
});
Logger.root.info('Setting initial target to ${targets.current.name}');
_switchVM(new WebSocketVM(targets.current));
Logger.root.info('Setting initial target to ${targets.current!.name}');
_switchVM(new WebSocketVM(targets.current!));
_initOnce();
// delete pause events.

View file

@ -11,11 +11,11 @@ class LocationManager {
/// application URL.
final Map<String, String> internalArguments = new Map<String, String>();
Uri _uri;
Uri? _uri;
/// [uri] is the application uri. Application uris consist of a path and
/// the queryParameters map.
Uri get uri => _uri;
Uri get uri => _uri!;
LocationManager(this._app) {
window.onPopState.listen(_onBrowserNavigation);
@ -90,13 +90,14 @@ class LocationManager {
/// Notify the current page that something has changed.
_visit() {
Chain.capture(() => _app._visit(_uri, internalArguments), onError: (e, st) {
Chain.capture(() => _app._visit(_uri!, internalArguments),
onError: (e, st) {
if (e is IsolateNotFound) {
var newPath = ((_app.vm == null || _app.vm.isDisconnected)
? '/vm-connect'
: '/isolate-reconnect');
var parameters = <String, dynamic>{};
parameters.addAll(_uri.queryParameters);
parameters.addAll(_uri!.queryParameters);
parameters['originalUri'] = _uri.toString();
parameters['isolateId'] = parameters['isolateId'];
var generatedUri = new Uri(path: newPath, queryParameters: parameters);
@ -126,7 +127,7 @@ class LocationManager {
}
makeLinkReplacingParameters(Map updatedParameters) {
var parameters = new Map.from(_uri.queryParameters);
var parameters = new Map<String, dynamic>.from(_uri!.queryParameters);
updatedParameters.forEach((k, v) {
parameters[k] = v;
});
@ -141,7 +142,7 @@ class LocationManager {
}
makeLinkForwardingParameters(String newPath) {
var parameters = _uri.queryParameters;
var parameters = _uri!.queryParameters;
var generatedUri = new Uri(path: newPath, queryParameters: parameters);
return makeLink(generatedUri.toString());
}
@ -161,7 +162,7 @@ class LocationManager {
event.preventDefault();
// 'currentTarget' is the dom element that would process the event.
// If we use 'target' we might get an <em> element or somesuch.
Element target = event.currentTarget;
go(target.attributes['href']);
Element target = event.currentTarget as Element;
go(target.attributes['href']!);
}
}

View file

@ -8,7 +8,7 @@ class ExceptionNotification implements M.ExceptionNotification {
final exception;
/// [optional]
final StackTrace stacktrace;
final StackTrace? stacktrace;
ExceptionNotification(this.exception, {this.stacktrace});
}

View file

@ -55,7 +55,7 @@ RetainingPathRepository _retainingPathRepository =
abstract class Page {
final ObservatoryApplication app;
final Map<String, String> internalArguments = <String, String>{};
HtmlElement element;
HtmlElement? element;
Page(this.app);
@ -70,7 +70,7 @@ abstract class Page {
}
/// Called when the page should update its state based on [uri].
void visit(Uri uri, Map internalArguments) {
void visit(Uri uri, Map<String, String> internalArguments) {
this.internalArguments.clear();
this.internalArguments.addAll(internalArguments);
_visit(uri);
@ -95,7 +95,7 @@ abstract class MatchingPage extends Page {
Future<Isolate> getIsolate(Uri uri) {
var isolateId = uri.queryParameters['isolateId'];
return app.vm.getIsolate(isolateId).then((isolate) {
return app.vm.getIsolate(isolateId!).then((isolate) {
if (isolate == null) {
throw new IsolateNotFound(isolateId);
}
@ -106,7 +106,6 @@ abstract class MatchingPage extends Page {
EditorRepository getEditor(Uri uri) {
final editor = uri.queryParameters['editor'];
return new EditorRepository(app.vm, editor: editor);
return null;
}
bool canVisit(Uri uri) => uri.path == path;
@ -119,7 +118,7 @@ class SimplePage extends MatchingPage {
void onInstall() {
if (element == null) {
element = new Element.tag(elementTagName);
element = new Element.tag(elementTagName) as HtmlElement;
}
}
}
@ -169,7 +168,7 @@ class VMPage extends MatchingPage {
return;
}
app.vm.reload().then((serviceObject) {
VM vm = serviceObject;
VM vm = serviceObject as VM;
container.children = <Element>[
new VMViewElement(
vm,
@ -257,7 +256,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new ClassViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -280,7 +279,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new CodeViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -296,7 +295,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new ContextViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -317,7 +316,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new FieldViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -336,7 +335,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new InstanceViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -374,7 +373,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new FunctionViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -393,7 +392,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new ICDataViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -410,7 +409,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new SingleTargetCacheViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -427,7 +426,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new SubtypeTestCacheViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -444,7 +443,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new UnlinkedCallViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -461,7 +460,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new LibraryViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -481,7 +480,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new MegamorphicCacheViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -498,7 +497,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new ObjectPoolViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -515,13 +514,13 @@ class InspectPage extends MatchingPage {
var pos;
if (app.locationManager.internalArguments['pos'] != null) {
try {
pos = int.parse(app.locationManager.internalArguments['pos']);
pos = int.parse(app.locationManager.internalArguments['pos']!);
} catch (_) {}
}
container.children = <Element>[
new ScriptViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -539,7 +538,7 @@ class InspectPage extends MatchingPage {
container.children = <Element>[
new ObjectViewElement(
app.vm,
obj.isolate,
obj.isolate as Isolate,
obj,
app.events,
app.notifications,
@ -553,8 +552,8 @@ class InspectPage extends MatchingPage {
];
} else if (obj is Sentinel) {
container.children = <Element>[
new SentinelViewElement(
app.vm, obj.isolate, obj, app.events, app.notifications,
new SentinelViewElement(app.vm, obj.isolate as Isolate, obj, app.events,
app.notifications,
queue: app.queue)
.element
];
@ -911,8 +910,8 @@ class IsolateReconnectPage extends Page {
app.vm,
app.events,
app.notifications,
uri.queryParameters['isolateId'],
Uri.parse(uri.queryParameters['originalUri']))
uri.queryParameters['isolateId']!,
Uri.parse(uri.queryParameters['originalUri']!))
.element
];
assert(element != null);
@ -927,7 +926,7 @@ class MetricsPage extends MatchingPage {
final DivElement container = new DivElement();
Isolate lastIsolate;
Isolate? lastIsolate;
void _visit(Uri uri) {
super._visit(uri);
@ -953,7 +952,7 @@ class MetricsPage extends MatchingPage {
@override
void onUninstall() {
super.onUninstall();
_metricRepository.stopSampling(lastIsolate);
_metricRepository.stopSampling(lastIsolate!);
container.children = const [];
}
}

View file

@ -46,8 +46,8 @@ abstract class _CommandBase {
// A command may optionally have sub-commands.
List<Command> _children = <Command>[];
_CommandBase _parent;
int get _depth => (_parent == null ? 0 : _parent._depth + 1);
_CommandBase? _parent;
int get _depth => (_parent == null ? 0 : _parent!._depth + 1);
// Override in subclasses to provide command-specific argument completion.
//
@ -115,7 +115,7 @@ abstract class _CommandBase {
// The root of a tree of commands.
class RootCommand extends _CommandBase {
RootCommand(List<Command> children, [List<String> history])
RootCommand(List<Command> children, [List<String>? history])
: this._(children, history ?? ['']);
RootCommand._(List<Command> children, List<String> history)
@ -161,7 +161,7 @@ class RootCommand extends _CommandBase {
// If we are showing all possiblities, also include local
// completions for the parent command.
return commands[0]
._parent
._parent!
._buildCompletions(args, false)
.then((localCompletions) {
completions.addAll(localCompletions);
@ -232,7 +232,7 @@ class RootCommand extends _CommandBase {
throw 'should-not-execute-the-root-command';
}
toString() => 'RootCommand';
String toString() => 'RootCommand';
}
// A node in the command tree.
@ -240,18 +240,18 @@ abstract class Command extends _CommandBase {
Command(this.name, List<Command> children) : super(children);
final String name;
String alias;
String? alias;
String get fullName {
if (_parent is RootCommand) {
return name;
} else {
Command parent = _parent;
Command parent = _parent as Command;
return '${parent.fullName} $name';
}
}
toString() => 'Command(${name})';
String toString() => 'Command(${name})';
}
abstract class CommandException implements Exception {}

View file

@ -8,7 +8,7 @@ part of debugger;
abstract class Debugger {
VM get vm;
Isolate get isolate;
M.ObjectRepository objects;
ServiceMap get stack;
int get currentFrame;
M.ObjectRepository? objects;
ServiceMap? get stack;
int? get currentFrame;
}

View file

@ -50,12 +50,12 @@ class DebuggerLocation {
new DebuggerLocation.error("Invalid source location '${locDesc}'"));
}
static Future<Frame> _currentFrame(Debugger debugger) async {
ServiceMap stack = debugger.stack;
static Future<Frame?> _currentFrame(Debugger debugger) async {
ServiceMap? stack = debugger.stack;
if (stack == null || stack['frames'].length == 0) {
return null;
}
return stack['frames'][debugger.currentFrame];
return stack['frames'][debugger.currentFrame] as Frame?;
}
static Future<DebuggerLocation> _currentLocation(Debugger debugger) async {
@ -64,10 +64,10 @@ class DebuggerLocation {
return new DebuggerLocation.error(
'A script must be provided when the stack is empty');
}
Script script = frame.location.script;
Script script = frame.location!.script;
await script.load();
var line = script.tokenToLine(frame.location.tokenPos);
var col = script.tokenToCol(frame.location.tokenPos);
var line = script.tokenToLine(frame.location!.tokenPos);
var col = script.tokenToCol(frame.location!.tokenPos);
return new DebuggerLocation.file(script, line, col);
}
@ -87,7 +87,7 @@ class DebuggerLocation {
if (colStr != null) {
colStr = colStr.substring(1);
}
var line = int.tryParse(lineStr) ?? -1;
var line = int.tryParse(lineStr!) ?? -1;
var col = (colStr != null ? int.tryParse(colStr) ?? -1 : null);
if (line == -1) {
return new Future.value(
@ -121,7 +121,7 @@ class DebuggerLocation {
return new Future.value(new DebuggerLocation.error(
'A script must be provided when the stack is empty'));
}
Script script = frame.location.script;
Script script = frame.location!.script;
await script.load();
return new DebuggerLocation.file(script, line, col);
}
@ -139,7 +139,7 @@ class DebuggerLocation {
var matches = <Script>{};
for (var lib in isolate.libraries) {
for (var script in lib.scripts) {
final String haystack = useUri ? script.uri : script.name;
final String haystack = useUri ? script.uri : script.name!;
if (allowPrefix) {
if (haystack.startsWith(name)) {
matches.add(script);
@ -162,7 +162,7 @@ class DebuggerLocation {
assert(lib.loaded);
for (var function in lib.functions) {
if (allowPrefix) {
if (function.name.startsWith(name)) {
if (function.name!.startsWith(name)) {
matches.add(function);
}
} else {
@ -194,7 +194,7 @@ class DebuggerLocation {
for (var lib in isolate.libraries) {
for (var cls in lib.classes) {
if (allowPrefix) {
if (cls.name.startsWith(name)) {
if (cls.name!.startsWith(name)) {
matches.add(cls);
}
} else {
@ -207,7 +207,7 @@ class DebuggerLocation {
return matches;
}
static ServiceFunction _getConstructor(Class cls, String name) {
static ServiceFunction? _getConstructor(Class cls, String name) {
for (var function in cls.functions) {
assert(cls.loaded);
if (name == function.name) {
@ -222,7 +222,7 @@ class DebuggerLocation {
static Future<DebuggerLocation> _parseFunction(
Debugger debugger, Match match) {
Isolate isolate = debugger.isolate;
var base = match.group(1);
var base = match.group(1)!;
var qualifier = match.group(2);
assert(base != null);
@ -234,7 +234,7 @@ class DebuggerLocation {
for (var cls in classes) {
// Look for a self-named constructor.
var constructor = _getConstructor(cls, cls.name);
var constructor = _getConstructor(cls, cls.name!);
if (constructor != null) {
functions.add(constructor);
}
@ -300,9 +300,8 @@ class DebuggerLocation {
static Future<List<String>> _completeFunction(
Debugger debugger, Match match) {
Isolate isolate = debugger.isolate;
var base = match.group(1);
var base = match.group(1) ?? '';
var qualifier = match.group(2);
base = (base == null ? '' : base);
if (qualifier == null) {
return _lookupClass(isolate, base, allowPrefix: true).then((classes) {
@ -310,12 +309,12 @@ class DebuggerLocation {
// Complete top-level function names.
var functions = _lookupFunction(isolate, base, allowPrefix: true);
var funcNames = functions.map((f) => f.name).toList();
var funcNames = functions.map((f) => f.name!).toList();
funcNames.sort();
completions.addAll(funcNames);
// Complete class names.
var classNames = classes.map((f) => f.name).toList();
var classNames = classes.map((f) => f.name!).toList();
classNames.sort();
completions.addAll(classNames);
@ -327,12 +326,12 @@ class DebuggerLocation {
for (var cls in classes) {
for (var function in cls.functions) {
if (function.kind == M.FunctionKind.constructor) {
if (function.name.startsWith(match.group(0))) {
completions.add(function.name);
if (function.name!.startsWith(match.group(0)!)) {
completions.add(function.name!);
}
} else {
if (function.qualifiedName.startsWith(match.group(0))) {
completions.add(function.qualifiedName);
if (function.qualifiedName!.startsWith(match.group(0)!)) {
completions.add(function.qualifiedName!);
}
}
}
@ -354,34 +353,29 @@ class DebuggerLocation {
var lineStr;
var lineStrComplete = false;
var colStr;
if (_startsWithDigit(match.group(1))) {
if (_startsWithDigit(match.group(1)!)) {
// CASE 1: We have matched a prefix of (lineStr:)(colStr)
var frame = await _currentFrame(debugger);
if (frame == null) {
return [];
}
scriptName = frame.location.script.name;
scriptName = frame.location!.script.name;
scriptNameComplete = true;
lineStr = match.group(1);
lineStr = (lineStr == null ? '' : lineStr);
lineStr = match.group(1) ?? '';
if (lineStr.endsWith(':')) {
lineStr = lineStr.substring(0, lineStr.length - 1);
lineStrComplete = true;
}
colStr = match.group(2);
colStr = (colStr == null ? '' : colStr);
colStr = match.group(2) ?? '';
} else {
// CASE 2: We have matched a prefix of (scriptName:)(lineStr)(:colStr)
scriptName = match.group(1);
scriptName = (scriptName == null ? '' : scriptName);
scriptName = match.group(1) ?? '';
if (scriptName.endsWith(':')) {
scriptName = scriptName.substring(0, scriptName.length - 1);
scriptNameComplete = true;
}
lineStr = match.group(2);
lineStr = (lineStr == null ? '' : lineStr);
colStr = match.group(3);
colStr = (colStr == null ? '' : colStr);
lineStr = match.group(2) ?? '';
colStr = match.group(3) ?? '';
if (colStr.startsWith(':')) {
lineStrComplete = true;
colStr = colStr.substring(1);
@ -394,7 +388,7 @@ class DebuggerLocation {
await _lookupScript(debugger.isolate, scriptName, allowPrefix: true);
var completions = <String>[];
for (var script in scripts) {
completions.add(script.name + ':');
completions.add(script.name! + ':');
}
completions.sort();
return completions;
@ -411,8 +405,8 @@ class DebuggerLocation {
// Complete the line.
var sharedPrefix = '${script.name}:';
var completions = <String>[];
var report = await script.isolate
.getSourceReport([Isolate.kPossibleBreakpointsReport], script);
var report = await script.isolate!.getSourceReport(
[Isolate.kPossibleBreakpointsReport], script) as ServiceMap;
Set<int> possibleBpts = getPossibleBreakpointLines(report, script);
for (var line in possibleBpts) {
var currentLineStr = line.toString();
@ -425,7 +419,7 @@ class DebuggerLocation {
} else {
// Complete the column.
int lineNum = int.parse(lineStr);
var scriptLine = script.getLine(lineNum);
var scriptLine = script.getLine(lineNum)!;
var sharedPrefix = '${script.name}:${lineStr}:';
var completions = <String>[];
int maxCol = scriptLine.text.trimRight().runes.length;
@ -443,20 +437,20 @@ class DebuggerLocation {
String toString() {
if (valid) {
if (function != null) {
return '${function.qualifiedName}';
return '${function!.qualifiedName}';
} else if (col != null) {
return '${script.name}:${line}:${col}';
return '${script!.name}:${line}:${col}';
} else {
return '${script.name}:${line}';
return '${script!.name}:${line}';
}
}
return 'invalid source location (${errorMessage})';
}
Script script;
int line;
int col;
ServiceFunction function;
String errorMessage;
Script? script;
int? line;
int? col;
ServiceFunction? function;
String? errorMessage;
bool get valid => (errorMessage == null);
}

View file

@ -37,20 +37,20 @@ enum _SortingField {
enum _SortingDirection { ascending, descending }
class AllocationProfileElement extends CustomElement implements Renderable {
RenderingScheduler<AllocationProfileElement> _r;
late RenderingScheduler<AllocationProfileElement> _r;
Stream<RenderedEvent<AllocationProfileElement>> get onRendered =>
_r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.AllocationProfileRepository _repository;
M.AllocationProfile _profile;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.AllocationProfileRepository _repository;
M.AllocationProfile? _profile;
bool _autoRefresh = false;
bool _isCompacted = false;
StreamSubscription _gcSubscription;
late StreamSubscription _gcSubscription;
_SortingField _sortingField = _SortingField.size;
_SortingDirection _sortingDirection = _SortingDirection.descending;
@ -64,7 +64,7 @@ class AllocationProfileElement extends CustomElement implements Renderable {
M.EventRepository events,
M.NotificationRepository notifications,
M.AllocationProfileRepository repository,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -163,9 +163,9 @@ class AllocationProfileElement extends CustomElement implements Renderable {
..text = 'last forced GC at',
new DivElement()
..classes = ['memberValue']
..text = _profile.lastServiceGC == null
..text = _profile!.lastServiceGC == null
? '---'
: '${_profile.lastServiceGC}',
: '${_profile!.lastServiceGC}',
],
],
new HRElement(),
@ -179,14 +179,14 @@ class AllocationProfileElement extends CustomElement implements Renderable {
? [
new HeadingElement.h2()
..text = 'New Generation '
'(${_usedCaption(_profile.newSpace)})',
'(${_usedCaption(_profile!.newSpace)})',
]
: [
new HeadingElement.h2()..text = 'New Generation',
new BRElement(),
new DivElement()
..classes = ['memberList']
..children = _createSpaceMembers(_profile.newSpace),
..children = _createSpaceMembers(_profile!.newSpace),
],
new DivElement()
..classes = ['heap-space', 'left']
@ -194,14 +194,14 @@ class AllocationProfileElement extends CustomElement implements Renderable {
? [
new HeadingElement.h2()
..text = 'Old Generation '
'(${_usedCaption(_profile.oldSpace)})',
'(${_usedCaption(_profile!.oldSpace)})',
]
: [
new HeadingElement.h2()..text = 'Old Generation',
new BRElement(),
new DivElement()
..classes = ['memberList']
..children = _createSpaceMembers(_profile.oldSpace),
..children = _createSpaceMembers(_profile!.oldSpace),
],
new DivElement()
..classes = ['heap-space', 'left']
@ -209,14 +209,14 @@ class AllocationProfileElement extends CustomElement implements Renderable {
? [
new HeadingElement.h2()
..text = 'Total '
'(${_usedCaption(_profile.totalSpace)})',
'(${_usedCaption(_profile!.totalSpace)})',
]
: [
new HeadingElement.h2()..text = 'Total',
new BRElement(),
new DivElement()
..classes = ['memberList']
..children = _createSpaceMembers(_profile.totalSpace),
..children = _createSpaceMembers(_profile!.totalSpace),
],
new ButtonElement()
..classes = ['compact']
@ -234,7 +234,7 @@ class AllocationProfileElement extends CustomElement implements Renderable {
_createCollectionLine, _updateCollectionLine,
createHeader: _createCollectionHeader,
search: _search,
items: _profile.members.toList()..sort(_createSorter()),
items: _profile!.members.toList()..sort(_createSorter()),
queue: _r.queue)
.element
]
@ -282,7 +282,7 @@ class AllocationProfileElement extends CustomElement implements Renderable {
getter = _getInstances;
break;
case _SortingField.className:
getter = (M.ClassHeapStats s) => s.clazz.name;
getter = (M.ClassHeapStats s) => s.clazz!.name;
break;
}
switch (_sortingDirection) {
@ -432,14 +432,14 @@ class AllocationProfileElement extends CustomElement implements Renderable {
e.children[9].text = Utils.formatSize(_getExternalSize(item));
e.children[10].text = Utils.formatSize(_getSize(item));
e.children[11].text = '${_getInstances(item)}';
e.children[12] = new ClassRefElement(_isolate, item.clazz, queue: _r.queue)
e.children[12] = new ClassRefElement(_isolate, item.clazz!, queue: _r.queue)
.element
..classes = ['name'];
}
bool _search(Pattern pattern, itemDynamic) {
M.ClassHeapStats item = itemDynamic;
return item.clazz.name.contains(pattern);
return item.clazz!.name!.contains(pattern);
}
static String _usedCaption(M.HeapSpace space) =>
@ -526,11 +526,11 @@ class AllocationProfileElement extends CustomElement implements Renderable {
'Class'
].join(',') +
'\n';
AnchorElement tl = document.createElement('a');
AnchorElement tl = document.createElement('a') as AnchorElement;
tl
..attributes['href'] = 'data:text/plain;charset=utf-8,' +
Uri.encodeComponent(header +
(_profile.members.toList()..sort(_createSorter()))
(_profile!.members.toList()..sort(_createSorter()))
.map(_csvOut)
.join('\n'))
..attributes['download'] = 'heap-profile.csv'
@ -551,7 +551,7 @@ class AllocationProfileElement extends CustomElement implements Renderable {
_getExternalSize(s),
_getSize(s),
_getInstances(s),
s.clazz.name
s.clazz!.name
].join(',');
}

View file

@ -13,27 +13,27 @@ import 'package:observatory/src/elements/stack_trace_tree_config.dart';
class ClassAllocationProfileElement extends CustomElement
implements Renderable {
RenderingScheduler<ClassAllocationProfileElement> _r;
late RenderingScheduler<ClassAllocationProfileElement> _r;
Stream<RenderedEvent<ClassAllocationProfileElement>> get onRendered =>
_r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.Class _cls;
M.ClassSampleProfileRepository _profiles;
Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress _progress;
M.SampleProfileTag _tag = M.SampleProfileTag.none;
ProfileTreeMode _mode = ProfileTreeMode.function;
M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.Class _cls;
late M.ClassSampleProfileRepository _profiles;
late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress? _progress;
late M.SampleProfileTag _tag = M.SampleProfileTag.none;
late ProfileTreeMode _mode = ProfileTreeMode.function;
late M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
M.IsolateRef get isolate => _isolate;
M.Class get cls => _cls;
factory ClassAllocationProfileElement(M.VM vm, M.IsolateRef isolate,
M.Class cls, M.ClassSampleProfileRepository profiles,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(cls != null);
@ -72,7 +72,7 @@ class ClassAllocationProfileElement extends CustomElement
return;
}
final content = <HtmlElement>[
(new SampleBufferControlElement(_vm, _progress, _progressStream,
(new SampleBufferControlElement(_vm, _progress!, _progressStream,
selectedTag: _tag, queue: _r.queue)
..onTagChange.listen((e) {
_tag = e.element.selectedTag;
@ -80,8 +80,8 @@ class ClassAllocationProfileElement extends CustomElement
}))
.element
];
if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
CpuProfileVirtualTreeElement tree;
if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
late CpuProfileVirtualTreeElement tree;
content.addAll([
new BRElement(),
(new StackTraceTreeConfigElement(
@ -97,7 +97,7 @@ class ClassAllocationProfileElement extends CustomElement
}))
.element,
new BRElement(),
(tree = new CpuProfileVirtualTreeElement(_isolate, _progress.profile,
(tree = new CpuProfileVirtualTreeElement(_isolate, _progress!.profile,
queue: _r.queue))
.element
]);
@ -112,7 +112,7 @@ class ClassAllocationProfileElement extends CustomElement
_r.dirty();
_progress = (await _progressStream.first).progress;
_r.dirty();
if (M.isSampleProcessRunning(_progress.status)) {
if (M.isSampleProcessRunning(_progress!.status)) {
_progress = (await _progressStream.last).progress;
_r.dirty();
}

View file

@ -15,19 +15,19 @@ import 'package:observatory/src/elements/strongly_reachable_instances.dart';
import 'package:observatory/utils.dart';
class ClassInstancesElement extends CustomElement implements Renderable {
RenderingScheduler<ClassInstancesElement> _r;
late RenderingScheduler<ClassInstancesElement> _r;
Stream<RenderedEvent<ClassInstancesElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.Class _cls;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.StronglyReachableInstancesRepository _stronglyReachableInstances;
M.ObjectRepository _objects;
M.Guarded<M.Instance> _retainedSize = null;
late M.IsolateRef _isolate;
late M.Class _cls;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.StronglyReachableInstancesRepository _stronglyReachableInstances;
late M.ObjectRepository _objects;
M.Guarded<M.Instance>? _retainedSize = null;
bool _loadingRetainedBytes = false;
M.Guarded<M.Instance> _reachableSize = null;
M.Guarded<M.Instance>? _reachableSize = null;
bool _loadingReachableBytes = false;
M.IsolateRef get isolate => _isolate;
@ -40,7 +40,7 @@ class ClassInstancesElement extends CustomElement implements Renderable {
M.ReachableSizeRepository reachableSizes,
M.StronglyReachableInstancesRepository stronglyReachableInstances,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(cls != null);
assert(retainedSizes != null);
@ -73,15 +73,15 @@ class ClassInstancesElement extends CustomElement implements Renderable {
children = <Element>[];
}
StronglyReachableInstancesElement _strong;
StronglyReachableInstancesElement? _strong;
void render() {
_strong = _strong ??
new StronglyReachableInstancesElement(
_isolate, _cls, _stronglyReachableInstances, _objects,
queue: _r.queue);
final instanceCount = _cls.newSpace.instances + _cls.oldSpace.instances;
final size = Utils.formatSize(_cls.newSpace.size + _cls.oldSpace.size);
final instanceCount = _cls.newSpace!.instances + _cls.oldSpace!.instances;
final size = Utils.formatSize(_cls.newSpace!.size + _cls.oldSpace!.size);
children = <Element>[
new DivElement()
..classes = ['memberList']
@ -104,7 +104,7 @@ class ClassInstancesElement extends CustomElement implements Renderable {
..text = 'strongly reachable ',
new DivElement()
..classes = ['memberValue']
..children = <Element>[_strong.element]
..children = <Element>[_strong!.element]
],
new DivElement()
..classes = ['memberItem']
@ -137,14 +137,14 @@ class ClassInstancesElement extends CustomElement implements Renderable {
List<Element> _createReachableSizeValue() {
final content = <Element>[];
if (_reachableSize != null) {
if (_reachableSize.isSentinel) {
content.add(
new SentinelValueElement(_reachableSize.asSentinel, queue: _r.queue)
.element);
if (_reachableSize!.isSentinel) {
content.add(new SentinelValueElement(_reachableSize!.asSentinel!,
queue: _r.queue)
.element);
} else {
content.add(new SpanElement()
..text = Utils.formatSize(
int.parse(_reachableSize.asValue.valueAsString)));
int.parse(_reachableSize!.asValue!.valueAsString!)));
}
} else {
content.add(new SpanElement()..text = '...');
@ -156,7 +156,7 @@ class ClassInstancesElement extends CustomElement implements Renderable {
button.onClick.listen((_) async {
button.disabled = true;
_loadingReachableBytes = true;
_reachableSize = await _reachableSizes.get(_isolate, _cls.id);
_reachableSize = await _reachableSizes.get(_isolate, _cls.id!);
_r.dirty();
});
content.add(button);
@ -166,14 +166,14 @@ class ClassInstancesElement extends CustomElement implements Renderable {
List<Element> _createRetainedSizeValue() {
final content = <Element>[];
if (_retainedSize != null) {
if (_retainedSize.isSentinel) {
content.add(
new SentinelValueElement(_retainedSize.asSentinel, queue: _r.queue)
.element);
if (_retainedSize!.isSentinel) {
content.add(new SentinelValueElement(_retainedSize!.asSentinel!,
queue: _r.queue)
.element);
} else {
content.add(new SpanElement()
..text =
Utils.formatSize(int.parse(_retainedSize.asValue.valueAsString)));
..text = Utils.formatSize(
int.parse(_retainedSize!.asValue!.valueAsString!)));
}
} else {
content.add(new SpanElement()..text = '...');
@ -185,7 +185,7 @@ class ClassInstancesElement extends CustomElement implements Renderable {
button.onClick.listen((_) async {
button.disabled = true;
_loadingRetainedBytes = true;
_retainedSize = await _retainedSizes.get(_isolate, _cls.id);
_retainedSize = await _retainedSizes.get(_isolate, _cls.id!);
_r.dirty();
});
content.add(button);

View file

@ -10,18 +10,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class ClassRefElement extends CustomElement implements Renderable {
RenderingScheduler<ClassRefElement> _r;
late RenderingScheduler<ClassRefElement> _r;
Stream<RenderedEvent<ClassRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.ClassRef _class;
late M.IsolateRef _isolate;
late M.ClassRef _class;
M.IsolateRef get isolate => _isolate;
M.ClassRef get cls => _class;
factory ClassRefElement(M.IsolateRef isolate, M.ClassRef cls,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(cls != null);
ClassRefElement e = new ClassRefElement.created();
e._r = new RenderingScheduler<ClassRefElement>(e, queue: queue);

View file

@ -19,26 +19,26 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/nav/vm_menu.dart';
class ClassTreeElement extends CustomElement implements Renderable {
RenderingScheduler<ClassTreeElement> _r;
late RenderingScheduler<ClassTreeElement> _r;
Stream<RenderedEvent<ClassTreeElement>> get onRendered => _r.onRendered;
M.VMRef _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.ClassRepository _classes;
M.Class _object;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.ClassRepository _classes;
M.Class? _object;
final _subclasses = <String, Iterable<M.Class>>{};
final _mixins = <String, List<M.Instance>>{};
final _mixins = <String, List<M.Instance>?>{};
factory ClassTreeElement(
M.VMRef vm,
M.VM vm,
M.IsolateRef isolate,
M.EventRepository events,
M.NotificationRepository notifications,
M.ClassRepository classes,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -70,7 +70,7 @@ class ClassTreeElement extends CustomElement implements Renderable {
_r.disable(notify: true);
}
VirtualTreeElement _tree;
VirtualTreeElement? _tree;
void render() {
children = <Element>[
@ -98,8 +98,8 @@ class ClassTreeElement extends CustomElement implements Renderable {
Element _createTree() {
_tree = new VirtualTreeElement(_create, _update, _children,
items: [_object], search: _search, queue: _r.queue);
_tree.expand(_object, autoExpandSingleChildNodes: true);
return _tree.element;
_tree!.expand(_object, autoExpandSingleChildNodes: true);
return _tree!.element;
}
Future _refresh() async {
@ -111,25 +111,26 @@ class ClassTreeElement extends CustomElement implements Renderable {
}
Future<M.Class> _register(M.Class cls) async {
_subclasses[cls.id] = await Future.wait(
(await Future.wait(cls.subclasses.map(_getActualChildrens)))
_subclasses[cls.id!] = await Future.wait(
(await Future.wait(cls.subclasses!.map(_getActualChildrens)))
.expand((f) => f)
.map(_register));
return cls;
}
Future<Iterable<M.Class>> _getActualChildrens(M.ClassRef ref) async {
var cls = await _classes.get(_isolate, ref.id);
if (cls.isPatch) {
var cls = await _classes.get(_isolate, ref.id!);
if (cls.isPatch!) {
return const [];
}
if (cls.mixin == null) {
return [cls];
}
return (await Future.wait(cls.subclasses.map(_getActualChildrens)))
return (await Future.wait(cls.subclasses!.map(_getActualChildrens)))
.expand((f) => f)
..forEach((subcls) {
_mixins[subcls.id] = (_mixins[subcls.id] ?? [])..add(cls.mixin);
_mixins[subcls.id!] = (_mixins[subcls.id!] ?? [])
..add(cls.mixin as M.Instance);
});
}
@ -147,23 +148,23 @@ class ClassTreeElement extends CustomElement implements Renderable {
void _update(HtmlElement el, classDynamic, int index) {
M.Class cls = classDynamic;
virtualTreeUpdateLines(el.children[0], index);
if (cls.subclasses.isEmpty) {
virtualTreeUpdateLines(el.children[0] as SpanElement, index);
if (cls.subclasses!.isEmpty) {
el.children[1].text = '';
} else {
el.children[1].text = _tree.isExpanded(cls) ? '' : '';
el.children[1].text = _tree!.isExpanded(cls) ? '' : '';
}
el.children[2].children = <Element>[
new ClassRefElement(_isolate, cls, queue: _r.queue).element
];
if (_mixins[cls.id] != null) {
el.children[2].children.addAll(_createMixins(_mixins[cls.id]));
el.children[2].children.addAll(_createMixins(_mixins[cls.id]!));
}
}
bool _search(Pattern pattern, classDynamic) {
M.Class cls = classDynamic;
return cls.name.contains(pattern);
return cls.name!.contains(pattern);
}
List<Element> _createMixins(List<M.Instance> types) {
@ -171,8 +172,8 @@ class ClassTreeElement extends CustomElement implements Renderable {
.expand((type) => <Element>[
new SpanElement()..text = ', ',
type.typeClass == null
? (new SpanElement()..text = type.name.split('<').first)
: new ClassRefElement(_isolate, type.typeClass,
? (new SpanElement()..text = type.name!.split('<').first)
: new ClassRefElement(_isolate, type.typeClass!,
queue: _r.queue)
.element
])
@ -183,6 +184,6 @@ class ClassTreeElement extends CustomElement implements Renderable {
Iterable<M.Class> _children(classDynamic) {
M.Class cls = classDynamic;
return _subclasses[cls.id];
return _subclasses[cls.id]!;
}
}

View file

@ -33,27 +33,27 @@ import 'package:observatory/src/elements/source_link.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ClassViewElement extends CustomElement implements Renderable {
RenderingScheduler<ClassViewElement> _r;
late RenderingScheduler<ClassViewElement> _r;
Stream<RenderedEvent<ClassViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Class _cls;
M.ClassRepository _classes;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.StronglyReachableInstancesRepository _stronglyReachableInstances;
M.FieldRepository _fields;
M.ScriptRepository _scripts;
M.ObjectRepository _objects;
M.EvalRepository _eval;
M.ClassSampleProfileRepository _profiles;
Iterable<M.Field> _classFields;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Class _cls;
late M.ClassRepository _classes;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.StronglyReachableInstancesRepository _stronglyReachableInstances;
late M.FieldRepository _fields;
late M.ScriptRepository _scripts;
late M.ObjectRepository _objects;
late M.EvalRepository _eval;
late M.ClassSampleProfileRepository _profiles;
Iterable<M.Field>? _classFields;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -77,7 +77,7 @@ class ClassViewElement extends CustomElement implements Renderable {
M.EvalRepository eval,
M.StronglyReachableInstancesRepository stronglyReachable,
M.ClassSampleProfileRepository profiles,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -131,8 +131,8 @@ class ClassViewElement extends CustomElement implements Renderable {
children = <Element>[];
}
ObjectCommonElement _common;
ClassInstancesElement _classInstances;
ObjectCommonElement? _common;
ClassInstancesElement? _classInstances;
bool _loadProfile = false;
void render() {
@ -145,10 +145,10 @@ class ClassViewElement extends CustomElement implements Renderable {
_reachableSizes, _stronglyReachableInstances, _objects,
queue: _r.queue);
var header = '';
if (_cls.isAbstract) {
if (_cls.isAbstract!) {
header += 'abstract ';
}
if (_cls.isPatch) {
if (_cls.isPatch!) {
header += 'patch ';
}
children = <Element>[
@ -182,7 +182,7 @@ class ClassViewElement extends CustomElement implements Renderable {
..children = <Element>[
new HeadingElement.h2()..text = '$header class ${_cls.name}',
new HRElement(),
_common.element,
_common!.element,
new BRElement(),
new DivElement()
..classes = ['memberList']
@ -192,7 +192,7 @@ class ClassViewElement extends CustomElement implements Renderable {
? const []
: [
new HRElement(),
new ErrorRefElement(_cls.error, queue: _r.queue).element
new ErrorRefElement(_cls.error!, queue: _r.queue).element
],
new HRElement(),
new EvalBoxElement(_isolate, _cls, _objects, _eval, queue: _r.queue)
@ -204,7 +204,7 @@ class ClassViewElement extends CustomElement implements Renderable {
..children = _createElements(),
new HRElement(),
new HeadingElement.h2()..text = 'Instances',
new DivElement()..children = [_classInstances.element],
new DivElement()..children = [_classInstances!.element],
new HRElement(),
new HeadingElement.h2()..text = 'Allocations',
new DivElement()
@ -215,7 +215,7 @@ class ClassViewElement extends CustomElement implements Renderable {
..text = 'Tracing allocations? ',
new DivElement()
..classes = ['memberValue']
..children = _cls.traceAllocations
..children = _cls.traceAllocations!
? [
new SpanElement()..text = 'Yes ',
new ButtonElement()
@ -251,7 +251,7 @@ class ClassViewElement extends CustomElement implements Renderable {
..children = _cls.location != null
? [
new HRElement(),
new SourceInsetElement(_isolate, _cls.location, _scripts,
new SourceInsetElement(_isolate, _cls.location!, _scripts,
_objects, _events,
queue: _r.queue)
.element
@ -263,8 +263,8 @@ class ClassViewElement extends CustomElement implements Renderable {
];
}
bool _fieldsExpanded;
bool _functionsExpanded;
bool? _fieldsExpanded;
bool? _functionsExpanded;
List<Element> _createMembers() {
final members = <Element>[];
@ -278,7 +278,7 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new LibraryRefElement(_isolate, _cls.library, queue: _r.queue)
new LibraryRefElement(_isolate, _cls.library!, queue: _r.queue)
.element
]
]);
@ -293,7 +293,7 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new SourceLinkElement(_isolate, _cls.location, _scripts,
new SourceLinkElement(_isolate, _cls.location!, _scripts,
queue: _r.queue)
.element
]
@ -309,7 +309,7 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new ClassRefElement(_isolate, _cls.superclass, queue: _r.queue)
new ClassRefElement(_isolate, _cls.superclass!, queue: _r.queue)
.element
]
]);
@ -324,7 +324,7 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new InstanceRefElement(_isolate, _cls.superType, _objects,
new InstanceRefElement(_isolate, _cls.superType!, _objects,
queue: _r.queue)
.element
]
@ -340,13 +340,13 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new InstanceRefElement(_isolate, _cls.mixin, _objects,
new InstanceRefElement(_isolate, _cls.mixin!, _objects,
queue: _r.queue)
.element
]
]);
}
if (_cls.subclasses.length > 0) {
if (_cls.subclasses!.length > 0) {
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -355,7 +355,7 @@ class ClassViewElement extends CustomElement implements Renderable {
..text = 'extended by',
new DivElement()
..classes = ['memberValue']
..children = (_cls.subclasses
..children = (_cls.subclasses!
.expand((subcls) => <Element>[
new ClassRefElement(_isolate, subcls, queue: _r.queue)
.element,
@ -368,7 +368,7 @@ class ClassViewElement extends CustomElement implements Renderable {
members.add(new BRElement());
if (_cls.interfaces.length > 0) {
if (_cls.interfaces!.length > 0) {
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -377,7 +377,7 @@ class ClassViewElement extends CustomElement implements Renderable {
..text = 'implements',
new DivElement()
..classes = ['memberValue']
..children = (_cls.interfaces
..children = (_cls.interfaces!
.expand((interf) => <Element>[
new InstanceRefElement(_isolate, interf, _objects,
queue: _r.queue)
@ -405,8 +405,8 @@ class ClassViewElement extends CustomElement implements Renderable {
List<Element> _createElements() {
final members = <Element>[];
if (_classFields != null && _classFields.isNotEmpty) {
final fields = _classFields.toList();
if (_classFields != null && _classFields!.isNotEmpty) {
final fields = _classFields!.toList();
_fieldsExpanded = _fieldsExpanded ?? (fields.length <= 8);
members.add(new DivElement()
..classes = ['memberItem']
@ -417,7 +417,7 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
(new CurlyBlockElement(expanded: _fieldsExpanded)
(new CurlyBlockElement(expanded: _fieldsExpanded!)
..onToggle
.listen((e) => _fieldsExpanded = e.control.expanded)
..content = <Element>[
@ -451,8 +451,8 @@ class ClassViewElement extends CustomElement implements Renderable {
]);
}
if (_cls.functions.isNotEmpty) {
final functions = _cls.functions.toList();
if (_cls.functions!.isNotEmpty) {
final functions = _cls.functions!.toList();
_functionsExpanded = _functionsExpanded ?? (functions.length <= 8);
members.add(new DivElement()
..classes = ['memberItem']
@ -463,7 +463,7 @@ class ClassViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
(new CurlyBlockElement(expanded: _functionsExpanded)
(new CurlyBlockElement(expanded: _functionsExpanded!)
..onToggle
.listen((e) => _functionsExpanded = e.control.expanded)
..content = (functions
@ -482,14 +482,14 @@ class ClassViewElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_cls = await _classes.get(_isolate, _cls.id);
_cls = await _classes.get(_isolate, _cls.id!);
await _loadAdditionalData();
_r.dirty();
}
Future _loadAdditionalData() async {
_classFields =
await Future.wait(_cls.fields.map((f) => _fields.get(_isolate, f.id)));
_classFields = await Future.wait(
_cls.fields!.map((f) => _fields.get(_isolate, f.id!)));
_r.dirty();
}
}

View file

@ -13,18 +13,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class CodeRefElement extends CustomElement implements Renderable {
RenderingScheduler<CodeRefElement> _r;
late RenderingScheduler<CodeRefElement> _r;
Stream<RenderedEvent<CodeRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.CodeRef _code;
M.IsolateRef? _isolate;
late M.CodeRef _code;
M.IsolateRef get isolate => _isolate;
M.IsolateRef get isolate => _isolate!;
M.CodeRef get code => _code;
factory CodeRefElement(M.IsolateRef isolate, M.CodeRef code,
{RenderingQueue queue}) {
factory CodeRefElement(M.IsolateRef? isolate, M.CodeRef code,
{RenderingQueue? queue}) {
assert(code != null);
CodeRefElement e = new CodeRefElement.created();
e._r = new RenderingScheduler<CodeRefElement>(e, queue: queue);
@ -53,7 +53,7 @@ class CodeRefElement extends CustomElement implements Renderable {
new AnchorElement(
href: ((M.isSyntheticCode(_code.kind)) || (_isolate == null))
? null
: Uris.inspect(_isolate, object: _code))
: Uris.inspect(_isolate!, object: _code))
..text = _code.name
];
}

View file

@ -37,22 +37,22 @@ class InlineTable extends SortedTable {
}
class CodeViewElement extends CustomElement implements Renderable {
RenderingScheduler<CodeViewElement> _r;
late RenderingScheduler<CodeViewElement> _r;
Stream<RenderedEvent<CodeViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Code _code;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ObjectRepository _objects;
DisassemblyTable disassemblyTable;
InlineTable inlineTable;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Code _code;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ObjectRepository _objects;
late DisassemblyTable disassemblyTable;
late InlineTable inlineTable;
static const kDisassemblyColumnIndex = 3;
@ -72,7 +72,7 @@ class CodeViewElement extends CustomElement implements Renderable {
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -129,15 +129,15 @@ class CodeViewElement extends CustomElement implements Renderable {
children = <Element>[];
}
TableElement _disassemblyTable;
TableElement _inlineRangeTable;
Element _disassemblyTableBody;
Element _inlineRangeTableBody;
TableElement? _disassemblyTable;
TableElement? _inlineRangeTable;
Element? _disassemblyTableBody;
Element? _inlineRangeTableBody;
void render() {
if (_inlineRangeTable == null) {
_inlineRangeTable = new TableElement()..classes = ['table'];
_inlineRangeTable.createTHead().children = <Element>[
_inlineRangeTable!.createTHead().children = <Element>[
new TableRowElement()
..children = <Element>[
document.createElement('th')
@ -152,12 +152,12 @@ class CodeViewElement extends CustomElement implements Renderable {
document.createElement('th')..text = 'Functions',
]
];
_inlineRangeTableBody = _inlineRangeTable.createTBody();
_inlineRangeTableBody.classes = ['monospace'];
_inlineRangeTableBody = _inlineRangeTable!.createTBody();
_inlineRangeTableBody!.classes = ['monospace'];
}
if (_disassemblyTable == null) {
_disassemblyTable = new TableElement()..classes = ['table'];
_disassemblyTable.createTHead().children = <Element>[
_disassemblyTable!.createTHead().children = <Element>[
new TableRowElement()
..children = <Element>[
document.createElement('th')
@ -179,17 +179,17 @@ class CodeViewElement extends CustomElement implements Renderable {
..text = 'Object',
]
];
_disassemblyTableBody = _disassemblyTable.createTBody();
_disassemblyTableBody.classes = ['monospace'];
_disassemblyTableBody = _disassemblyTable!.createTBody();
_disassemblyTableBody!.classes = ['monospace'];
}
final inlinedFunctions = _code.inlinedFunctions.toList();
final inlinedFunctions = _code.inlinedFunctions!.toList();
final S.Code code = _code as S.Code;
children = <Element>[
navBar(<Element>[
new NavTopMenuElement(queue: _r.queue).element,
new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element,
navMenu(_code.name),
navMenu(_code.name!),
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
e.element.disabled = true;
@ -208,7 +208,7 @@ class CodeViewElement extends CustomElement implements Renderable {
..classes = ['content-centered-big']
..children = <Element>[
new HeadingElement.h1()
..text = (M.isDartCode(_code.kind) && _code.isOptimized)
..text = (M.isDartCode(_code.kind) && _code.isOptimized!)
? 'Optimized code for ${_code.name}'
: 'Code for ${_code.name}',
new HRElement(),
@ -240,7 +240,7 @@ class CodeViewElement extends CustomElement implements Renderable {
..text = 'Optimized',
new DivElement()
..classes = ['memberValue']
..text = _code.isOptimized ? 'Yes' : 'No'
..text = _code.isOptimized! ? 'Yes' : 'No'
],
new DivElement()
..classes = ['memberItem']
@ -251,7 +251,7 @@ class CodeViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new FunctionRefElement(_isolate, _code.function,
new FunctionRefElement(_isolate, _code.function!,
queue: _r.queue)
.element
]
@ -266,7 +266,7 @@ class CodeViewElement extends CustomElement implements Renderable {
..text = 'Inclusive',
new DivElement()
..classes = ['memberValue']
..text = '${code.profile.formattedInclusiveTicks}'
..text = '${code.profile!.formattedInclusiveTicks}'
],
new DivElement()
..classes = ['memberItem']
@ -278,7 +278,7 @@ class CodeViewElement extends CustomElement implements Renderable {
..text = 'Exclusive',
new DivElement()
..classes = ['memberValue']
..text = '${code.profile.formattedExclusiveTicks}'
..text = '${code.profile!.formattedExclusiveTicks}'
],
new DivElement()
..classes = ['memberItem']
@ -289,7 +289,7 @@ class CodeViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new ObjectPoolRefElement(_isolate, _code.objectPool,
new ObjectPoolRefElement(_isolate, _code.objectPool!,
queue: _r.queue)
.element
]
@ -320,9 +320,9 @@ class CodeViewElement extends CustomElement implements Renderable {
]
],
new HRElement(),
_inlineRangeTable,
_inlineRangeTable!,
new HRElement(),
_disassemblyTable
_disassemblyTable!
],
];
_updateDisassembly();
@ -337,11 +337,10 @@ class CodeViewElement extends CustomElement implements Renderable {
Future _refreshTicks() async {
S.Code code = _code as S.Code;
final isolate = code.isolate;
S.ServiceMap response =
await isolate.invokeRpc('_getCpuProfile', {'tags': 'None'});
final isolate = code.isolate!;
var response = await isolate.invokeRpc('_getCpuProfile', {'tags': 'None'});
final cpuProfile = new SampleProfile();
await cpuProfile.load(isolate, response);
await cpuProfile.load(isolate, response as S.ServiceMap);
_r.dirty();
}
@ -363,7 +362,7 @@ class CodeViewElement extends CustomElement implements Renderable {
if (code.profile == null) {
return '';
}
var intervalTick = code.profile.intervalTicks[interval.start];
var intervalTick = code.profile!.intervalTicks[interval.start];
if (intervalTick == null) {
return '';
}
@ -372,7 +371,7 @@ class CodeViewElement extends CustomElement implements Renderable {
return '';
}
var pcent = Utils.formatPercent(
intervalTick.inclusiveTicks, code.profile.profile.sampleCount);
intervalTick.inclusiveTicks, code.profile!.profile.sampleCount);
return '$pcent (${intervalTick.inclusiveTicks})';
}
@ -381,21 +380,22 @@ class CodeViewElement extends CustomElement implements Renderable {
if (code.profile == null) {
return '';
}
var intervalTick = code.profile.intervalTicks[interval.start];
var intervalTick = code.profile!.intervalTicks[interval.start];
if (intervalTick == null) {
return '';
}
var pcent = Utils.formatPercent(
intervalTick.exclusiveTicks, code.profile.profile.sampleCount);
intervalTick.exclusiveTicks, code.profile!.profile.sampleCount);
return '$pcent (${intervalTick.exclusiveTicks})';
}
String _formattedInclusive(S.CodeInstruction instruction) {
S.Code code = _code as S.Code;
if (code.profile == null) {
var profile = code.profile;
if (profile == null) {
return '';
}
var tick = code.profile.addressTicks[instruction.address];
var tick = profile.addressTicks[instruction.address];
if (tick == null) {
return '';
}
@ -403,22 +403,23 @@ class CodeViewElement extends CustomElement implements Renderable {
if (tick.inclusiveTicks == tick.exclusiveTicks) {
return '';
}
var pcent = Utils.formatPercent(
tick.inclusiveTicks, code.profile.profile.sampleCount);
var pcent =
Utils.formatPercent(tick.inclusiveTicks, profile.profile.sampleCount);
return '$pcent (${tick.inclusiveTicks})';
}
String _formattedExclusive(S.CodeInstruction instruction) {
S.Code code = _code as S.Code;
if (code.profile == null) {
var profile = code.profile;
if (profile == null) {
return '';
}
var tick = code.profile.addressTicks[instruction.address];
var tick = profile.addressTicks[instruction.address];
if (tick == null) {
return '';
}
var pcent = Utils.formatPercent(
tick.exclusiveTicks, code.profile.profile.sampleCount);
var pcent =
Utils.formatPercent(tick.exclusiveTicks, profile.profile.sampleCount);
return '$pcent (${tick.exclusiveTicks})';
}
@ -441,7 +442,7 @@ class CodeViewElement extends CustomElement implements Renderable {
}
void _addDisassemblyDOMRow() {
var tableBody = _disassemblyTableBody;
var tableBody = _disassemblyTableBody!;
assert(tableBody != null);
var tr = new TableRowElement();
@ -492,7 +493,7 @@ class CodeViewElement extends CustomElement implements Renderable {
}
void _updateDisassemblyDOMTable() {
var tableBody = _disassemblyTableBody;
var tableBody = _disassemblyTableBody!;
assert(tableBody != null);
// Resize DOM table.
if (tableBody.children.length > disassemblyTable.sortedRows.length) {
@ -517,7 +518,7 @@ class CodeViewElement extends CustomElement implements Renderable {
var i = 0;
for (var tr in tableBody.children) {
var rowIndex = disassemblyTable.sortedRows[i];
_fillDisassemblyDOMRow(tr, rowIndex);
_fillDisassemblyDOMRow(tr as TableRowElement, rowIndex);
i++;
}
}
@ -542,7 +543,7 @@ class CodeViewElement extends CustomElement implements Renderable {
}
void _addInlineDOMRow() {
var tableBody = _inlineRangeTableBody;
var tableBody = _inlineRangeTableBody!;
assert(tableBody != null);
var tr = new TableRowElement();
@ -595,7 +596,7 @@ class CodeViewElement extends CustomElement implements Renderable {
}
void _updateInlineDOMTable() {
var tableBody = _inlineRangeTableBody;
var tableBody = _inlineRangeTableBody!;
// Resize DOM table.
if (tableBody.children.length > inlineTable.sortedRows.length) {
// Shrink the table.
@ -615,7 +616,7 @@ class CodeViewElement extends CustomElement implements Renderable {
for (var i = 0; i < inlineTable.sortedRows.length; i++) {
var rowIndex = inlineTable.sortedRows[i];
var tr = tableBody.children[i];
_fillInlineDOMRow(tr, rowIndex);
_fillInlineDOMRow(tr as TableRowElement, rowIndex);
}
}
@ -624,7 +625,7 @@ class CodeViewElement extends CustomElement implements Renderable {
_updateInlineDOMTable();
}
static String _codeKindToString(M.CodeKind kind) {
static String _codeKindToString(M.CodeKind? kind) {
switch (kind) {
case M.CodeKind.dart:
return 'dart';

View file

@ -17,7 +17,7 @@ class SearchResultSelected {
typedef Iterable<dynamic> SearchBarSearchCallback(Pattern pattern);
class SearchBarElement extends CustomElement implements Renderable {
RenderingScheduler<SearchBarElement> _r;
late RenderingScheduler<SearchBarElement> _r;
StreamController<SearchResultSelected> _onSearchResultSelected =
new StreamController<SearchResultSelected>.broadcast();
@ -26,11 +26,11 @@ class SearchBarElement extends CustomElement implements Renderable {
Stream<SearchResultSelected> get onSearchResultSelected =>
_onSearchResultSelected.stream;
StreamSubscription _onKeyDownSubscription;
late StreamSubscription _onKeyDownSubscription;
Element _workspace;
SearchBarSearchCallback _search;
bool _isOpen;
Element? _workspace;
late SearchBarSearchCallback _search;
late bool _isOpen;
bool _focusRequested = false;
String _lastValue = '';
List _results = const [];
@ -41,7 +41,7 @@ class SearchBarElement extends CustomElement implements Renderable {
set isOpen(bool value) {
if (!value) {
_input.value = '';
_input!.value = '';
_lastValue = '';
if (_results.isNotEmpty) {
_results = const [];
@ -53,7 +53,7 @@ class SearchBarElement extends CustomElement implements Renderable {
}
factory SearchBarElement(SearchBarSearchCallback search,
{bool isOpen: false, Element workspace, RenderingQueue queue}) {
{bool isOpen: false, Element? workspace, RenderingQueue? queue}) {
assert(search != null);
assert(isOpen != null);
SearchBarElement e = new SearchBarElement.created();
@ -72,11 +72,11 @@ class SearchBarElement extends CustomElement implements Renderable {
_r.enable();
_workspace?.tabIndex = 1;
_onKeyDownSubscription = (_workspace ?? window).onKeyDown.listen((e) {
if (e.key.toLowerCase() == 'f' &&
if (e.key!.toLowerCase() == 'f' &&
!e.shiftKey &&
!e.altKey &&
e.ctrlKey != e.metaKey) {
if (e.metaKey == window.navigator.platform.startsWith('Mac')) {
if (e.metaKey == window.navigator.platform!.startsWith('Mac')) {
e.stopPropagation();
e.preventDefault();
isOpen = true;
@ -94,15 +94,15 @@ class SearchBarElement extends CustomElement implements Renderable {
_onKeyDownSubscription.cancel();
}
TextInputElement _input;
SpanElement _resultsArea;
TextInputElement? _input;
SpanElement? _resultsArea;
void render() {
if (_input == null) {
_input = new TextInputElement()
..onKeyPress.listen((e) {
if (e.keyCode == KeyCode.ENTER) {
if (_input.value == '') {
if (_input!.value == '') {
_lastValue = '';
if (_results.isNotEmpty) {
_results = const [];
@ -110,9 +110,9 @@ class SearchBarElement extends CustomElement implements Renderable {
_triggerSearchResultSelected();
_r.dirty();
}
} else if (_input.value != _lastValue) {
_lastValue = _input.value;
_results = _doSearch(_input.value);
} else if (_input!.value != _lastValue) {
_lastValue = _input!.value!;
_results = _doSearch(_input!.value!);
_current = 0;
_triggerSearchResultSelected();
_r.dirty();
@ -127,8 +127,8 @@ class SearchBarElement extends CustomElement implements Renderable {
});
_resultsArea = new SpanElement();
children = <Element>[
_input,
_resultsArea,
_input!,
_resultsArea!,
new ButtonElement()
..text = ''
..onClick.listen((_) {
@ -136,7 +136,7 @@ class SearchBarElement extends CustomElement implements Renderable {
})
];
}
_resultsArea.nodes = [
_resultsArea!.nodes = [
new ButtonElement()
..text = ''
..disabled = _results.isEmpty
@ -150,7 +150,7 @@ class SearchBarElement extends CustomElement implements Renderable {
];
style.visibility = isOpen ? null : 'collapse';
if (_focusRequested) {
_input.focus();
_input!.focus();
_focusRequested = false;
}
}
@ -200,6 +200,6 @@ class _CaseInsensitivePatternString implements Pattern {
Iterable<Match> allMatches(String string, [int start = 0]) =>
_pattern.allMatches(string.toLowerCase(), start);
Match matchAsPrefix(String string, [int start = 0]) =>
Match? matchAsPrefix(String string, [int start = 0]) =>
_pattern.matchAsPrefix(string.toLowerCase(), start);
}

View file

@ -16,26 +16,26 @@ typedef void VirtualCollectionUpdateCallback(
typedef bool VirtualCollectionSearchCallback(Pattern pattern, dynamic item);
class VirtualCollectionElement extends CustomElement implements Renderable {
RenderingScheduler<VirtualCollectionElement> _r;
late RenderingScheduler<VirtualCollectionElement> _r;
Stream<RenderedEvent<VirtualCollectionElement>> get onRendered =>
_r.onRendered;
VirtualCollectionCreateCallback _create;
VirtualCollectionHeaderCallback _createHeader;
VirtualCollectionUpdateCallback _update;
VirtualCollectionSearchCallback _search;
double _itemHeight;
int _top;
double _height;
List _items;
StreamSubscription _onScrollSubscription;
StreamSubscription _onResizeSubscription;
late VirtualCollectionCreateCallback _create;
VirtualCollectionHeaderCallback? _createHeader;
late VirtualCollectionUpdateCallback _update;
VirtualCollectionSearchCallback? _search;
double? _itemHeight;
int? _top;
double? _height;
List? _items;
late StreamSubscription _onScrollSubscription;
late StreamSubscription _onResizeSubscription;
List get items => _items;
List? get items => _items;
set items(Iterable value) {
_items = new List.unmodifiable(value);
set items(Iterable? value) {
_items = new List.unmodifiable(value!);
_top = null;
_searcher?.update();
_r.dirty();
@ -44,9 +44,9 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
factory VirtualCollectionElement(VirtualCollectionCreateCallback create,
VirtualCollectionUpdateCallback update,
{Iterable items: const [],
VirtualCollectionHeaderCallback createHeader,
VirtualCollectionSearchCallback search,
RenderingQueue queue}) {
VirtualCollectionHeaderCallback? createHeader,
VirtualCollectionSearchCallback? search,
RenderingQueue? queue}) {
assert(create != null);
assert(update != null);
assert(items != null);
@ -81,8 +81,8 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
_onResizeSubscription.cancel();
}
DivElement _header;
SearchBarElement _searcher;
DivElement? _header;
SearchBarElement? _searcher;
final DivElement _viewport = new DivElement()
..classes = ['viewport', 'container'];
final DivElement _spacer = new DivElement()..classes = ['spacer'];
@ -103,10 +103,11 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
if (el_index < 0) {
return null;
}
final item_index =
_top + el_index - safeFloor(_buffer.children.length * _inverse_preload);
if (0 <= item_index && item_index < items.length) {
return _items[item_index];
final item_index = _top! +
el_index -
safeFloor(_buffer.children.length * _inverse_preload);
if (0 <= item_index && item_index < items!.length) {
return _items![item_index];
}
return null;
}
@ -148,38 +149,39 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
..onSearchResultSelected.listen((e) {
takeIntoView(e.item);
});
children.insert(0, _searcher.element);
children.insert(0, _searcher!.element);
}
if (_createHeader != null) {
_header = new DivElement()
..classes = ['header', 'container']
..children = _createHeader();
children.insert(0, _header);
final rect = _header.getBoundingClientRect();
_header.classes.add('attached');
..children = _createHeader!();
children.insert(0, _header!);
final rect = _header!.getBoundingClientRect();
_header!.classes.add('attached');
_viewport.style.top = '${rect.height}px';
final width = _header.children.fold(0.0, _foldWidth);
final width = _header!.children.fold(0.0, _foldWidth);
_buffer.style.minWidth = '${width}px';
}
_itemHeight = _buffer.children[0].getBoundingClientRect().height;
_height = getBoundingClientRect().height;
_itemHeight =
_buffer.children[0].getBoundingClientRect().height as double;
_height = getBoundingClientRect().height as double;
}
if (_takeIntoView != null) {
final index = items.indexOf(_takeIntoView);
final index = items!.indexOf(_takeIntoView);
if (index >= 0) {
final minScrollTop = _itemHeight * (index + 1) - _height;
final maxScrollTop = _itemHeight * index;
final minScrollTop = _itemHeight! * (index + 1) - _height!;
final maxScrollTop = _itemHeight! * index;
_viewport.scrollTop =
safeFloor((maxScrollTop - minScrollTop) / 2 + minScrollTop);
}
_takeIntoView = null;
}
final top = safeFloor(_viewport.scrollTop / _itemHeight);
final top = safeFloor(_viewport.scrollTop / _itemHeight!);
_spacer.style.height = '${_itemHeight * (_items.length)}px';
final tail_length = safeCeil(_height / _itemHeight / _preload);
_spacer.style.height = '${_itemHeight! * (_items!.length)}px';
final tail_length = safeCeil(_height! / _itemHeight! / _preload);
final length = tail_length * 2 + tail_length * _preload;
if (_buffer.children.length < length) {
@ -191,13 +193,13 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
_top = null; // force update;
}
if ((_top == null) || ((top - _top).abs() >= tail_length)) {
_buffer.style.top = '${_itemHeight * (top - tail_length)}px';
if ((_top == null) || ((top - _top!).abs() >= tail_length)) {
_buffer.style.top = '${_itemHeight! * (top - tail_length)}px';
int i = top - tail_length;
for (final HtmlElement e in _buffer.children) {
if (0 <= i && i < _items.length) {
for (final e in _buffer.children) {
if (0 <= i && i < _items!.length) {
e.style.display = null;
_update(e, _items[i], i);
_update(e as HtmlElement, _items![i], i);
} else {
e.style.display = 'hidden';
}
@ -207,11 +209,11 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
}
if (_searcher != null) {
final current = _searcher.current;
int i = _top - tail_length;
for (final HtmlElement e in _buffer.children) {
if (0 <= i && i < _items.length) {
if (_items[i] == current) {
final current = _searcher!.current;
int i = _top! - tail_length;
for (final e in _buffer.children) {
if (0 <= i && i < _items!.length) {
if (_items![i] == current) {
e.classes.add('marked');
} else {
e.classes.remove('marked');
@ -224,14 +226,14 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
}
double _foldWidth(double value, Element child) {
return math.max(value, child.getBoundingClientRect().width);
return math.max(value, child.getBoundingClientRect().width as double);
}
void _updateHeader() {
if (_header != null) {
_header.style.left = '${-_viewport.scrollLeft}px';
_header!.style.left = '${-_viewport.scrollLeft}px';
final width = _buffer.getBoundingClientRect().width;
_header.children.last.style.width = '${width}px';
_header!.children.last.style.width = '${width}px';
}
}
@ -242,8 +244,8 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
}
void _onResize(_) {
final newHeight = getBoundingClientRect().height;
if (newHeight > _height) {
final newHeight = getBoundingClientRect().height as double;
if (newHeight > _height!) {
_height = newHeight;
_r.dirty();
} else {
@ -254,6 +256,6 @@ class VirtualCollectionElement extends CustomElement implements Renderable {
}
Iterable<dynamic> _doSearch(Pattern search) {
return _items.where((item) => _search(search, item));
return _items!.where((item) => _search!(search, item));
}
}

View file

@ -27,13 +27,13 @@ void virtualTreeUpdateLines(SpanElement element, int n) {
}
class VirtualTreeElement extends CustomElement implements Renderable {
RenderingScheduler<VirtualTreeElement> _r;
late RenderingScheduler<VirtualTreeElement> _r;
Stream<RenderedEvent<VirtualTreeElement>> get onRendered => _r.onRendered;
VritualTreeGetChildrenCallback _children;
List _items;
List _depths;
late VritualTreeGetChildrenCallback _children;
late List _items;
late List _depths;
final Set _expanded = new Set();
List get items => _items;
@ -47,8 +47,8 @@ class VirtualTreeElement extends CustomElement implements Renderable {
factory VirtualTreeElement(VirtualTreeCreateCallback create,
VirtualTreeUpdateCallback update, VritualTreeGetChildrenCallback children,
{Iterable items: const [],
VirtualTreeSearchCallback search,
RenderingQueue queue}) {
VirtualTreeSearchCallback? search,
RenderingQueue? queue}) {
assert(create != null);
assert(update != null);
assert(children != null);
@ -61,7 +61,7 @@ class VirtualTreeElement extends CustomElement implements Renderable {
return element = create((
{bool autoToggleSingleChildNodes: false,
bool autoToggleWholeTree: false}) {
var item = e._collection.getItemFromElement(element);
var item = e._collection!.getItemFromElement(element);
if (e.isExpanded(item)) {
e.collapse(item,
autoCollapseWholeTree: autoToggleWholeTree,
@ -144,11 +144,11 @@ class VirtualTreeElement extends CustomElement implements Renderable {
children = const [];
}
VirtualCollectionElement _collection;
VirtualCollectionElement? _collection;
void render() {
if (children.length == 0) {
children = <Element>[_collection.element];
children = <Element>[_collection!.element];
}
final items = [];
@ -176,8 +176,8 @@ class VirtualTreeElement extends CustomElement implements Renderable {
}
_depths = depths;
_collection.items = items;
_collection!.items = items;
_r.waitFor([_collection.onRendered.first]);
_r.waitFor([_collection!.onRendered.first]);
}
}

View file

@ -12,15 +12,15 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class ContextRefElement extends CustomElement implements Renderable {
RenderingScheduler<ContextRefElement> _r;
late RenderingScheduler<ContextRefElement> _r;
Stream<RenderedEvent<ContextRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.ContextRef _context;
M.ObjectRepository _objects;
M.Context _loadedContext;
bool _expandable;
late M.IsolateRef _isolate;
late M.ContextRef _context;
late M.ObjectRepository _objects;
M.Context? _loadedContext;
late bool _expandable;
bool _expanded = false;
M.IsolateRef get isolate => _isolate;
@ -28,7 +28,7 @@ class ContextRefElement extends CustomElement implements Renderable {
factory ContextRefElement(
M.IsolateRef isolate, M.ContextRef context, M.ObjectRepository objects,
{RenderingQueue queue, bool expandable: true}) {
{RenderingQueue? queue, bool expandable: true}) {
assert(isolate != null);
assert(context != null);
assert(objects != null);
@ -57,7 +57,7 @@ class ContextRefElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_loadedContext = await _objects.get(_isolate, _context.id);
_loadedContext = await _objects.get(_isolate, _context.id!) as M.Context;
_r.dirty();
}
@ -99,7 +99,7 @@ class ContextRefElement extends CustomElement implements Renderable {
return [new SpanElement()..text = 'Loading...'];
}
var members = <Element>[];
if (_loadedContext.parentContext != null) {
if (_loadedContext!.parentContext != null) {
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -110,14 +110,14 @@ class ContextRefElement extends CustomElement implements Renderable {
..classes = ['memberName']
..children = <Element>[
new ContextRefElement(
_isolate, _loadedContext.parentContext, _objects,
_isolate, _loadedContext!.parentContext!, _objects,
queue: _r.queue)
.element
]
]);
}
if (_loadedContext.variables.isNotEmpty) {
var variables = _loadedContext.variables.toList();
if (_loadedContext!.variables!.isNotEmpty) {
var variables = _loadedContext!.variables!.toList();
for (var index = 0; index < variables.length; index++) {
var variable = variables[index];
members.add(new DivElement()

View file

@ -22,21 +22,21 @@ import 'package:observatory/src/elements/object_common.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ContextViewElement extends CustomElement implements Renderable {
RenderingScheduler<ContextViewElement> _r;
late RenderingScheduler<ContextViewElement> _r;
Stream<RenderedEvent<ContextViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Context _context;
M.ContextRepository _contexts;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Context _context;
late M.ContextRepository _contexts;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -55,7 +55,7 @@ class ContextViewElement extends CustomElement implements Renderable {
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -104,13 +104,13 @@ class ContextViewElement extends CustomElement implements Renderable {
new NavTopMenuElement(queue: _r.queue).element,
new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element,
new NavClassMenuElement(_isolate, _context.clazz, queue: _r.queue)
new NavClassMenuElement(_isolate, _context.clazz!, queue: _r.queue)
.element,
navMenu('instance'),
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
e.element.disabled = true;
_context = await _contexts.get(_isolate, _context.id);
_context = await _contexts.get(_isolate, _context.id!);
_r.dirty();
}))
.element,
@ -146,7 +146,7 @@ class ContextViewElement extends CustomElement implements Renderable {
..classes = ['memberName']
..children = <Element>[
new ContextRefElement(
_isolate, _context.parentContext, _objects,
_isolate, _context.parentContext!, _objects,
queue: _r.queue)
.element
]
@ -156,7 +156,7 @@ class ContextViewElement extends CustomElement implements Renderable {
]);
}
content.add(new HRElement());
if (_context.variables.isNotEmpty) {
if (_context.variables!.isNotEmpty) {
int index = 0;
content.addAll([
new DivElement()
@ -167,7 +167,7 @@ class ContextViewElement extends CustomElement implements Renderable {
..content = <Element>[
new DivElement()
..classes = ['memberList']
..children = _context.variables
..children = _context.variables!
.map<Element>((variable) => new DivElement()
..classes = ['memberItem']
..children = <Element>[

View file

@ -22,21 +22,21 @@ import 'package:observatory/src/elements/sample_buffer_control.dart';
import 'package:observatory/src/elements/stack_trace_tree_config.dart';
class CpuProfileElement extends CustomElement implements Renderable {
RenderingScheduler<CpuProfileElement> _r;
late RenderingScheduler<CpuProfileElement> _r;
Stream<RenderedEvent<CpuProfileElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.IsolateSampleProfileRepository _profiles;
Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress _progress;
M.SampleProfileTag _tag = M.SampleProfileTag.none;
ProfileTreeMode _mode = ProfileTreeMode.function;
M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
String _filter = '';
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.IsolateSampleProfileRepository _profiles;
late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress? _progress;
late M.SampleProfileTag _tag = M.SampleProfileTag.none;
late ProfileTreeMode _mode = ProfileTreeMode.function;
late M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
late String _filter = '';
M.IsolateRef get isolate => _isolate;
M.NotificationRepository get notifications => _notifications;
@ -49,7 +49,7 @@ class CpuProfileElement extends CustomElement implements Renderable {
M.EventRepository events,
M.NotificationRepository notifications,
M.IsolateSampleProfileRepository profiles,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -100,15 +100,16 @@ class CpuProfileElement extends CustomElement implements Renderable {
children = content;
return;
}
content.add((new SampleBufferControlElement(_vm, _progress, _progressStream,
content.add((new SampleBufferControlElement(
_vm, _progress!, _progressStream,
selectedTag: _tag, queue: _r.queue)
..onTagChange.listen((e) {
_tag = e.element.selectedTag;
_request();
}))
.element);
if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
CpuProfileVirtualTreeElement tree;
if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
late CpuProfileVirtualTreeElement tree;
content.addAll([
new BRElement(),
(new StackTraceTreeConfigElement(
@ -134,7 +135,7 @@ class CpuProfileElement extends CustomElement implements Renderable {
}))
.element,
new BRElement(),
(tree = new CpuProfileVirtualTreeElement(_isolate, _progress.profile,
(tree = new CpuProfileVirtualTreeElement(_isolate, _progress!.profile,
queue: _r.queue))
.element
]);
@ -149,7 +150,7 @@ class CpuProfileElement extends CustomElement implements Renderable {
_r.dirty();
_progress = (await _progressStream.first).progress;
_r.dirty();
if (M.isSampleProcessRunning(_progress.status)) {
if (M.isSampleProcessRunning(_progress!.status)) {
_progress = (await _progressStream.last).progress;
_r.dirty();
}

View file

@ -19,45 +19,45 @@ export 'package:observatory/src/elements/stack_trace_tree_config.dart'
show ProfileTreeMode;
class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
RenderingScheduler<CpuProfileVirtualTreeElement> _r;
late RenderingScheduler<CpuProfileVirtualTreeElement> _r;
Stream<RenderedEvent<CpuProfileVirtualTreeElement>> get onRendered =>
_r.onRendered;
M.ProfileTreeDirection _direction;
ProfileTreeMode _mode;
M.SampleProfileType _type;
M.IsolateRef _isolate;
M.SampleProfile _profile;
Iterable<M.CallTreeNodeFilter> _filters;
late M.ProfileTreeDirection _direction;
late ProfileTreeMode _mode;
late M.SampleProfileType _type;
late M.IsolateRef _isolate;
late M.SampleProfile _profile;
Iterable<M.CallTreeNodeFilter>? _filters;
M.ProfileTreeDirection get direction => _direction;
ProfileTreeMode get mode => _mode;
M.SampleProfileType get type => _type;
M.IsolateRef get isolate => _isolate;
M.SampleProfile get profile => _profile;
Iterable<M.CallTreeNodeFilter> get filters => _filters;
Iterable<M.CallTreeNodeFilter>? get filters => _filters;
set direction(M.ProfileTreeDirection value) =>
_direction = _r.checkAndReact(_direction, value);
set mode(ProfileTreeMode value) => _mode = _r.checkAndReact(_mode, value);
set filters(Iterable<M.CallTreeNodeFilter> value) {
_filters = new List.unmodifiable(value);
set filters(Iterable<M.CallTreeNodeFilter>? value) {
_filters = new List.unmodifiable(value!);
_r.dirty();
}
factory CpuProfileVirtualTreeElement(Object owner, M.SampleProfile profile,
factory CpuProfileVirtualTreeElement(Object? owner, M.SampleProfile profile,
{ProfileTreeMode mode: ProfileTreeMode.function,
M.SampleProfileType type: M.SampleProfileType.cpu,
M.ProfileTreeDirection direction: M.ProfileTreeDirection.exclusive,
RenderingQueue queue}) {
RenderingQueue? queue}) {
assert(profile != null);
assert(mode != null);
assert(direction != null);
CpuProfileVirtualTreeElement e = new CpuProfileVirtualTreeElement.created();
e._r =
new RenderingScheduler<CpuProfileVirtualTreeElement>(e, queue: queue);
e._isolate = owner;
e._isolate = owner as M.Isolate;
e._profile = profile;
e._mode = mode;
e._type = type;
@ -81,7 +81,7 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
children = <Element>[];
}
VirtualTreeElement _tree;
VirtualTreeElement? _tree;
void render() {
var tree;
@ -121,7 +121,7 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
throw new Exception('Unknown SampleProfileType: $type');
}
if (filters != null) {
tree = filters.fold(tree, (tree, filter) {
tree = filters!.fold(tree, (dynamic tree, filter) {
return tree?.filtered(filter);
});
}
@ -139,9 +139,9 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
];
return;
} else if (tree.root.children.length == 1) {
_tree.expand(tree.root.children.first, autoExpandSingleChildNodes: true);
_tree!.expand(tree.root.children.first, autoExpandSingleChildNodes: true);
}
children = <Element>[_tree.element];
children = <Element>[_tree!.element];
}
static HtmlElement _createCpuRow(toggle) {
@ -203,13 +203,13 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
_updateLines(element.children[2].children, depth);
if (item.children.isNotEmpty) {
element.children[3].text =
_tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
_tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
} else {
element.children[3].text = '';
}
element.children[4].text = Utils.formatPercentNormalized(item.percentage);
element.children[5] = (new FunctionRefElement(
_isolate, item.profileFunction.function,
_isolate, item.profileFunction.function!,
queue: _r.queue)
..classes = ['name'])
.element;
@ -228,13 +228,13 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
_updateLines(element.children[2].children, depth);
if (item.children.isNotEmpty) {
element.children[3].text =
_tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
_tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
} else {
element.children[3].text = '';
}
element.children[4].text = Utils.formatPercentNormalized(item.percentage);
element.children[5] = (new FunctionRefElement(
null, item.profileFunction.function,
null, item.profileFunction.function!,
queue: _r.queue)
..classes = ['name'])
.element;
@ -243,7 +243,7 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
bool _searchFunction(Pattern pattern, itemDynamic) {
M.FunctionCallTreeNode item = itemDynamic;
return M
.getFunctionFullName(item.profileFunction.function)
.getFunctionFullName(item.profileFunction.function!)
.contains(pattern);
}
@ -256,13 +256,13 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
_updateLines(element.children[2].children, depth);
if (item.children.isNotEmpty) {
element.children[3].text =
_tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
_tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
} else {
element.children[3].text = '';
}
element.children[4].text = Utils.formatPercentNormalized(item.percentage);
element.children[5] =
(new CodeRefElement(_isolate, item.profileCode.code, queue: _r.queue)
(new CodeRefElement(_isolate, item.profileCode.code!, queue: _r.queue)
..classes = ['name'])
.element;
}
@ -280,20 +280,20 @@ class CpuProfileVirtualTreeElement extends CustomElement implements Renderable {
_updateLines(element.children[2].children, depth);
if (item.children.isNotEmpty) {
element.children[3].text =
_tree.isExpanded(item) ? _expandedIcon : _collapsedIcon;
_tree!.isExpanded(item) ? _expandedIcon : _collapsedIcon;
} else {
element.children[3].text = '';
}
element.children[4].text = Utils.formatPercentNormalized(item.percentage);
element.children[5] =
(new CodeRefElement(null, item.profileCode.code, queue: _r.queue)
(new CodeRefElement(null, item.profileCode.code!, queue: _r.queue)
..classes = ['name'])
.element;
}
bool _searchCode(Pattern pattern, itemDynamic) {
M.CodeCallTreeNode item = itemDynamic;
return item.profileCode.code.name.contains(pattern);
return item.profileCode.code!.name!.contains(pattern);
}
static _updateLines(List<Element> lines, int n) {

View file

@ -30,17 +30,17 @@ enum _SortingField { exclusive, inclusive, caller, callee, method }
enum _SortingDirection { ascending, descending }
class CpuProfileTableElement extends CustomElement implements Renderable {
RenderingScheduler<CpuProfileTableElement> _r;
late RenderingScheduler<CpuProfileTableElement> _r;
Stream<RenderedEvent<CpuProfileTableElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.IsolateSampleProfileRepository _profiles;
Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress _progress;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.IsolateSampleProfileRepository _profiles;
late Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress? _progress;
final _sortingField = <_Table, _SortingField>{
_Table.functions: _SortingField.exclusive,
_Table.caller: _SortingField.caller,
@ -64,7 +64,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
M.EventRepository events,
M.NotificationRepository notifications,
M.IsolateSampleProfileRepository profiles,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -115,10 +115,10 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
children = content;
return;
}
content.add(new SampleBufferControlElement(_vm, _progress, _progressStream,
content.add(new SampleBufferControlElement(_vm, _progress!, _progressStream,
showTag: false, queue: _r.queue)
.element);
if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
content.add(new BRElement());
content.addAll(_createTables());
content.add(new BRElement());
@ -127,10 +127,10 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
children = content;
}
M.ProfileFunction _selected;
VirtualCollectionElement _functions;
VirtualCollectionElement _callers;
VirtualCollectionElement _callees;
M.ProfileFunction? _selected;
VirtualCollectionElement? _functions;
VirtualCollectionElement? _callers;
VirtualCollectionElement? _callees;
List<Element> _createTables() {
_functions = _functions ??
@ -139,11 +139,11 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
search: _searchFunction,
queue: _r.queue);
// If there's no samples, don't populate the function list.
_functions.items = (_progress.profile.sampleCount != 0)
? _progress.profile.functions.toList()
_functions!.items = (_progress!.profile.sampleCount != 0)
? _progress!.profile.functions.toList()
: []
..sort(_createSorter(_Table.functions));
_functions.takeIntoView(_selected);
_functions!.takeIntoView(_selected);
_callers = _callers ??
new VirtualCollectionElement(_createCaller, _updateCaller,
createHeader: _createCallerHeader,
@ -155,13 +155,13 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
search: _searchFunction,
queue: _r.queue);
if (_selected != null) {
_callers.items = _selected.callers.keys.toList()
_callers!.items = _selected!.callers.keys.toList()
..sort(_createSorter(_Table.caller));
_callees.items = _selected.callees.keys.toList()
_callees!.items = _selected!.callees.keys.toList()
..sort(_createSorter(_Table.callee));
} else {
_callers.items = const [];
_callees.items = const [];
_callers!.items = const [];
_callees!.items = const [];
}
return <Element>[
new DivElement()
@ -169,25 +169,25 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
..children = <Element>[
new DivElement()
..classes = ['profile-trees-all']
..children = <Element>[_functions.element],
..children = <Element>[_functions!.element],
new DivElement()
..classes = ['profile-trees-current']
..children = <Element>[
new DivElement()
..classes = ['profile-trees-caller']
..children = <Element>[_callers.element],
..children = <Element>[_callers!.element],
new DivElement()
..classes = ['profile-trees-selected']
..children = _selected == null
? [new SpanElement()..text = 'No element selected']
: [
new FunctionRefElement(_isolate, _selected.function,
new FunctionRefElement(_isolate, _selected!.function!,
queue: _r.queue)
.element
],
new DivElement()
..classes = ['profile-trees-callee']
..children = <Element>[_callees.element]
..children = <Element>[_callees!.element]
]
]
];
@ -209,7 +209,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
if (e.target is AnchorElement) {
return;
}
_selected = _functions.getItemFromElement(element);
_selected = _functions!.getItemFromElement(element);
_r.dirty();
});
return element;
@ -224,7 +224,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
}
e.children[0].text = Utils.formatPercentNormalized(_getExclusiveT(item));
e.children[1].text = Utils.formatPercentNormalized(_getInclusiveT(item));
e.children[2].text = M.getFunctionFullName(item.function);
e.children[2].text = M.getFunctionFullName(item.function!);
}
List<HtmlElement> _createFunctionHeader() => [
@ -250,7 +250,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
bool _searchFunction(Pattern pattern, itemDynamic) {
M.ProfileFunction item = itemDynamic;
return M.getFunctionFullName(item.function).contains(pattern);
return M.getFunctionFullName(item.function!).contains(pattern);
}
void _setSorting(
@ -284,7 +284,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
if (e.target is AnchorElement) {
return;
}
_selected = _callees.getItemFromElement(element);
_selected = _callees!.getItemFromElement(element);
_r.dirty();
});
return element;
@ -323,7 +323,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
if (e.target is AnchorElement) {
return;
}
_selected = _callers.getItemFromElement(element);
_selected = _callers!.getItemFromElement(element);
_r.dirty();
});
return element;
@ -361,7 +361,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
..onClick.listen((_) => _setSorting(table, field, direction));
List<Element> _createTree() {
CpuProfileVirtualTreeElement tree;
late CpuProfileVirtualTreeElement tree;
return [
(new StackTraceTreeConfigElement(
showMode: false,
@ -383,7 +383,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
}))
.element,
new BRElement(),
(tree = new CpuProfileVirtualTreeElement(_isolate, _progress.profile,
(tree = new CpuProfileVirtualTreeElement(_isolate, _progress!.profile,
mode: ProfileTreeMode.function,
direction: M.ProfileTreeDirection.exclusive,
queue: _r.queue)
@ -411,7 +411,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
_r.dirty();
_progress = (await _progressStream.first).progress;
_r.dirty();
if (M.isSampleProcessRunning(_progress.status)) {
if (M.isSampleProcessRunning(_progress!.status)) {
_progress = (await _progressStream.last).progress;
_r.dirty();
}
@ -445,7 +445,7 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
getter = _getCallerT;
break;
case _SortingField.method:
getter = (M.ProfileFunction s) => M.getFunctionFullName(s.function);
getter = (M.ProfileFunction s) => M.getFunctionFullName(s.function!);
break;
}
switch (_sortingDirection[table]) {
@ -467,7 +467,9 @@ class CpuProfileTableElement extends CustomElement implements Renderable {
static double _getInclusiveT(M.ProfileFunction f) =>
f.normalizedInclusiveTicks;
double _getCalleeT(M.ProfileFunction f) =>
_selected.callees[f] / _selected.callees.values.reduce((a, b) => a + b);
_selected!.callees[f]! /
_selected!.callees.values.reduce((a, b) => a + b);
double _getCallerT(M.ProfileFunction f) =>
_selected.callers[f] / _selected.callers.values.reduce((a, b) => a + b);
_selected!.callers[f]! /
_selected!.callers.values.reduce((a, b) => a + b);
}

View file

@ -16,15 +16,15 @@ class CurlyBlockToggleEvent {
}
class CurlyBlockElement extends CustomElement implements Renderable {
RenderingScheduler<CurlyBlockElement> _r;
late RenderingScheduler<CurlyBlockElement> _r;
final StreamController<CurlyBlockToggleEvent> _onToggle =
new StreamController<CurlyBlockToggleEvent>.broadcast();
Stream<CurlyBlockToggleEvent> get onToggle => _onToggle.stream;
Stream<RenderedEvent<CurlyBlockElement>> get onRendered => _r.onRendered;
bool _expanded;
bool _disabled;
late bool _expanded;
late bool _disabled;
Iterable<Element> _content = const [];
bool get expanded => _expanded;
@ -43,7 +43,7 @@ class CurlyBlockElement extends CustomElement implements Renderable {
}
factory CurlyBlockElement(
{bool expanded: false, bool disabled: false, RenderingQueue queue}) {
{bool expanded: false, bool disabled: false, RenderingQueue? queue}) {
assert(expanded != null);
assert(disabled != null);
CurlyBlockElement e = new CurlyBlockElement.created();

File diff suppressed because it is too large Load diff

View file

@ -11,15 +11,15 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
class ErrorRefElement extends CustomElement implements Renderable {
RenderingScheduler<ErrorRefElement> _r;
late RenderingScheduler<ErrorRefElement> _r;
Stream<RenderedEvent<ErrorRefElement>> get onRendered => _r.onRendered;
ErrorRef _error;
late ErrorRef _error;
ErrorRef get error => _error;
factory ErrorRefElement(ErrorRef error, {RenderingQueue queue}) {
factory ErrorRefElement(ErrorRef error, {RenderingQueue? queue}) {
assert(error != null);
ErrorRefElement e = new ErrorRefElement.created();
e._r = new RenderingScheduler<ErrorRefElement>(e, queue: queue);

View file

@ -15,18 +15,18 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ErrorViewElement extends CustomElement implements Renderable {
RenderingScheduler<ErrorViewElement> _r;
late RenderingScheduler<ErrorViewElement> _r;
Stream<RenderedEvent<ErrorViewElement>> get onRendered => _r.onRendered;
M.Error _error;
M.NotificationRepository _notifications;
late M.Error _error;
late M.NotificationRepository _notifications;
M.Error get error => _error;
factory ErrorViewElement(
M.NotificationRepository notifications, M.Error error,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(error != null);
assert(notifications != null);
ErrorViewElement e = new ErrorViewElement.created();
@ -71,7 +71,7 @@ class ErrorViewElement extends CustomElement implements Renderable {
];
}
static String _kindToString(M.ErrorKind kind) {
static String _kindToString(M.ErrorKind? kind) {
switch (kind) {
case M.ErrorKind.unhandledException:
return 'Unhandled Exception';

View file

@ -13,18 +13,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/instance_ref.dart';
class EvalBoxElement extends CustomElement implements Renderable {
RenderingScheduler<EvalBoxElement> _r;
late RenderingScheduler<EvalBoxElement> _r;
Stream<RenderedEvent<EvalBoxElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.ObjectRef _context;
M.ObjectRepository _objects;
M.EvalRepository _eval;
late M.IsolateRef _isolate;
late M.ObjectRef _context;
late M.ObjectRepository _objects;
late M.EvalRepository _eval;
final _results = <_ExpressionDescription>[];
String _expression = '';
bool _multiline;
Iterable<String> _quickExpressions;
String? _expression = '';
late bool _multiline;
late Iterable<String> _quickExpressions;
M.IsolateRef get isolate => _isolate;
M.ObjectRef get context => _context;
@ -33,7 +33,7 @@ class EvalBoxElement extends CustomElement implements Renderable {
M.ObjectRepository objects, M.EvalRepository eval,
{bool multiline: false,
Iterable<String> quickExpressions: const [],
RenderingQueue queue}) {
RenderingQueue? queue}) {
assert(isolate != null);
assert(context != null);
assert(objects != null);
@ -136,7 +136,7 @@ class EvalBoxElement extends CustomElement implements Renderable {
var area = new TextAreaElement()
..classes = ['textbox']
..placeholder = 'evaluate an expression'
..value = _expression
..value = _expression!
..onKeyUp.where((e) => e.key == '\n').listen((e) {
e.preventDefault();
_run();
@ -152,7 +152,7 @@ class EvalBoxElement extends CustomElement implements Renderable {
var textbox = new TextInputElement()
..classes = ['textbox']
..placeholder = 'evaluate an expression'
..value = _expression
..value = _expression!
..onKeyUp.where((e) => e.key == '\n').listen((e) {
e.preventDefault();
_run();
@ -177,15 +177,15 @@ class EvalBoxElement extends CustomElement implements Renderable {
final checkbox = new CheckboxInputElement()..checked = _multiline;
checkbox.onClick.listen((e) {
e.preventDefault();
_multiline = checkbox.checked;
_multiline = checkbox.checked!;
_r.dirty();
});
return checkbox;
}
Future _run() async {
if (_expression == null || _expression.isEmpty) return;
final expression = _expression;
if (expression == null || expression.isEmpty) return;
_expression = null;
final result = new _ExpressionDescription.pending(expression);
_results.add(result);
@ -199,7 +199,7 @@ class EvalBoxElement extends CustomElement implements Renderable {
class _ExpressionDescription {
final String expression;
final M.ObjectRef value;
final M.ObjectRef? value;
bool get isPending => value == null;
_ExpressionDescription(this.expression, this.value);

View file

@ -11,21 +11,21 @@ import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/instance_ref.dart';
class FieldRefElement extends CustomElement implements Renderable {
RenderingScheduler<FieldRefElement> _r;
late RenderingScheduler<FieldRefElement> _r;
Stream<RenderedEvent<FieldRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.FieldRef _field;
M.ObjectRepository _objects;
bool _expandable;
late M.IsolateRef _isolate;
late M.FieldRef _field;
late M.ObjectRepository _objects;
late bool _expandable;
M.IsolateRef get isolate => _isolate;
M.FieldRef get field => _field;
factory FieldRefElement(
M.IsolateRef isolate, M.FieldRef field, M.ObjectRepository objects,
{RenderingQueue queue, bool expandable: true}) {
{RenderingQueue? queue, bool expandable: true}) {
assert(isolate != null);
assert(field != null);
assert(objects != null);
@ -55,21 +55,21 @@ class FieldRefElement extends CustomElement implements Renderable {
void render() {
var header = '';
if (_field.isStatic) {
if (_field.isStatic!) {
if (_field.dartOwner is M.ClassRef) {
header += 'static ';
} else {
header += 'top-level ';
}
}
if (_field.isFinal) {
if (_field.isFinal!) {
header += 'final ';
} else if (_field.isConst) {
} else if (_field.isConst!) {
header += 'const ';
} else if (_field.declaredType.name == 'dynamic') {
} else if (_field.declaredType!.name == 'dynamic') {
header += 'var ';
}
if (_field.declaredType.name == 'dynamic') {
if (_field.declaredType!.name == 'dynamic') {
children = <Element>[
new SpanElement()..text = header,
new AnchorElement(href: Uris.inspect(_isolate, object: _field))
@ -78,7 +78,7 @@ class FieldRefElement extends CustomElement implements Renderable {
} else {
children = <Element>[
new SpanElement()..text = header,
new InstanceRefElement(_isolate, _field.declaredType, _objects,
new InstanceRefElement(_isolate, _field.declaredType!, _objects,
queue: _r.queue, expandable: _expandable)
.element,
new SpanElement()..text = ' ',

View file

@ -27,24 +27,24 @@ import 'package:observatory/src/elements/source_link.dart';
import 'package:observatory/src/elements/view_footer.dart';
class FieldViewElement extends CustomElement implements Renderable {
RenderingScheduler<FieldViewElement> _r;
late RenderingScheduler<FieldViewElement> _r;
Stream<RenderedEvent<FieldViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Field _field;
M.LibraryRef _library;
M.FieldRepository _fields;
M.ClassRepository _classes;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ScriptRepository _scripts;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Field _field;
M.LibraryRef? _library;
late M.FieldRepository _fields;
late M.ClassRepository _classes;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ScriptRepository _scripts;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -65,7 +65,7 @@ class FieldViewElement extends CustomElement implements Renderable {
M.RetainingPathRepository retainingPaths,
M.ScriptRepository scripts,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -95,7 +95,7 @@ class FieldViewElement extends CustomElement implements Renderable {
e._scripts = scripts;
e._objects = objects;
if (field.dartOwner is M.LibraryRef) {
e._library = field.dartOwner;
e._library = field.dartOwner as M.LibraryRef;
}
return e;
}
@ -118,22 +118,22 @@ class FieldViewElement extends CustomElement implements Renderable {
void render() {
var header = '';
if (_field.isStatic) {
if (_field.isStatic!) {
if (_field.dartOwner is M.ClassRef) {
header += 'static ';
} else {
header += 'top-level ';
}
}
if (_field.isFinal) {
if (_field.isFinal!) {
header += 'final ';
} else if (_field.isConst) {
} else if (_field.isConst!) {
header += 'const ';
}
if (_field.declaredType.name == 'dynamic') {
if (_field.declaredType!.name == 'dynamic') {
header += 'var';
} else {
header += _field.declaredType.name;
header += _field.declaredType!.name!;
}
children = <Element>[
navBar(_createMenu()),
@ -155,10 +155,10 @@ class FieldViewElement extends CustomElement implements Renderable {
..children = _field.location == null
? const []
: [
new ScriptInsetElement(_isolate, _field.location.script,
new ScriptInsetElement(_isolate, _field.location!.script,
_scripts, _objects, _events,
startPos: field.location.tokenPos,
endPos: field.location.tokenPos,
startPos: field.location!.tokenPos,
endPos: field.location!.tokenPos,
queue: _r.queue)
.element
],
@ -174,15 +174,15 @@ class FieldViewElement extends CustomElement implements Renderable {
new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element
];
if (_library != null) {
menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue)
menu.add(new NavLibraryMenuElement(_isolate, _library!, queue: _r.queue)
.element);
} else if (_field.dartOwner is M.ClassRef) {
menu.add(
new NavClassMenuElement(_isolate, _field.dartOwner, queue: _r.queue)
.element);
menu.add(new NavClassMenuElement(_isolate, _field.dartOwner as M.ClassRef,
queue: _r.queue)
.element);
}
menu.addAll(<Element>[
navMenu(_field.name),
navMenu(_field.name!),
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) {
e.element.disabled = true;
@ -220,13 +220,13 @@ class FieldViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new SourceLinkElement(_isolate, field.location, _scripts,
new SourceLinkElement(_isolate, field.location!, _scripts,
queue: _r.queue)
.element
]
]
];
if (!_field.isStatic) {
if (!_field.isStatic!) {
members.add(new DivElement()
..classes = ['memberItem']
..title = 'The types observed for this field at runtime. '
@ -269,22 +269,23 @@ class FieldViewElement extends CustomElement implements Renderable {
break;
case M.GuardClassKind.single:
guard.add(
new ClassRefElement(_isolate, _field.guardClass, queue: _r.queue)
new ClassRefElement(_isolate, _field.guardClass!, queue: _r.queue)
.element);
break;
}
guard.add(new SpanElement()
..text =
_field.guardNullable ? '— null observed' : '— null not observed');
_field.guardNullable! ? '— null observed' : '— null not observed');
return guard;
}
Future _refresh() async {
_field = await _fields.get(_isolate, _field.id);
_field = await _fields.get(_isolate, _field.id!);
if (_field.dartOwner is M.LibraryRef) {
_library = _field.dartOwner;
_library = _field.dartOwner as M.LibraryRef;
} else if (_field.dartOwner is M.ClassRef) {
_library = (await _classes.get(_isolate, _field.dartOwner.id)).library;
var cls = _field.dartOwner as M.ClassRef;
_library = (await _classes.get(_isolate, cls.id!)).library!;
}
_r.dirty();
}

View file

@ -19,21 +19,21 @@ import 'package:observatory/src/elements/nav/vm_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class FlagListElement extends CustomElement implements Renderable {
RenderingScheduler<FlagListElement> _r;
late RenderingScheduler<FlagListElement> _r;
Stream<RenderedEvent<FlagListElement>> get onRendered => _r.onRendered;
M.VMRef _vm;
M.EventRepository _events;
M.FlagsRepository _repository;
M.NotificationRepository _notifications;
Iterable<M.Flag> _flags;
late M.VMRef _vm;
late M.EventRepository _events;
late M.FlagsRepository _repository;
late M.NotificationRepository _notifications;
Iterable<M.Flag>? _flags;
M.VMRef get vm => _vm;
factory FlagListElement(M.VMRef vm, M.EventRepository events,
M.FlagsRepository repository, M.NotificationRepository notifications,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(events != null);
assert(repository != null);
@ -68,8 +68,8 @@ class FlagListElement extends CustomElement implements Renderable {
if (_flags == null) {
content.add(new HeadingElement.h1()..text = 'Loading Flags...');
} else {
final modified = _flags.where(_isModified);
final unmodified = _flags.where(_isUnmodified);
final modified = _flags!.where(_isModified);
final unmodified = _flags!.where(_isUnmodified);
if (modified.isNotEmpty) {
content.add(new HeadingElement.h1()..text = 'Modified Flags');
@ -91,7 +91,7 @@ class FlagListElement extends CustomElement implements Renderable {
children = <Element>[
navBar(<Element>[
new NavTopMenuElement(queue: _r.queue).element,
new NavVMMenuElement(_vm, _events, queue: _r.queue).element,
new NavVMMenuElement(_vm as M.VM, _events, queue: _r.queue).element,
navMenu('flags', link: Uris.flags()),
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
@ -137,7 +137,7 @@ class FlagListElement extends CustomElement implements Renderable {
new SpanElement()..text = '=',
new SpanElement()
..classes = ['value']
..text = flag.valueAsString ?? 'NULL'
..text = flag.valueAsString
],
new BRElement(),
];

View file

@ -20,20 +20,20 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class FunctionRefElement extends CustomElement implements Renderable {
RenderingScheduler<FunctionRefElement> _r;
late RenderingScheduler<FunctionRefElement> _r;
Stream<RenderedEvent<FunctionRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.FunctionRef _function;
bool _qualified;
M.IsolateRef? _isolate;
late M.FunctionRef _function;
late bool _qualified;
M.IsolateRef get isolate => _isolate;
M.IsolateRef? get isolate => _isolate;
M.FunctionRef get function => _function;
bool get qualified => _qualified;
factory FunctionRefElement(M.IsolateRef isolate, M.FunctionRef function,
{bool qualified: true, RenderingQueue queue}) {
factory FunctionRefElement(M.IsolateRef? isolate, M.FunctionRef function,
{bool qualified: true, RenderingQueue? queue}) {
assert(function != null);
assert(qualified != null);
FunctionRefElement e = new FunctionRefElement.created();
@ -65,11 +65,11 @@ class FunctionRefElement extends CustomElement implements Renderable {
new AnchorElement(
href: (M.isSyntheticFunction(_function.kind) || (_isolate == null))
? null
: Uris.inspect(_isolate, object: _function))
: Uris.inspect(_isolate!, object: _function))
..text = _function.name
];
if (qualified) {
M.ObjectRef owner = _function.dartOwner;
M.ObjectRef? owner = _function.dartOwner;
while (owner is M.FunctionRef) {
M.FunctionRef function = (owner as M.FunctionRef);
content.addAll([
@ -77,7 +77,7 @@ class FunctionRefElement extends CustomElement implements Renderable {
new AnchorElement(
href: (M.isSyntheticFunction(function.kind) || (_isolate == null))
? null
: Uris.inspect(_isolate, object: function))
: Uris.inspect(_isolate!, object: function))
..text = function.name
]);
owner = function.dartOwner;
@ -85,7 +85,8 @@ class FunctionRefElement extends CustomElement implements Renderable {
if (owner is M.ClassRef) {
content.addAll([
new SpanElement()..text = '.',
new ClassRefElement(_isolate, owner, queue: _r.queue).element
new ClassRefElement(_isolate!, owner as M.ClassRef, queue: _r.queue)
.element
]);
}
}

View file

@ -30,24 +30,24 @@ import 'package:observatory/src/elements/source_link.dart';
import 'package:observatory/src/elements/view_footer.dart';
class FunctionViewElement extends CustomElement implements Renderable {
RenderingScheduler<FunctionViewElement> _r;
late RenderingScheduler<FunctionViewElement> _r;
Stream<RenderedEvent<FunctionViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.ServiceFunction _function;
M.LibraryRef _library;
M.FunctionRepository _functions;
M.ClassRepository _classes;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ScriptRepository _scripts;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.ServiceFunction _function;
M.LibraryRef? _library;
late M.FunctionRepository _functions;
late M.ClassRepository _classes;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ScriptRepository _scripts;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -68,7 +68,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
M.RetainingPathRepository retainingPaths,
M.ScriptRepository scripts,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -98,7 +98,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
e._scripts = scripts;
e._objects = objects;
if (function.dartOwner is M.LibraryRef) {
e._library = function.dartOwner;
e._library = function.dartOwner as M.LibraryRef;
}
return e;
}
@ -140,7 +140,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
..children = _function.location == null
? const []
: [
new SourceInsetElement(_isolate, _function.location,
new SourceInsetElement(_isolate, _function.location!,
_scripts, _objects, _events,
queue: _r.queue)
.element
@ -157,15 +157,16 @@ class FunctionViewElement extends CustomElement implements Renderable {
new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element
];
if (_library != null) {
menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue)
menu.add(new NavLibraryMenuElement(_isolate, _library!, queue: _r.queue)
.element);
} else if (_function.dartOwner is M.ClassRef) {
menu.add(new NavClassMenuElement(_isolate, _function.dartOwner,
menu.add(new NavClassMenuElement(
_isolate, _function.dartOwner as M.ClassRef,
queue: _r.queue)
.element);
}
menu.addAll(<Element>[
navMenu(_function.name),
navMenu(_function.name!),
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) {
e.element.disabled = true;
@ -189,8 +190,8 @@ class FunctionViewElement extends CustomElement implements Renderable {
..classes = ['memberName']
..children = <Element>[
new SpanElement()
..text = '${_function.isStatic ? "static " : ""}'
'${_function.isConst ? "const " : ""}'
..text = '${_function.isStatic! ? "static " : ""}'
'${_function.isConst! ? "const " : ""}'
'${_functionKindToString(_function.kind)}'
]
],
@ -220,7 +221,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new FieldRefElement(_isolate, _function.field, _objects,
new FieldRefElement(_isolate, _function.field!, _objects,
queue: _r.queue)
.element
]
@ -235,7 +236,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new SourceLinkElement(_isolate, _function.location, _scripts,
new SourceLinkElement(_isolate, _function.location!, _scripts,
queue: _r.queue)
.element
]
@ -250,7 +251,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new CodeRefElement(_isolate, _function.code, queue: _r.queue)
new CodeRefElement(_isolate, _function.code!, queue: _r.queue)
.element
]
]);
@ -265,7 +266,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new CodeRefElement(_isolate, _function.unoptimizedCode,
new CodeRefElement(_isolate, _function.unoptimizedCode!,
queue: _r.queue)
.element,
new SpanElement()
@ -286,7 +287,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new CodeRefElement(_isolate, _function.bytecode, queue: _r.queue)
new CodeRefElement(_isolate, _function.bytecode!, queue: _r.queue)
.element,
]
]);
@ -305,7 +306,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberName']
..children = <Element>[
new InstanceRefElement(_isolate, _function.icDataArray, _objects,
new InstanceRefElement(_isolate, _function.icDataArray!, _objects,
queue: _r.queue)
.element
]
@ -331,7 +332,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
..text = 'optimizable',
new DivElement()
..classes = ['memberName']
..text = _function.isOptimizable ? 'yes' : 'no'
..text = _function.isOptimizable! ? 'yes' : 'no'
],
new DivElement()
..classes = ['memberItem']
@ -341,7 +342,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
..text = 'inlinable',
new DivElement()
..classes = ['memberName']
..text = _function.isInlinable ? 'yes' : 'no'
..text = _function.isInlinable! ? 'yes' : 'no'
],
new DivElement()
..classes = ['memberItem']
@ -351,7 +352,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
..text = 'intrinsic',
new DivElement()
..classes = ['memberName']
..text = _function.hasIntrinsic ? 'yes' : 'no'
..text = _function.hasIntrinsic! ? 'yes' : 'no'
],
new DivElement()
..classes = ['memberItem']
@ -361,7 +362,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
..text = 'recognized',
new DivElement()
..classes = ['memberName']
..text = _function.isRecognized ? 'yes' : 'no'
..text = _function.isRecognized! ? 'yes' : 'no'
],
new DivElement()
..classes = ['memberItem']
@ -371,7 +372,7 @@ class FunctionViewElement extends CustomElement implements Renderable {
..text = 'native',
new DivElement()
..classes = ['memberName']
..text = _function.isNative ? 'yes' : 'no'
..text = _function.isNative! ? 'yes' : 'no'
],
new DivElement()
..classes = ['memberItem']
@ -388,16 +389,17 @@ class FunctionViewElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_function = await _functions.get(_isolate, _function.id);
_function = await _functions.get(_isolate, _function.id!);
if (_function.dartOwner is M.LibraryRef) {
_library = _function.dartOwner;
_library = _function.dartOwner as M.LibraryRef;
} else if (_function.dartOwner is M.ClassRef) {
_library = (await _classes.get(_isolate, _function.dartOwner.id)).library;
var cls = _function.dartOwner as M.ClassRef;
_library = (await _classes.get(_isolate, cls.id!)).library!;
}
_r.dirty();
}
static String _functionKindToString(M.FunctionKind kind) {
static String _functionKindToString(M.FunctionKind? kind) {
switch (kind) {
case M.FunctionKind.regular:
return 'regular';

View file

@ -14,19 +14,19 @@ import 'package:observatory/src/elements/nav/notify.dart';
import 'package:observatory/src/elements/nav/top_menu.dart';
class GeneralErrorElement extends CustomElement implements Renderable {
RenderingScheduler<GeneralErrorElement> _r;
late RenderingScheduler<GeneralErrorElement> _r;
Stream<RenderedEvent<GeneralErrorElement>> get onRendered => _r.onRendered;
M.NotificationRepository _notifications;
String _message;
late M.NotificationRepository _notifications;
late String _message;
String get message => _message;
set message(String value) => _message = _r.checkAndReact(_message, value);
factory GeneralErrorElement(M.NotificationRepository notifications,
{String message: '', RenderingQueue queue}) {
{String message: '', RenderingQueue? queue}) {
assert(notifications != null);
assert(message != null);
GeneralErrorElement e = new GeneralErrorElement.created();

View file

@ -21,21 +21,21 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/nav/vm_menu.dart';
class HeapMapElement extends CustomElement implements Renderable {
RenderingScheduler<HeapMapElement> _r;
late RenderingScheduler<HeapMapElement> _r;
Stream<RenderedEvent<HeapMapElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
M.NotificationRepository get notifications => _notifications;
factory HeapMapElement(M.VM vm, M.IsolateRef isolate,
M.EventRepository events, M.NotificationRepository notifications,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -65,9 +65,9 @@ class HeapMapElement extends CustomElement implements Renderable {
children = <Element>[];
}
CanvasElement _canvas;
var _fragmentationData;
double _pageHeight;
CanvasElement? _canvas;
dynamic _fragmentationData;
int? _pageHeight;
final _classIdToColor = {};
final _colorToClassId = {};
final _classIdToName = {};
@ -79,8 +79,8 @@ class HeapMapElement extends CustomElement implements Renderable {
// TODO(koda): Improve interface for huge heaps.
static const _MAX_CANVAS_HEIGHT = 6000;
String _status;
S.ServiceMap _fragmentation;
String _status = 'Loading';
S.ServiceMap? _fragmentation;
void render() {
if (_canvas == null) {
@ -91,7 +91,7 @@ class HeapMapElement extends CustomElement implements Renderable {
}
// Set hover text to describe the object under the cursor.
_canvas.title = _status;
_canvas!.title = _status;
children = <Element>[
navBar(<Element>[
@ -121,7 +121,7 @@ class HeapMapElement extends CustomElement implements Renderable {
],
new DivElement()
..classes = ['flex-row']
..children = <Element>[_canvas]
..children = <Element>[_canvas!]
];
}
@ -150,9 +150,9 @@ class HeapMapElement extends CustomElement implements Renderable {
print('Ignoring non-class in class list');
continue;
}
var classId = int.parse(member.id.split('/').last);
var classId = int.parse(member.id!.split('/').last);
var color = _classIdToRGBA(classId);
_addClass(classId, member.name, color);
_addClass(classId, member.name!, color);
}
_addClass(freeClassId, 'Free', _freeColor);
_addClass(0, '', _pageSeparationColor);
@ -169,15 +169,15 @@ class HeapMapElement extends CustomElement implements Renderable {
return _classIdToName[_colorToClassId[_packColor(color)]];
}
ObjectInfo _objectAt(Point<num> point) {
ObjectInfo? _objectAt(Point<num> point) {
if (_fragmentation == null || _canvas == null) {
return null;
}
var pagePixels = _pageHeight * _fragmentationData.width;
var pagePixels = _pageHeight! * _fragmentationData.width;
var index = new PixelReference(_fragmentationData, point).index;
var pageIndex = index ~/ pagePixels;
num pageOffset = index % pagePixels;
var pages = _fragmentation['pages'];
var pages = _fragmentation!['pages'];
if (pageIndex < 0 || pageIndex >= pages.length) {
return null;
}
@ -196,8 +196,8 @@ class HeapMapElement extends CustomElement implements Renderable {
}
return new ObjectInfo(
int.parse(page['objectStart']) +
pageOffset * _fragmentation['unitSizeBytes'],
size * _fragmentation['unitSizeBytes']);
pageOffset * _fragmentation!['unitSizeBytes'],
size * _fragmentation!['unitSizeBytes']);
}
void _handleMouseMove(MouseEvent event) {
@ -218,28 +218,28 @@ class HeapMapElement extends CustomElement implements Renderable {
return;
}
_updateClassList(
_fragmentation['classList'], _fragmentation['freeClassId']);
var pages = _fragmentation['pages'];
var width = max(_canvas.parent.client.width, 1);
_fragmentation!['classList'], _fragmentation!['freeClassId']);
var pages = _fragmentation!['pages'];
var width = max(_canvas!.parent!.client.width, 1) as int;
_pageHeight = _PAGE_SEPARATION_HEIGHT +
_fragmentation['pageSizeBytes'] ~/
_fragmentation['unitSizeBytes'] ~/
(_fragmentation!['pageSizeBytes'] as int) ~/
(_fragmentation!['unitSizeBytes'] as int) ~/
width;
var height = min(_pageHeight * pages.length, _MAX_CANVAS_HEIGHT);
_fragmentationData = _canvas.context2D.createImageData(width, height);
_canvas.width = _fragmentationData.width;
_canvas.height = _fragmentationData.height;
var height = min(_pageHeight! * pages.length, _MAX_CANVAS_HEIGHT) as int;
_fragmentationData = _canvas!.context2D.createImageData(width, height);
_canvas!.width = _fragmentationData.width;
_canvas!.height = _fragmentationData.height;
_renderPages(0);
}
// Renders and draws asynchronously, one page at a time to avoid
// blocking the UI.
void _renderPages(int startPage) {
var pages = _fragmentation['pages'];
var pages = _fragmentation!['pages'];
_status = 'Loaded $startPage of ${pages.length} pages';
_r.dirty();
var startY = (startPage * _pageHeight).round();
var endY = startY + _pageHeight.round();
var startY = (startPage * _pageHeight!).round();
var endY = startY + _pageHeight!.round();
if (startPage >= pages.length || endY > _fragmentationData.height) {
return;
}
@ -258,7 +258,7 @@ class HeapMapElement extends CustomElement implements Renderable {
pixel.color = _pageSeparationColor;
pixel = pixel.next();
}
_canvas.context2D.putImageData(
_canvas!.context2D.putImageData(
_fragmentationData, 0, 0, 0, startY, _fragmentationData.width, endY);
// Continue with the next page, asynchronously.
new Future(() {
@ -266,14 +266,14 @@ class HeapMapElement extends CustomElement implements Renderable {
});
}
Future _refresh({String gc}) {
Future _refresh({String? gc}) {
final isolate = _isolate as S.Isolate;
var params = {};
if (gc != null) {
params['gc'] = gc;
}
return isolate.invokeRpc('_getHeapMap', params).then((serviceObject) {
S.ServiceMap response = serviceObject;
S.ServiceMap response = serviceObject as S.ServiceMap;
assert(response['type'] == 'HeapMap');
_fragmentation = response;
_updateFragmentationData();

View file

@ -168,9 +168,9 @@ class MergedDominatorDiffTreeMap extends DiffTreeMap<MergedDominatorDiff> {
String getType(MergedDominatorDiff node) => node.name;
String getName(MergedDominatorDiff node) => "instances of ${node.name}";
MergedDominatorDiff getParent(MergedDominatorDiff node) => node.parent;
MergedDominatorDiff? getParent(MergedDominatorDiff node) => node.parent;
Iterable<MergedDominatorDiff> getChildren(MergedDominatorDiff node) =>
node.children;
node.children!;
void onSelect(MergedDominatorDiff node) {
element.mergedDiffSelection = node;
element._r.dirty();
@ -198,7 +198,7 @@ class ClassesShallowTreeMap extends NormalTreeMap<SnapshotClass> {
? "${snapshot.classes.length} classes"
: "${node.instanceCount} instances of ${node.name}";
SnapshotClass getParent(SnapshotClass node) => null;
SnapshotClass? getParent(SnapshotClass node) => null;
Iterable<SnapshotClass> getChildren(SnapshotClass node) =>
node == null ? snapshot.classes : <SnapshotClass>[];
void onSelect(SnapshotClass node) {}
@ -255,7 +255,7 @@ class ClassesShallowDiffTreeMap extends DiffTreeMap<SnapshotClassDiff> {
node == null ? "Classes" : node.name;
String getName(SnapshotClassDiff node) =>
node == null ? "${classes.length} classes" : "instances of ${node.name}";
SnapshotClassDiff getParent(SnapshotClassDiff node) => null;
SnapshotClassDiff? getParent(SnapshotClassDiff node) => null;
Iterable<SnapshotClassDiff> getChildren(SnapshotClassDiff node) =>
node == null ? classes : <SnapshotClassDiff>[];
void onSelect(SnapshotClassDiff node) {}
@ -280,7 +280,7 @@ class ClassesOwnershipTreeMap extends NormalTreeMap<SnapshotClass> {
String getName(SnapshotClass node) => node == null
? "${snapshot.classes.length} Classes"
: "${node.instanceCount} instances of ${node.name}";
SnapshotClass getParent(SnapshotClass node) => null;
SnapshotClass? getParent(SnapshotClass node) => null;
Iterable<SnapshotClass> getChildren(SnapshotClass node) =>
node == null ? snapshot.classes : <SnapshotClass>[];
void onSelect(SnapshotClass node) {}
@ -337,7 +337,7 @@ class ClassesOwnershipDiffTreeMap extends DiffTreeMap<SnapshotClassDiff> {
node == null ? "Classes" : node.name;
String getName(SnapshotClassDiff node) =>
node == null ? "${classes.length} classes" : "instances of ${node.name}";
SnapshotClassDiff getParent(SnapshotClassDiff node) => null;
SnapshotClassDiff? getParent(SnapshotClassDiff node) => null;
Iterable<SnapshotClassDiff> getChildren(SnapshotClassDiff node) =>
node == null ? classes : <SnapshotClassDiff>[];
void onSelect(SnapshotClassDiff node) {}
@ -350,16 +350,16 @@ class ClassesOwnershipDiffTreeMap extends DiffTreeMap<SnapshotClassDiff> {
}
class SnapshotClassDiff {
SnapshotClass _a;
SnapshotClass _b;
SnapshotClass? _a;
SnapshotClass? _b;
int get shallowSizeA => _a == null ? 0 : _a.shallowSize;
int get ownedSizeA => _a == null ? 0 : _a.ownedSize;
int get instanceCountA => _a == null ? 0 : _a.instanceCount;
int get shallowSizeA => _a == null ? 0 : _a!.shallowSize;
int get ownedSizeA => _a == null ? 0 : _a!.ownedSize;
int get instanceCountA => _a == null ? 0 : _a!.instanceCount;
int get shallowSizeB => _b == null ? 0 : _b.shallowSize;
int get ownedSizeB => _b == null ? 0 : _b.ownedSize;
int get instanceCountB => _b == null ? 0 : _b.instanceCount;
int get shallowSizeB => _b == null ? 0 : _b!.shallowSize;
int get ownedSizeB => _b == null ? 0 : _b!.ownedSize;
int get instanceCountB => _b == null ? 0 : _b!.instanceCount;
int get shallowSizeDiff => shallowSizeB - shallowSizeA;
int get ownedSizeDiff => ownedSizeB - ownedSizeA;
@ -377,12 +377,12 @@ class SnapshotClassDiff {
shallowSizeB > shallowSizeA ? shallowSizeA : shallowSizeB;
int get ownedSizeCommon => ownedSizeB > ownedSizeA ? ownedSizeA : ownedSizeB;
String get name => _a == null ? _b.name : _a.name;
String get name => _a == null ? _b!.name : _a!.name;
List<SnapshotObject> get objectsA =>
_a == null ? <SnapshotObject>[] : _a.instances.toList();
_a == null ? const <SnapshotObject>[] : _a!.instances.toList();
List<SnapshotObject> get objectsB =>
_b == null ? <SnapshotObject>[] : _b.instances.toList();
_b == null ? const <SnapshotObject>[] : _b!.instances.toList();
static List<SnapshotClassDiff> from(
SnapshotGraph graphA, SnapshotGraph graphB) {
@ -414,32 +414,32 @@ class SnapshotClassDiff {
}
class MergedDominatorDiff {
SnapshotMergedDominator _a;
SnapshotMergedDominator _b;
MergedDominatorDiff parent;
List<MergedDominatorDiff> children;
SnapshotMergedDominator? _a;
SnapshotMergedDominator? _b;
MergedDominatorDiff? parent;
List<MergedDominatorDiff>? children;
int retainedGain = -1;
int retainedLoss = -1;
int retainedCommon = -1;
int get shallowSizeA => _a == null ? 0 : _a.shallowSize;
int get retainedSizeA => _a == null ? 0 : _a.retainedSize;
int get instanceCountA => _a == null ? 0 : _a.instanceCount;
int get shallowSizeA => _a == null ? 0 : _a!.shallowSize;
int get retainedSizeA => _a == null ? 0 : _a!.retainedSize;
int get instanceCountA => _a == null ? 0 : _a!.instanceCount;
int get shallowSizeB => _b == null ? 0 : _b.shallowSize;
int get retainedSizeB => _b == null ? 0 : _b.retainedSize;
int get instanceCountB => _b == null ? 0 : _b.instanceCount;
int get shallowSizeB => _b == null ? 0 : _b!.shallowSize;
int get retainedSizeB => _b == null ? 0 : _b!.retainedSize;
int get instanceCountB => _b == null ? 0 : _b!.instanceCount;
int get shallowSizeDiff => shallowSizeB - shallowSizeA;
int get retainedSizeDiff => retainedSizeB - retainedSizeA;
int get instanceCountDiff => instanceCountB - instanceCountA;
String get name => _a == null ? _b.klass.name : _a.klass.name;
String get name => _a == null ? _b!.klass.name : _a!.klass.name;
List<SnapshotObject> get objectsA =>
_a == null ? <SnapshotObject>[] : _a.objects.toList();
_a == null ? const <SnapshotObject>[] : _a!.objects.toList();
List<SnapshotObject> get objectsB =>
_b == null ? <SnapshotObject>[] : _b.objects.toList();
_b == null ? const <SnapshotObject>[] : _b!.objects.toList();
static MergedDominatorDiff from(
SnapshotMergedDominator a, SnapshotMergedDominator b) {
@ -472,11 +472,11 @@ class MergedDominatorDiff {
// Matching children by MergedObjectVertex.klass.qualifiedName.
final childrenB = <String, SnapshotMergedDominator>{};
if (_b != null)
for (var childB in _b.children) {
for (var childB in _b!.children) {
childrenB[childB.klass.qualifiedName] = childB;
}
if (_a != null)
for (var childA in _a.children) {
for (var childA in _a!.children) {
var childDiff = new MergedDominatorDiff();
childDiff.parent = this;
childDiff._a = childA;
@ -486,18 +486,18 @@ class MergedDominatorDiff {
childrenB.remove(qualifiedName);
childDiff._b = childB;
}
children.add(childDiff);
children!.add(childDiff);
worklist.add(childDiff);
}
for (var childB in childrenB.values) {
var childDiff = new MergedDominatorDiff();
childDiff.parent = this;
childDiff._b = childB;
children.add(childDiff);
children!.add(childDiff);
worklist.add(childDiff);
}
if (children.length == 0) {
if (children!.length == 0) {
// Compress.
children = const <MergedDominatorDiff>[];
}
@ -507,7 +507,7 @@ class MergedDominatorDiff {
int g = 0;
int l = 0;
int c = 0;
for (var child in children) {
for (var child in children!) {
g += child.retainedGain;
l += child.retainedLoss;
c += child.retainedCommon;
@ -528,30 +528,30 @@ class MergedDominatorDiff {
}
class HeapSnapshotElement extends CustomElement implements Renderable {
RenderingScheduler<HeapSnapshotElement> _r;
late RenderingScheduler<HeapSnapshotElement> _r;
Stream<RenderedEvent<HeapSnapshotElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.HeapSnapshotRepository _snapshots;
M.ObjectRepository _objects;
SnapshotReader _reader;
String _status;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.HeapSnapshotRepository _snapshots;
late M.ObjectRepository _objects;
SnapshotReader? _reader;
String? _status;
List<SnapshotGraph> _loadedSnapshots = <SnapshotGraph>[];
SnapshotGraph _snapshotA;
SnapshotGraph _snapshotB;
SnapshotGraph? _snapshotA;
SnapshotGraph? _snapshotB;
HeapSnapshotTreeMode _mode = HeapSnapshotTreeMode.mergedDominatorTreeMap;
M.IsolateRef get isolate => _isolate;
M.NotificationRepository get notifications => _notifications;
M.HeapSnapshotRepository get profiles => _snapshots;
M.VMRef get vm => _vm;
List<SnapshotObject> selection;
SnapshotMergedDominator mergedSelection;
MergedDominatorDiff mergedDiffSelection;
List<SnapshotObject>? selection;
SnapshotMergedDominator? mergedSelection;
MergedDominatorDiff? mergedDiffSelection;
factory HeapSnapshotElement(
M.VM vm,
@ -560,7 +560,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
M.NotificationRepository notifications,
M.HeapSnapshotRepository snapshots,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -625,7 +625,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
if (_reader != null) {
// Loading
content.addAll(_createStatusMessage('Loading snapshot...',
description: _status, progress: 1));
description: _status!, progress: 1));
} else if (_snapshotA != null) {
// Loaded
content.addAll(_createReport());
@ -639,7 +639,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
}
_save() {
var blob = new Blob(_snapshotA.chunks, 'application/octet-stream');
var blob = new Blob(_snapshotA!.chunks, 'application/octet-stream');
var blobUrl = Url.createObjectUrl(blob);
var link = new AnchorElement();
link.href = blobUrl;
@ -653,13 +653,13 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
input.type = 'file';
input.multiple = false;
input.onChange.listen((event) {
var file = input.files[0];
var file = input.files![0];
var reader = new FileReader();
reader.onLoad.listen((event) async {
var encoded = <Uint8List>[reader.result];
var encoded = <Uint8List>[reader.result as Uint8List];
var snapshotReader = new SnapshotReader();
_snapshotLoading(snapshotReader);
snapshotReader.add(reader.result);
snapshotReader.add(reader.result as Uint8List);
snapshotReader.close();
});
reader.readAsArrayBuffer(file);
@ -713,7 +713,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
];
}
VirtualTreeElement _tree;
VirtualTreeElement? _tree;
void _createTreeMap<T>(List<HtmlElement> report, TreeMap<T> treemap, T root) {
final content = new DivElement();
@ -786,13 +786,13 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
switch (_mode) {
case HeapSnapshotTreeMode.dominatorTree:
if (selection == null) {
selection = List.from(_snapshotA.extendedRoot.objects);
selection = List.from(_snapshotA!.extendedRoot.objects);
}
_tree = new VirtualTreeElement(
_createDominator, _updateDominator, _getChildrenDominator,
items: selection, queue: _r.queue);
if (selection.length == 1) {
_tree.expand(selection.first);
items: selection!, queue: _r.queue);
if (selection!.length == 1) {
_tree!.expand(selection!.first);
}
final text = 'In a heap dominator tree, an object X is a parent of '
'object Y if every path from the root to Y goes through '
@ -804,49 +804,49 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.dominatorTreeMap:
if (selection == null) {
selection = List.from(_snapshotA.extendedRoot.objects);
selection = List.from(_snapshotA!.extendedRoot.objects);
}
_createTreeMap(report, new DominatorTreeMap(this), selection.first);
_createTreeMap(report, new DominatorTreeMap(this), selection!.first);
break;
case HeapSnapshotTreeMode.mergedDominatorTree:
_tree = new VirtualTreeElement(_createMergedDominator,
_updateMergedDominator, _getChildrenMergedDominator,
items: _getChildrenMergedDominator(_snapshotA.extendedMergedRoot),
items: _getChildrenMergedDominator(_snapshotA!.extendedMergedRoot),
queue: _r.queue);
_tree.expand(_snapshotA.extendedMergedRoot);
_tree!.expand(_snapshotA!.extendedMergedRoot);
final text = 'A heap dominator tree, where siblings with the same class'
' have been merged into a single node.';
report.addAll([
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.mergedDominatorTreeDiff:
var root = MergedDominatorDiff.from(
_snapshotA.mergedRoot, _snapshotB.mergedRoot);
_snapshotA!.mergedRoot, _snapshotB!.mergedRoot);
_tree = new VirtualTreeElement(_createMergedDominatorDiff,
_updateMergedDominatorDiff, _getChildrenMergedDominatorDiff,
items: _getChildrenMergedDominatorDiff(root), queue: _r.queue);
_tree.expand(root);
_tree!.expand(root);
final text = 'A heap dominator tree, where siblings with the same class'
' have been merged into a single node.';
report.addAll([
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.mergedDominatorTreeMap:
if (mergedSelection == null) {
mergedSelection = _snapshotA.extendedMergedRoot;
mergedSelection = _snapshotA!.extendedMergedRoot;
}
_createTreeMap(
report, new MergedDominatorTreeMap(this), mergedSelection);
@ -854,18 +854,19 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
case HeapSnapshotTreeMode.mergedDominatorTreeMapDiff:
if (mergedDiffSelection == null) {
mergedDiffSelection = MergedDominatorDiff.from(
_snapshotA.mergedRoot, _snapshotB.mergedRoot);
_snapshotA!.mergedRoot, _snapshotB!.mergedRoot);
}
_createTreeMap(
report, new MergedDominatorDiffTreeMap(this), mergedDiffSelection);
break;
case HeapSnapshotTreeMode.ownershipTable:
final items = _snapshotA.classes.where((c) => c.ownedSize > 0).toList();
final items =
_snapshotA!.classes.where((c) => c.ownedSize > 0).toList();
items.sort((a, b) => b.ownedSize - a.ownedSize);
_tree = new VirtualTreeElement(
_createOwnership, _updateOwnership, _getChildrenOwnership,
items: items, queue: _r.queue);
_tree.expand(_snapshotA.root);
_tree!.expand(_snapshotA!.root);
final text = 'An object X is said to "own" object Y if X is the only '
'object that references Y, or X owns the only object that '
'references Y. In particular, objects "own" the space of any '
@ -874,18 +875,18 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.ownershipTableDiff:
final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
items.sort((a, b) => b.ownedSizeB - a.ownedSizeB);
items.sort((a, b) => b.ownedSizeA - a.ownedSizeA);
items.sort((a, b) => b.ownedSizeDiff - a.ownedSizeDiff);
_tree = new VirtualTreeElement(_createOwnershipDiff,
_updateOwnershipDiff, _getChildrenOwnershipDiff,
items: items, queue: _r.queue);
_tree.expand(_snapshotA.root);
_tree!.expand(_snapshotA!.root);
final text = 'An object X is said to "own" object Y if X is the only '
'object that references Y, or X owns the only object that '
'references Y. In particular, objects "own" the space of any '
@ -894,79 +895,79 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.ownershipTreeMap:
_createTreeMap(
report, new ClassesOwnershipTreeMap(this, _snapshotA), null);
report, new ClassesOwnershipTreeMap(this, _snapshotA!), null);
break;
case HeapSnapshotTreeMode.ownershipTreeMapDiff:
final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
_createTreeMap(
report, new ClassesOwnershipDiffTreeMap(this, items), null);
break;
case HeapSnapshotTreeMode.successors:
if (selection == null) {
selection = List.from(_snapshotA.root.objects);
selection = List.from(_snapshotA!.root.objects);
}
_tree = new VirtualTreeElement(
_createSuccessor, _updateSuccessor, _getChildrenSuccessor,
items: selection, queue: _r.queue);
if (selection.length == 1) {
_tree.expand(selection.first);
items: selection!, queue: _r.queue);
if (selection!.length == 1) {
_tree!.expand(selection!.first);
}
final text = '';
report.addAll([
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.predecessors:
if (selection == null) {
selection = List.from(_snapshotA.root.objects);
selection = List.from(_snapshotA!.root.objects);
}
_tree = new VirtualTreeElement(
_createPredecessor, _updatePredecessor, _getChildrenPredecessor,
items: selection, queue: _r.queue);
if (selection.length == 1) {
_tree.expand(selection.first);
items: selection!, queue: _r.queue);
if (selection!.length == 1) {
_tree!.expand(selection!.first);
}
final text = '';
report.addAll([
new DivElement()
..classes = ['content-centered-big', 'explanation']
..text = text,
_tree.element
_tree!.element
]);
break;
case HeapSnapshotTreeMode.classesTable:
final items = _snapshotA.classes.toList();
final items = _snapshotA!.classes.toList();
items.sort((a, b) => b.shallowSize - a.shallowSize);
_tree = new VirtualTreeElement(
_createClass, _updateClass, _getChildrenClass,
items: items, queue: _r.queue);
report.add(_tree.element);
report.add(_tree!.element);
break;
case HeapSnapshotTreeMode.classesTableDiff:
final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
items.sort((a, b) => b.shallowSizeB - a.shallowSizeB);
items.sort((a, b) => b.shallowSizeA - a.shallowSizeA);
items.sort((a, b) => b.shallowSizeDiff - a.shallowSizeDiff);
_tree = new VirtualTreeElement(
_createClassDiff, _updateClassDiff, _getChildrenClassDiff,
items: items, queue: _r.queue);
report.add(_tree.element);
report.add(_tree!.element);
break;
case HeapSnapshotTreeMode.classesTreeMap:
_createTreeMap(
report, new ClassesShallowTreeMap(this, _snapshotA), null);
report, new ClassesShallowTreeMap(this, _snapshotA!), null);
break;
case HeapSnapshotTreeMode.classesTreeMapDiff:
final items = SnapshotClassDiff.from(_snapshotA, _snapshotB);
final items = SnapshotClassDiff.from(_snapshotA!, _snapshotB!);
_createTreeMap(
report, new ClassesShallowDiffTreeMap(this, items), null);
break;
@ -1215,7 +1216,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
static Iterable _getChildrenMergedDominatorDiff(nodeDynamic) {
MergedDominatorDiff node = nodeDynamic;
final list = node.children
final list = node.children!
.where((child) =>
child.retainedSizeA >= kMinRetainedSize ||
child.retainedSizeB >= kMinRetainedSize)
@ -1243,11 +1244,11 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
void _updateDominator(HtmlElement element, nodeDynamic, int depth) {
SnapshotObject node = nodeDynamic;
element.children[0].text = Utils.formatPercentNormalized(
node.retainedSize * 1.0 / _snapshotA.size);
node.retainedSize * 1.0 / _snapshotA!.size);
element.children[1].text = Utils.formatSize(node.retainedSize);
_updateLines(element.children[2].children, depth);
if (_getChildrenDominator(node).isNotEmpty) {
element.children[3].text = _tree.isExpanded(node) ? '' : '';
element.children[3].text = _tree!.isExpanded(node) ? '' : '';
} else {
element.children[3].text = '';
}
@ -1273,7 +1274,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
SnapshotObject node = nodeDynamic;
_updateLines(element.children[0].children, depth);
if (_getChildrenSuccessor(node).isNotEmpty) {
element.children[1].text = _tree.isExpanded(node) ? '' : '';
element.children[1].text = _tree!.isExpanded(node) ? '' : '';
} else {
element.children[1].text = '';
}
@ -1301,7 +1302,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
SnapshotObject node = nodeDynamic;
_updateLines(element.children[0].children, depth);
if (_getChildrenSuccessor(node).isNotEmpty) {
element.children[1].text = _tree.isExpanded(node) ? '' : '';
element.children[1].text = _tree!.isExpanded(node) ? '' : '';
} else {
element.children[1].text = '';
}
@ -1328,11 +1329,11 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
void _updateMergedDominator(HtmlElement element, nodeDynamic, int depth) {
SnapshotMergedDominator node = nodeDynamic;
element.children[0].text = Utils.formatPercentNormalized(
node.retainedSize * 1.0 / _snapshotA.size);
node.retainedSize * 1.0 / _snapshotA!.size);
element.children[1].text = Utils.formatSize(node.retainedSize);
_updateLines(element.children[2].children, depth);
if (_getChildrenMergedDominator(node).isNotEmpty) {
element.children[3].text = _tree.isExpanded(node) ? '' : '';
element.children[3].text = _tree!.isExpanded(node) ? '' : '';
} else {
element.children[3].text = '';
}
@ -1343,10 +1344,10 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
void _updateMergedDominatorDiff(HtmlElement element, nodeDynamic, int depth) {
MergedDominatorDiff node = nodeDynamic;
element.children[0].text = Utils.formatPercentNormalized(
node.retainedSizeA * 1.0 / _snapshotA.size);
node.retainedSizeA * 1.0 / _snapshotA!.size);
element.children[1].text = Utils.formatSize(node.retainedSizeA);
element.children[2].text = Utils.formatPercentNormalized(
node.retainedSizeB * 1.0 / _snapshotB.size);
node.retainedSizeB * 1.0 / _snapshotB!.size);
element.children[3].text = Utils.formatSize(node.retainedSizeB);
element.children[4].text = (node.retainedSizeDiff > 0 ? '+' : '') +
Utils.formatSize(node.retainedSizeDiff);
@ -1354,7 +1355,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
node.retainedSizeDiff > 0 ? "red" : "green";
_updateLines(element.children[5].children, depth);
if (_getChildrenMergedDominatorDiff(node).isNotEmpty) {
element.children[6].text = _tree.isExpanded(node) ? '' : '';
element.children[6].text = _tree!.isExpanded(node) ? '' : '';
} else {
element.children[6].text = '';
}
@ -1366,7 +1367,7 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
void _updateOwnership(HtmlElement element, nodeDynamic, int depth) {
SnapshotClass node = nodeDynamic;
element.children[0].text =
Utils.formatPercentNormalized(node.ownedSize * 1.0 / _snapshotA.size);
Utils.formatPercentNormalized(node.ownedSize * 1.0 / _snapshotA!.size);
element.children[1].text = Utils.formatSize(node.ownedSize);
element.children[2].text = node.name;
}
@ -1374,10 +1375,10 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
void _updateOwnershipDiff(HtmlElement element, nodeDynamic, int depth) {
SnapshotClassDiff node = nodeDynamic;
element.children[0].text =
Utils.formatPercentNormalized(node.ownedSizeA * 1.0 / _snapshotA.size);
Utils.formatPercentNormalized(node.ownedSizeA * 1.0 / _snapshotA!.size);
element.children[1].text = Utils.formatSize(node.ownedSizeA);
element.children[2].text =
Utils.formatPercentNormalized(node.ownedSizeB * 1.0 / _snapshotB.size);
Utils.formatPercentNormalized(node.ownedSizeB * 1.0 / _snapshotB!.size);
element.children[3].text = Utils.formatSize(node.ownedSizeB);
element.children[4].text = (node.ownedSizeDiff > 0 ? "+" : "") +
Utils.formatSize(node.ownedSizeDiff);
@ -1387,8 +1388,8 @@ class HeapSnapshotElement extends CustomElement implements Renderable {
void _updateClass(HtmlElement element, nodeDynamic, int depth) {
SnapshotClass node = nodeDynamic;
element.children[0].text =
Utils.formatPercentNormalized(node.shallowSize * 1.0 / _snapshotA.size);
element.children[0].text = Utils.formatPercentNormalized(
node.shallowSize * 1.0 / _snapshotA!.size);
element.children[1].text = Utils.formatSize(node.shallowSize);
element.children[2].text = node.instanceCount.toString();
element.children[3].text = node.name;

View file

@ -28,7 +28,7 @@ import 'package:observatory/src/elements/unknown_ref.dart';
import 'package:observatory/src/elements/unlinkedcall_ref.dart';
Element anyRef(M.IsolateRef isolate, ref, M.ObjectRepository objects,
{RenderingQueue queue, bool expandable: true}) {
{RenderingQueue? queue, bool expandable: true}) {
if (ref == null) {
return new SpanElement()..text = "???";
}

View file

@ -9,14 +9,15 @@ HtmlElement element(CustomElement e) => e.element;
class CustomElement {
static Expando reverseElements = new Expando();
static CustomElement reverse(HtmlElement element) => reverseElements[element];
static CustomElement reverse(HtmlElement element) =>
reverseElements[element] as CustomElement;
static List<CustomElement> toBeAttached = <CustomElement>[];
static void drainAttached() {
// Send 'attached' to elements that have been attached to the document.
bool fired = false;
var connectedElements = toBeAttached
.where((CustomElement element) => element.element.isConnected)
.where((CustomElement element) => element.element.isConnected!)
.toList();
for (CustomElement element in connectedElements) {
toBeAttached.remove(element);
@ -47,7 +48,7 @@ class CustomElement {
final HtmlElement element;
CustomElement.created(String elementClass)
: element = document.createElement("shadow") {
: element = document.createElement("shadow") as HtmlElement {
reverseElements[element] = this;
element.classes = [elementClass];
@ -60,7 +61,7 @@ class CustomElement {
void attached() {}
void detached() {}
Element get parent => element.parent;
Element? get parent => element.parent;
List<Element> get children => element.children;
set children(List<Element> c) => element.children = c;
@ -68,11 +69,11 @@ class CustomElement {
CssClassSet get classes => element.classes;
set classes(dynamic c) => element.classes = c;
String get title => element.title;
set title(String t) => element.title = t;
String? get title => element.title;
set title(String? t) => element.title = t;
String get text => element.text;
set text(String t) => element.text = t;
String? get text => element.text;
set text(String? t) => element.text = t;
CssStyleDeclaration get style => element.style;

View file

@ -4,7 +4,7 @@
import 'dart:html';
Element navBar(Iterable<Element> content) {
Element navBar(List<Element> content) {
assert(content != null);
return document.createElement('nav')
..classes = ['nav-bar']

View file

@ -4,7 +4,7 @@
import 'dart:html';
navMenu(String label, {String link, Iterable<Element> content: const []}) {
navMenu(String label, {String? link, List<Element> content: const []}) {
assert(label != null);
assert(content != null);
return new LIElement()

View file

@ -54,7 +54,7 @@ class RenderingScheduler<T extends Renderable> implements RenderingTask {
/// Creates a new scheduler for an element.
/// If no queue is provided it will create a new default configured queue.
factory RenderingScheduler(T element, {RenderingQueue queue}) {
factory RenderingScheduler(T element, {RenderingQueue? queue}) {
assert(element != null);
if (queue == null) {
queue = new RenderingQueue();

View file

@ -7,7 +7,7 @@ import 'package:observatory/models.dart' as M;
/// Utility class for URIs generation.
abstract class Uris {
static String _isolatePage(String path, M.IsolateRef isolate,
{M.ObjectRef object}) {
{M.ObjectRef? object}) {
final parameters = {'isolateId': isolate.id};
if (object != null) parameters['objectId'] = object.id;
return '#' + new Uri(path: path, queryParameters: parameters).toString();
@ -28,7 +28,7 @@ abstract class Uris {
_isolatePage('/heap-map', isolate);
static String heapSnapshot(M.IsolateRef isolate) =>
_isolatePage('/heap-snapshot', isolate);
static String inspect(M.IsolateRef isolate, {M.ObjectRef object, int pos}) {
static String inspect(M.IsolateRef isolate, {M.ObjectRef? object, int? pos}) {
if (pos == null) {
return _isolatePage('/inspect', isolate, object: object);
}

View file

@ -10,18 +10,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class ICDataRefElement extends CustomElement implements Renderable {
RenderingScheduler<ICDataRefElement> _r;
late RenderingScheduler<ICDataRefElement> _r;
Stream<RenderedEvent<ICDataRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.ICDataRef _icdata;
late M.IsolateRef _isolate;
late M.ICDataRef _icdata;
M.IsolateRef get isolate => _isolate;
M.ICDataRef get icdata => _icdata;
factory ICDataRefElement(M.IsolateRef isolate, M.ICDataRef icdata,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(icdata != null);
ICDataRefElement e = new ICDataRefElement.created();

View file

@ -20,21 +20,21 @@ import 'package:observatory/src/elements/object_common.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ICDataViewElement extends CustomElement implements Renderable {
RenderingScheduler<ICDataViewElement> _r;
late RenderingScheduler<ICDataViewElement> _r;
Stream<RenderedEvent<ICDataViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.ICData _icdata;
M.ICDataRepository _icdatas;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.ICData _icdata;
late M.ICDataRepository _icdatas;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -53,7 +53,7 @@ class ICDataViewElement extends CustomElement implements Renderable {
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -106,7 +106,7 @@ class ICDataViewElement extends CustomElement implements Renderable {
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
e.element.disabled = true;
_icdata = await _icdatas.get(_isolate, _icdata.id);
_icdata = await _icdatas.get(_isolate, _icdata.id!);
_r.dirty();
}))
.element,

View file

@ -12,16 +12,16 @@ import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/custom_element.dart';
class InboundReferencesElement extends CustomElement implements Renderable {
RenderingScheduler<InboundReferencesElement> _r;
late RenderingScheduler<InboundReferencesElement> _r;
Stream<RenderedEvent<InboundReferencesElement>> get onRendered =>
_r.onRendered;
M.IsolateRef _isolate;
M.ObjectRef _object;
M.InboundReferencesRepository _references;
M.ObjectRepository _objects;
M.InboundReferences _inbounds;
late M.IsolateRef _isolate;
late M.ObjectRef _object;
late M.InboundReferencesRepository _references;
late M.ObjectRepository _objects;
M.InboundReferences? _inbounds;
bool _expanded = false;
M.IsolateRef get isolate => _isolate;
@ -29,7 +29,7 @@ class InboundReferencesElement extends CustomElement implements Renderable {
factory InboundReferencesElement(M.IsolateRef isolate, M.ObjectRef object,
M.InboundReferencesRepository references, M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(object != null);
assert(references != null);
@ -75,7 +75,7 @@ class InboundReferencesElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_inbounds = await _references.get(_isolate, _object.id);
_inbounds = await _references.get(_isolate, _object.id!);
_r.dirty();
}
@ -83,7 +83,7 @@ class InboundReferencesElement extends CustomElement implements Renderable {
if (_inbounds == null) {
return const [];
}
return _inbounds.elements.map<Element>(_createItem).toList();
return _inbounds!.elements.map<Element>(_createItem).toList();
}
Element _createItem(M.InboundReference reference) {

View file

@ -14,23 +14,23 @@ import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/utils.dart';
class InstanceRefElement extends CustomElement implements Renderable {
RenderingScheduler<InstanceRefElement> _r;
late RenderingScheduler<InstanceRefElement> _r;
Stream<RenderedEvent<InstanceRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.InstanceRef _instance;
M.ObjectRepository _objects;
M.Instance _loadedInstance;
bool _expandable;
bool _expanded = false;
late M.IsolateRef _isolate;
late M.InstanceRef _instance;
late M.ObjectRepository _objects;
M.Instance? _loadedInstance;
late bool _expandable;
late bool _expanded = false;
M.IsolateRef get isolate => _isolate;
M.InstanceRef get instance => _instance;
factory InstanceRefElement(
M.IsolateRef isolate, M.InstanceRef instance, M.ObjectRepository objects,
{RenderingQueue queue, bool expandable: true}) {
{RenderingQueue? queue, bool expandable: true}) {
assert(isolate != null);
assert(instance != null);
assert(objects != null);
@ -86,19 +86,20 @@ class InstanceRefElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_loadedInstance = await _objects.get(_isolate, _instance.id);
_loadedInstance = await _objects.get(_isolate, _instance.id!) as M.Instance;
_r.dirty();
}
List<Element> _createShowMoreButton() {
if (_loadedInstance.count == null) {
if (_loadedInstance!.count == null) {
return [];
}
final count = _loadedInstance.count;
final count = _loadedInstance!.count;
final button = new ButtonElement()..text = 'show next ${count}';
button.onClick.listen((_) async {
button.disabled = true;
_loadedInstance = await _objects.get(_isolate, _instance.id);
_loadedInstance =
await _objects.get(_isolate, _instance.id!) as M.Instance;
_r.dirty();
});
return [button];
@ -121,7 +122,7 @@ class InstanceRefElement extends CustomElement implements Renderable {
return [
new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
..text = Utils.formatStringAsLiteral(
_instance.valueAsString, _instance.valueAsStringIsTruncated)
_instance.valueAsString!, _instance.valueAsStringIsTruncated!)
];
case M.InstanceKind.type:
case M.InstanceKind.typeRef:
@ -137,7 +138,7 @@ class InstanceRefElement extends CustomElement implements Renderable {
new SpanElement()
..classes = ['emphasize']
..text = 'Closure',
new SpanElement()..text = ' (${_instance.closureFunction.name})'
new SpanElement()..text = ' (${_instance.closureFunction!.name})'
]
];
case M.InstanceKind.regExp:
@ -146,8 +147,8 @@ class InstanceRefElement extends CustomElement implements Renderable {
..children = <Element>[
new SpanElement()
..classes = ['emphasize']
..text = _instance.clazz.name,
new SpanElement()..text = ' (${_instance.pattern.valueAsString})'
..text = _instance.clazz!.name,
new SpanElement()..text = ' (${_instance.pattern!.valueAsString})'
]
];
case M.InstanceKind.stackTrace:
@ -156,14 +157,14 @@ class InstanceRefElement extends CustomElement implements Renderable {
..children = <Element>[
new SpanElement()
..classes = ['emphasize']
..text = _instance.clazz.name,
..text = _instance.clazz!.name,
]
];
case M.InstanceKind.plainInstance:
return [
new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
..classes = ['emphasize']
..text = _instance.clazz.name
..text = _instance.clazz!.name
];
case M.InstanceKind.list:
case M.InstanceKind.map:
@ -186,7 +187,7 @@ class InstanceRefElement extends CustomElement implements Renderable {
..children = <Element>[
new SpanElement()
..classes = ['emphasize']
..text = _instance.clazz.name,
..text = _instance.clazz!.name,
new SpanElement()..text = ' (${_instance.length})'
]
];
@ -194,13 +195,13 @@ class InstanceRefElement extends CustomElement implements Renderable {
return [
new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
..classes = ['emphasize']
..text = _instance.clazz.name
..text = _instance.clazz!.name
];
case M.InstanceKind.weakProperty:
return [
new AnchorElement(href: Uris.inspect(_isolate, object: _instance))
..classes = ['emphasize']
..text = _instance.clazz.name
..text = _instance.clazz!.name
];
}
throw new Exception('Unknown InstanceKind: ${_instance.kind}');
@ -230,7 +231,7 @@ class InstanceRefElement extends CustomElement implements Renderable {
case M.InstanceKind.int32x4List:
case M.InstanceKind.float32x4List:
case M.InstanceKind.float64x2List:
return _instance.length > 0;
return _instance.length! > 0;
default:
return false;
}
@ -244,29 +245,30 @@ class InstanceRefElement extends CustomElement implements Renderable {
case M.InstanceKind.closure:
{
var members = <Element>[];
if (_loadedInstance.closureFunction != null) {
if (_loadedInstance!.closureFunction != null) {
members.add(new DivElement()
..children = <Element>[
new SpanElement()..text = 'function = ',
anyRef(_isolate, _loadedInstance.closureFunction, _objects,
anyRef(_isolate, _loadedInstance!.closureFunction, _objects,
queue: _r.queue)
]);
}
if (_loadedInstance.closureContext != null) {
if (_loadedInstance!.closureContext != null) {
members.add(new DivElement()
..children = <Element>[
new SpanElement()..text = 'context = ',
anyRef(_isolate, _loadedInstance.closureContext, _objects,
anyRef(_isolate, _loadedInstance!.closureContext, _objects,
queue: _r.queue)
]);
}
return members;
}
case M.InstanceKind.plainInstance:
return _loadedInstance.fields
return _loadedInstance!.fields!
.map<Element>((f) => new DivElement()
..children = <Element>[
new FieldRefElement(_isolate, f.decl, _objects, queue: _r.queue)
new FieldRefElement(_isolate, f.decl!, _objects,
queue: _r.queue)
.element,
new SpanElement()..text = ' = ',
anyRef(_isolate, f.value, _objects, queue: _r.queue)
@ -274,7 +276,7 @@ class InstanceRefElement extends CustomElement implements Renderable {
.toList();
case M.InstanceKind.list:
var index = 0;
return _loadedInstance.elements
return _loadedInstance!.elements!
.map<Element>((element) => new DivElement()
..children = <Element>[
new SpanElement()..text = '[ ${index++} ] : ',
@ -283,7 +285,7 @@ class InstanceRefElement extends CustomElement implements Renderable {
.toList()
..addAll(_createShowMoreButton());
case M.InstanceKind.map:
return _loadedInstance.associations
return _loadedInstance!.associations!
.map<Element>((association) => new DivElement()
..children = <Element>[
new SpanElement()..text = '[ ',
@ -308,14 +310,14 @@ class InstanceRefElement extends CustomElement implements Renderable {
case M.InstanceKind.float32x4List:
case M.InstanceKind.float64x2List:
var index = 0;
return _loadedInstance.typedElements
return _loadedInstance!.typedElements!
.map<Element>((e) => new DivElement()..text = '[ ${index++} ] : $e')
.toList()
..addAll(_createShowMoreButton());
case M.InstanceKind.mirrorReference:
return [
new SpanElement()..text = '<referent> : ',
anyRef(_isolate, _loadedInstance.referent, _objects, queue: _r.queue)
anyRef(_isolate, _loadedInstance!.referent, _objects, queue: _r.queue)
];
case M.InstanceKind.stackTrace:
return [
@ -326,12 +328,12 @@ class InstanceRefElement extends CustomElement implements Renderable {
case M.InstanceKind.weakProperty:
return [
new SpanElement()..text = '<key> : ',
new InstanceRefElement(_isolate, _loadedInstance.key, _objects,
new InstanceRefElement(_isolate, _loadedInstance!.key!, _objects,
queue: _r.queue)
.element,
new BRElement(),
new SpanElement()..text = '<value> : ',
new InstanceRefElement(_isolate, _loadedInstance.value, _objects,
new InstanceRefElement(_isolate, _loadedInstance!.value!, _objects,
queue: _r.queue)
.element,
];

View file

@ -33,29 +33,29 @@ import 'package:observatory/src/elements/view_footer.dart';
import 'package:observatory/utils.dart';
class InstanceViewElement extends CustomElement implements Renderable {
RenderingScheduler<InstanceViewElement> _r;
late RenderingScheduler<InstanceViewElement> _r;
Stream<RenderedEvent<InstanceViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Instance _instance;
M.LibraryRef _library;
M.ObjectRepository _objects;
M.ClassRepository _classes;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ScriptRepository _scripts;
M.EvalRepository _eval;
M.TypeArguments _typeArguments;
M.TypeArgumentsRepository _arguments;
M.BreakpointRepository _breakpoints;
M.FunctionRepository _functions;
M.SourceLocation _location;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Instance _instance;
M.LibraryRef? _library;
late M.ObjectRepository _objects;
late M.ClassRepository _classes;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ScriptRepository _scripts;
late M.EvalRepository _eval;
M.TypeArguments? _typeArguments;
late M.TypeArgumentsRepository _arguments;
late M.BreakpointRepository _breakpoints;
late M.FunctionRepository _functions;
M.SourceLocation? _location;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -79,7 +79,7 @@ class InstanceViewElement extends CustomElement implements Renderable {
M.TypeArgumentsRepository arguments,
M.BreakpointRepository breakpoints,
M.FunctionRepository functions,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -138,7 +138,7 @@ class InstanceViewElement extends CustomElement implements Renderable {
new HeadingElement.h2()
..text = M.isAbstractType(_instance.kind)
? 'type ${_instance.name}'
: 'instance of ${_instance.clazz.name}',
: 'instance of ${_instance.clazz!.name}',
new HRElement(),
new ObjectCommonElement(_isolate, _instance, _retainedSizes,
_reachableSizes, _references, _retainingPaths, _objects,
@ -157,7 +157,8 @@ class InstanceViewElement extends CustomElement implements Renderable {
if (_location != null) {
content.addAll([
new HRElement(),
new SourceInsetElement(_isolate, _location, _scripts, _objects, _events,
new SourceInsetElement(
_isolate, _location!, _scripts, _objects, _events,
queue: _r.queue)
.element
]);
@ -179,11 +180,11 @@ class InstanceViewElement extends CustomElement implements Renderable {
new NavIsolateMenuElement(_isolate, _events, queue: _r.queue).element
];
if (_library != null) {
menu.add(new NavLibraryMenuElement(_isolate, _library, queue: _r.queue)
menu.add(new NavLibraryMenuElement(_isolate, _library!, queue: _r.queue)
.element);
}
menu.addAll(<Element>[
new NavClassMenuElement(_isolate, _instance.clazz, queue: _r.queue)
new NavClassMenuElement(_isolate, _instance.clazz!, queue: _r.queue)
.element,
navMenu('instance'),
(new NavRefreshElement(queue: _r.queue)
@ -224,8 +225,8 @@ class InstanceViewElement extends CustomElement implements Renderable {
if (_instance.kind == M.InstanceKind.string) {
members.add(member(
'value as literal',
Utils.formatStringAsLiteral(
_instance.valueAsString, _instance.valueAsStringIsTruncated)));
Utils.formatStringAsLiteral(_instance.valueAsString!,
_instance.valueAsStringIsTruncated!)));
} else {
members.add(member('value', _instance.valueAsString));
}
@ -233,7 +234,7 @@ class InstanceViewElement extends CustomElement implements Renderable {
if (_instance.typeClass != null) {
members.add(member('type class', _instance.typeClass));
}
if (_typeArguments != null && _typeArguments.types.isNotEmpty) {
if (_typeArguments != null && _typeArguments!.types!.isNotEmpty) {
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -243,7 +244,7 @@ class InstanceViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = ([new SpanElement()..text = '< ']
..addAll(_typeArguments.types.expand((type) => [
..addAll(_typeArguments!.types!.expand((type) => [
new InstanceRefElement(_isolate, type, _objects,
queue: _r.queue)
.element,
@ -272,7 +273,7 @@ class InstanceViewElement extends CustomElement implements Renderable {
members.add(member('closure context', _instance.closureContext));
}
if (_instance.kind == M.InstanceKind.closure) {
ButtonElement btn;
late ButtonElement btn;
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -294,24 +295,24 @@ class InstanceViewElement extends CustomElement implements Renderable {
]);
}
if (_instance.nativeFields != null && _instance.nativeFields.isNotEmpty) {
if (_instance.nativeFields != null && _instance.nativeFields!.isNotEmpty) {
int i = 0;
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
new DivElement()
..classes = ['memberName']
..text = 'native fields (${_instance.nativeFields.length})',
..text = 'native fields (${_instance.nativeFields!.length})',
new DivElement()
..classes = ['memberName']
..children = <Element>[
(new CurlyBlockElement(
expanded: _instance.nativeFields.length <= 100,
expanded: _instance.nativeFields!.length <= 100,
queue: _r.queue)
..content = <Element>[
new DivElement()
..classes = ['memberList']
..children = _instance.nativeFields
..children = _instance.nativeFields!
.map<Element>(
(f) => member('[ ${i++} ]', '[ ${f.value} ]'))
.toList()
@ -321,8 +322,8 @@ class InstanceViewElement extends CustomElement implements Renderable {
]);
}
if (_instance.fields != null && _instance.fields.isNotEmpty) {
final fields = _instance.fields.toList();
if (_instance.fields != null && _instance.fields!.isNotEmpty) {
final fields = _instance.fields!.toList();
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -346,8 +347,8 @@ class InstanceViewElement extends CustomElement implements Renderable {
]);
}
if (_instance.elements != null && _instance.elements.isNotEmpty) {
final elements = _instance.elements.toList();
if (_instance.elements != null && _instance.elements!.isNotEmpty) {
final elements = _instance.elements!.toList();
int i = 0;
members.add(new DivElement()
..classes = ['memberItem']
@ -373,12 +374,12 @@ class InstanceViewElement extends CustomElement implements Renderable {
]);
if (_instance.length != elements.length) {
members.add(member(
'...', '${_instance.length - elements.length} omitted elements'));
'...', '${_instance.length! - elements.length} omitted elements'));
}
}
if (_instance.associations != null && _instance.associations.isNotEmpty) {
final associations = _instance.associations.toList();
if (_instance.associations != null && _instance.associations!.isNotEmpty) {
final associations = _instance.associations!.toList();
members.add(new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -419,12 +420,13 @@ class InstanceViewElement extends CustomElement implements Renderable {
]);
if (_instance.length != associations.length) {
members.add(member('...',
'${_instance.length - associations.length} omitted elements'));
'${_instance.length! - associations.length} omitted elements'));
}
}
if (_instance.typedElements != null && _instance.typedElements.isNotEmpty) {
final typedElements = _instance.typedElements.toList();
if (_instance.typedElements != null &&
_instance.typedElements!.isNotEmpty) {
final typedElements = _instance.typedElements!.toList();
int i = 0;
members.add(new DivElement()
..classes = ['memberItem']
@ -449,15 +451,15 @@ class InstanceViewElement extends CustomElement implements Renderable {
]);
if (_instance.length != typedElements.length) {
members.add(member('...',
'${_instance.length - typedElements.length} omitted elements'));
'${_instance.length! - typedElements.length} omitted elements'));
}
}
if (_instance.kind == M.InstanceKind.regExp) {
members.add(member('pattern', _instance.pattern));
members.add(
member('isCaseSensitive', _instance.isCaseSensitive ? 'yes' : 'no'));
members.add(member('isMultiLine', _instance.isMultiLine ? 'yes' : 'no'));
member('isCaseSensitive', _instance.isCaseSensitive! ? 'yes' : 'no'));
members.add(member('isMultiLine', _instance.isMultiLine! ? 'yes' : 'no'));
if (_instance.oneByteFunction != null) {
members.add(member('oneByteFunction', _instance.oneByteFunction));
}
@ -493,25 +495,26 @@ class InstanceViewElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_instance = await _objects.get(_isolate, _instance.id);
_instance = await _objects.get(_isolate, _instance.id!) as M.Instance;
await _loadExtraData();
_r.dirty();
}
Future _loadExtraData() async {
_library = (await _classes.get(_isolate, _instance.clazz.id)).library;
_library = (await _classes.get(_isolate, _instance.clazz!.id!)).library!;
if (_instance.typeArguments != null) {
_typeArguments =
await _arguments.get(_isolate, _instance.typeArguments.id);
await _arguments.get(_isolate, _instance.typeArguments!.id!);
} else {
_typeArguments = null;
}
if (_instance.closureFunction != null) {
_location = (await _functions.get(_isolate, _instance.closureFunction.id))
.location;
_location =
(await _functions.get(_isolate, _instance.closureFunction!.id!))
.location;
} else if (_instance.typeClass != null) {
_location =
(await _classes.get(_isolate, _instance.typeClass.id)).location;
(await _classes.get(_isolate, _instance.typeClass!.id!)).location;
}
_r.dirty();
}
@ -520,7 +523,7 @@ class InstanceViewElement extends CustomElement implements Renderable {
if (_instance.activationBreakpoint == null) {
await _breakpoints.addOnActivation(_isolate, _instance);
} else {
await _breakpoints.remove(_isolate, _instance.activationBreakpoint);
await _breakpoints.remove(_isolate, _instance.activationBreakpoint!);
}
await _refresh();
}

View file

@ -8,15 +8,15 @@ import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/custom_element.dart';
class IsolateCounterChartElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateCounterChartElement> _r;
late RenderingScheduler<IsolateCounterChartElement> _r;
Stream<RenderedEvent<IsolateCounterChartElement>> get onRendered =>
_r.onRendered;
Map _counters;
StreamSubscription _subscription;
late Map _counters;
late StreamSubscription _subscription;
factory IsolateCounterChartElement(Map counters, {RenderingQueue queue}) {
factory IsolateCounterChartElement(Map counters, {RenderingQueue? queue}) {
assert(counters != null);
IsolateCounterChartElement e = new IsolateCounterChartElement.created();
e._r = new RenderingScheduler<IsolateCounterChartElement>(e, queue: queue);

View file

@ -11,19 +11,19 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/source_link.dart';
class IsolateLocationElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateLocationElement> _r;
late RenderingScheduler<IsolateLocationElement> _r;
Stream<RenderedEvent<IsolateLocationElement>> get onRendered => _r.onRendered;
M.Isolate _isolate;
M.EventRepository _events;
M.ScriptRepository _scripts;
StreamSubscription _debugSubscription;
StreamSubscription _isolateSubscription;
late M.Isolate _isolate;
late M.EventRepository _events;
late M.ScriptRepository _scripts;
late StreamSubscription _debugSubscription;
late StreamSubscription _isolateSubscription;
factory IsolateLocationElement(
M.Isolate isolate, M.EventRepository events, M.ScriptRepository scripts,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(events != null);
assert(scripts != null);
@ -63,12 +63,12 @@ class IsolateLocationElement extends CustomElement implements Renderable {
children = <Element>[
new SpanElement()..text = 'at ',
new FunctionRefElement(
_isolate, M.topFrame(_isolate.pauseEvent).function,
_isolate, M.topFrame(_isolate.pauseEvent)!.function!,
queue: _r.queue)
.element,
new SpanElement()..text = ' (',
new SourceLinkElement(
_isolate, M.topFrame(_isolate.pauseEvent).location, _scripts,
new SourceLinkElement(_isolate,
M.topFrame(_isolate.pauseEvent)!.location!, _scripts,
queue: _r.queue)
.element,
new SpanElement()..text = ') '
@ -92,12 +92,12 @@ class IsolateLocationElement extends CustomElement implements Renderable {
content.addAll([
new SpanElement()..text = ' at ',
new FunctionRefElement(
_isolate, M.topFrame(_isolate.pauseEvent).function,
_isolate, M.topFrame(_isolate.pauseEvent)!.function!,
queue: _r.queue)
.element,
new SpanElement()..text = ' (',
new SourceLinkElement(_isolate,
M.topFrame(_isolate.pauseEvent).location, _scripts,
M.topFrame(_isolate.pauseEvent)!.location!, _scripts,
queue: _r.queue)
.element,
new SpanElement()..text = ') '

View file

@ -9,17 +9,17 @@ import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/custom_element.dart';
class IsolateRunStateElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateRunStateElement> _r;
late RenderingScheduler<IsolateRunStateElement> _r;
Stream<RenderedEvent<IsolateRunStateElement>> get onRendered => _r.onRendered;
M.Isolate _isolate;
M.EventRepository _events;
StreamSubscription _debugSubscription;
StreamSubscription _isolateSubscription;
late M.Isolate _isolate;
late M.EventRepository _events;
late StreamSubscription _debugSubscription;
late StreamSubscription _isolateSubscription;
factory IsolateRunStateElement(M.Isolate isolate, M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(events != null);
IsolateRunStateElement e = new IsolateRunStateElement.created();
@ -62,7 +62,7 @@ class IsolateRunStateElement extends CustomElement implements Renderable {
case M.IsolateStatus.paused:
children = <Element>[
new SpanElement()
..title = '${_isolate.pauseEvent.timestamp}'
..title = '${_isolate.pauseEvent!.timestamp}'
..text = 'paused '
];
break;

View file

@ -12,18 +12,18 @@ import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/isolate/counter_chart.dart';
class IsolateSharedSummaryElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateSharedSummaryElement> _r;
late RenderingScheduler<IsolateSharedSummaryElement> _r;
Stream<RenderedEvent<IsolateSharedSummaryElement>> get onRendered =>
_r.onRendered;
M.Isolate _isolate;
M.EventRepository _events;
StreamSubscription _isolateSubscription;
late M.Isolate _isolate;
late M.EventRepository _events;
late StreamSubscription _isolateSubscription;
factory IsolateSharedSummaryElement(
M.Isolate isolate, M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(events != null);
IsolateSharedSummaryElement e = new IsolateSharedSummaryElement.created();
@ -52,10 +52,10 @@ class IsolateSharedSummaryElement extends CustomElement implements Renderable {
}
void render() {
final newHeapUsed = Utils.formatSize(_isolate.newSpace.used);
final newHeapCapacity = Utils.formatSize(_isolate.newSpace.capacity);
final oldHeapUsed = Utils.formatSize(_isolate.oldSpace.used);
final oldHeapCapacity = Utils.formatSize(_isolate.oldSpace.capacity);
final newHeapUsed = Utils.formatSize(_isolate.newSpace!.used);
final newHeapCapacity = Utils.formatSize(_isolate.newSpace!.capacity);
final oldHeapUsed = Utils.formatSize(_isolate.oldSpace!.used);
final oldHeapCapacity = Utils.formatSize(_isolate.oldSpace!.capacity);
final content = <Element>[
new DivElement()
..classes = ['menu']
@ -148,13 +148,14 @@ class IsolateSharedSummaryElement extends CustomElement implements Renderable {
new AnchorElement(href: Uris.logging(_isolate))..text = 'logging'
]
],
new IsolateCounterChartElement(_isolate.counters, queue: _r.queue).element
new IsolateCounterChartElement(_isolate.counters!, queue: _r.queue)
.element
];
if (_isolate.error != null) {
children = <Element>[
new PreElement()
..classes = ['errorBox']
..text = _isolate.error.message,
..text = _isolate.error!.message,
new DivElement()
..classes = ['summary']
..children = content

View file

@ -15,22 +15,22 @@ import 'package:observatory/src/elements/isolate/run_state.dart';
import 'package:observatory/src/elements/isolate/shared_summary.dart';
class IsolateSummaryElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateSummaryElement> _r;
late RenderingScheduler<IsolateSummaryElement> _r;
Stream<RenderedEvent<IsolateSummaryElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.EventRepository _events;
M.IsolateRepository _isolates;
M.ScriptRepository _scripts;
M.Isolate _loadedIsolate;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.IsolateRepository _isolates;
late M.ScriptRepository _scripts;
M.Isolate? _loadedIsolate;
factory IsolateSummaryElement(
M.IsolateRef isolate,
M.IsolateRepository isolates,
M.EventRepository events,
M.ScriptRepository scripts,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(isolates != null);
assert(events != null);
@ -90,9 +90,10 @@ class IsolateSummaryElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['flex-row', 'isolate-state-container']
..children = <Element>[
new IsolateRunStateElement(_isolate, _events, queue: _r.queue)
new IsolateRunStateElement(_isolate as M.Isolate, _events,
queue: _r.queue)
.element,
new IsolateLocationElement(_isolate, _events, _scripts,
new IsolateLocationElement(_isolate as M.Isolate, _events, _scripts,
queue: _r.queue)
.element,
new SpanElement()..text = ' [',
@ -104,14 +105,14 @@ class IsolateSummaryElement extends CustomElement implements Renderable {
Element memoryRow() {
final isolate = _isolate as M.Isolate;
final newHeapUsed = Utils.formatSize(isolate.newSpace.used);
final newHeapCapacity = Utils.formatSize(isolate.newSpace.capacity);
final oldHeapUsed = Utils.formatSize(isolate.oldSpace.used);
final oldHeapCapacity = Utils.formatSize(isolate.oldSpace.capacity);
final newHeapUsed = Utils.formatSize(isolate.newSpace!.used);
final newHeapCapacity = Utils.formatSize(isolate.newSpace!.capacity);
final oldHeapUsed = Utils.formatSize(isolate.oldSpace!.used);
final oldHeapCapacity = Utils.formatSize(isolate.oldSpace!.capacity);
final heapUsed =
Utils.formatSize(isolate.newSpace.used + isolate.oldSpace.used);
final heapCapacity =
Utils.formatSize(isolate.newSpace.capacity + isolate.oldSpace.capacity);
Utils.formatSize(isolate.newSpace!.used + isolate.oldSpace!.used);
final heapCapacity = Utils.formatSize(
isolate.newSpace!.capacity + isolate.oldSpace!.capacity);
return new DivElement()
..classes = ['flex-row-wrap-right']
..children = <Element>[

View file

@ -16,25 +16,25 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class IsolateReconnectElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateReconnectElement> _r;
late RenderingScheduler<IsolateReconnectElement> _r;
Stream<RenderedEvent<IsolateReconnectElement>> get onRendered =>
_r.onRendered;
M.VM _vm;
String _missing;
Uri _uri;
M.EventRepository _events;
StreamSubscription _subscription;
late M.VM _vm;
late String _missing;
late Uri _uri;
late M.EventRepository _events;
late StreamSubscription _subscription;
M.VM get vm => _vm;
String get missing => _missing;
Uri get uri => _uri;
M.NotificationRepository _notifications;
late M.NotificationRepository _notifications;
factory IsolateReconnectElement(M.VM vm, M.EventRepository events,
M.NotificationRepository notifications, String missing, Uri uri,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(events != null);
assert(missing != null);
@ -56,7 +56,7 @@ class IsolateReconnectElement extends CustomElement implements Renderable {
void attached() {
super.attached();
_subscription = _events.onVMUpdate.listen((e) {
_vm = e.vm;
_vm = e.vm as M.VM;
_r.dirty();
});
_r.enable();

View file

@ -12,18 +12,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class IsolateRefElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateRefElement> _r;
late RenderingScheduler<IsolateRefElement> _r;
Stream<RenderedEvent<IsolateRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.EventRepository _events;
StreamSubscription _updatesSubscription;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late StreamSubscription _updatesSubscription;
M.IsolateRef get isolate => _isolate;
factory IsolateRefElement(M.IsolateRef isolate, M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(events != null);
IsolateRefElement e = new IsolateRefElement.created();
@ -56,7 +56,7 @@ class IsolateRefElement extends CustomElement implements Renderable {
}
void render() {
final isolateType = isolate.isSystemIsolate ? 'System Isolate' : 'Isolate';
final isolateType = isolate.isSystemIsolate! ? 'System Isolate' : 'Isolate';
children = <Element>[
new AnchorElement(href: Uris.inspect(isolate))
..text = '$isolateType ${isolate.number} (${isolate.name})'

View file

@ -31,23 +31,23 @@ import 'package:observatory/src/elements/view_footer.dart';
import 'package:observatory/utils.dart';
class IsolateViewElement extends CustomElement implements Renderable {
RenderingScheduler<IsolateViewElement> _r;
late RenderingScheduler<IsolateViewElement> _r;
Stream<RenderedEvent<IsolateViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.Isolate _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.IsolateRepository _isolates;
M.ScriptRepository _scripts;
M.FunctionRepository _functions;
M.LibraryRepository _libraries;
M.ObjectRepository _objects;
M.EvalRepository _eval;
M.ServiceFunction _function;
M.ScriptRef _rootScript;
StreamSubscription _subscription;
late M.VM _vm;
late M.Isolate _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.IsolateRepository _isolates;
late M.ScriptRepository _scripts;
late M.FunctionRepository _functions;
late M.LibraryRepository _libraries;
late M.ObjectRepository _objects;
late M.EvalRepository _eval;
M.ServiceFunction? _function;
M.ScriptRef? _rootScript;
late StreamSubscription _subscription;
M.VMRef get vm => _vm;
M.Isolate get isolate => _isolate;
@ -64,7 +64,7 @@ class IsolateViewElement extends CustomElement implements Renderable {
M.LibraryRepository libraries,
M.ObjectRepository objects,
M.EvalRepository eval,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -114,9 +114,9 @@ class IsolateViewElement extends CustomElement implements Renderable {
}
void render() {
final uptime = new DateTime.now().difference(_isolate.startTime);
final libraries = _isolate.libraries.toList();
final List<M.Thread> threads = _isolate.threads;
final uptime = new DateTime.now().difference(_isolate.startTime!);
final libraries = _isolate.libraries!.toList();
final List<M.Thread> threads = _isolate.threads!.toList();
children = <Element>[
navBar(<Element>[
new NavTopMenuElement(queue: _r.queue).element,
@ -165,11 +165,11 @@ class IsolateViewElement extends CustomElement implements Renderable {
..children = _function != null
? [
new BRElement(),
(new SourceInsetElement(_isolate, _function.location,
(new SourceInsetElement(_isolate, _function!.location!,
_scripts, _objects, _events,
currentPos: M
.topFrame(isolate.pauseEvent)
.location
.topFrame(isolate.pauseEvent)!
.location!
.tokenPos,
queue: _r.queue)
..classes = ['header_inset'])
@ -215,7 +215,7 @@ class IsolateViewElement extends CustomElement implements Renderable {
_isolate.rootLibrary == null
? (new SpanElement()..text = 'loading...')
: new LibraryRefElement(
_isolate, _isolate.rootLibrary,
_isolate, _isolate.rootLibrary!,
queue: _r.queue)
.element
]
@ -230,7 +230,7 @@ class IsolateViewElement extends CustomElement implements Renderable {
new DivElement()
..classes = ['memberValue']
..children = <Element>[
new FunctionRefElement(_isolate, _isolate.entry,
new FunctionRefElement(_isolate, _isolate.entry!,
queue: _r.queue)
.element
]
@ -341,7 +341,7 @@ class IsolateViewElement extends CustomElement implements Renderable {
]
],
new HRElement(),
new EvalBoxElement(_isolate, _isolate.rootLibrary, _objects, _eval,
new EvalBoxElement(_isolate, _isolate.rootLibrary!, _objects, _eval,
queue: _r.queue)
.element,
new DivElement()
@ -349,7 +349,7 @@ class IsolateViewElement extends CustomElement implements Renderable {
? [
new HRElement(),
new ScriptInsetElement(
_isolate, _rootScript, _scripts, _objects, _events,
_isolate, _rootScript!, _scripts, _objects, _events,
queue: _r.queue)
.element
]
@ -390,11 +390,11 @@ class IsolateViewElement extends CustomElement implements Renderable {
_rootScript = null;
final frame = M.topFrame(_isolate.pauseEvent);
if (frame != null) {
_function = await _functions.get(_isolate, frame.function.id);
_function = await _functions.get(_isolate, frame.function!.id!);
}
if (_isolate.rootLibrary != null) {
final rootLibrary =
await _libraries.get(_isolate, _isolate.rootLibrary.id);
await _libraries.get(_isolate, _isolate.rootLibrary!.id!);
_rootScript = rootLibrary.rootScript;
}
_r.dirty();

View file

@ -15,18 +15,18 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class JSONViewElement extends CustomElement implements Renderable {
RenderingScheduler<JSONViewElement> _r;
late RenderingScheduler<JSONViewElement> _r;
Stream<RenderedEvent<JSONViewElement>> get onRendered => _r.onRendered;
M.NotificationRepository _notifications;
Map _map;
late M.NotificationRepository _notifications;
late Map _map;
M.NotificationRepository get notifications => _notifications;
Map get map => _map;
factory JSONViewElement(Map map, M.NotificationRepository notifications,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(notifications != null);
assert(map != null);
JSONViewElement e = new JSONViewElement.created();

View file

@ -12,18 +12,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class LibraryRefElement extends CustomElement implements Renderable {
RenderingScheduler<LibraryRefElement> _r;
late RenderingScheduler<LibraryRefElement> _r;
Stream<RenderedEvent<LibraryRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.LibraryRef _library;
late M.IsolateRef _isolate;
late M.LibraryRef _library;
M.IsolateRef get isolate => _isolate;
M.LibraryRef get library => _library;
factory LibraryRefElement(M.IsolateRef isolate, M.LibraryRef library,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(library != null);
LibraryRefElement e = new LibraryRefElement.created();

View file

@ -29,25 +29,25 @@ import 'package:observatory/src/elements/script_inset.dart';
import 'package:observatory/src/elements/view_footer.dart';
class LibraryViewElement extends CustomElement implements Renderable {
RenderingScheduler<LibraryViewElement> _r;
late RenderingScheduler<LibraryViewElement> _r;
Stream<RenderedEvent<LibraryViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Library _library;
M.LibraryRepository _libraries;
M.FieldRepository _fields;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ScriptRepository _scripts;
M.ObjectRepository _objects;
M.EvalRepository _eval;
Iterable<M.Field> _variables;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Library _library;
late M.LibraryRepository _libraries;
late M.FieldRepository _fields;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ScriptRepository _scripts;
late M.ObjectRepository _objects;
late M.EvalRepository _eval;
Iterable<M.Field>? _variables;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -69,7 +69,7 @@ class LibraryViewElement extends CustomElement implements Renderable {
M.ScriptRepository scripts,
M.ObjectRepository objects,
M.EvalRepository eval,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -197,19 +197,19 @@ class LibraryViewElement extends CustomElement implements Renderable {
}
Future _refresh() async {
_library = await _libraries.get(_isolate, _library.id);
_library = await _libraries.get(_isolate, _library.id!);
_variables = null;
_r.dirty();
_variables = await Future.wait(
_library.variables.map((field) => _fields.get(_isolate, field.id)));
_library.variables!.map((field) => _fields.get(_isolate, field.id!)));
_r.dirty();
}
Element _createDependencies() {
if (_library.dependencies.isEmpty) {
if (_library.dependencies!.isEmpty) {
return new SpanElement();
}
final dependencies = _library.dependencies.toList();
final dependencies = _library.dependencies!.toList();
return new DivElement()
..children = <Element>[
new SpanElement()..text = 'dependencies (${dependencies.length}) ',
@ -232,10 +232,10 @@ class LibraryViewElement extends CustomElement implements Renderable {
}
Element _createScripts() {
if (_library.scripts.isEmpty) {
if (_library.scripts!.isEmpty) {
return new SpanElement();
}
final scripts = _library.scripts.toList();
final scripts = _library.scripts!.toList();
return new DivElement()
..children = <Element>[
new SpanElement()..text = 'scripts (${scripts.length}) ',
@ -252,10 +252,10 @@ class LibraryViewElement extends CustomElement implements Renderable {
}
Element _createClasses() {
if (_library.classes.isEmpty) {
if (_library.classes!.isEmpty) {
return new SpanElement();
}
final classes = _library.classes.toList();
final classes = _library.classes!.toList();
return new DivElement()
..children = <Element>[
new SpanElement()..text = 'classes (${classes.length}) ',
@ -272,10 +272,10 @@ class LibraryViewElement extends CustomElement implements Renderable {
}
Element _createVariables() {
if (_library.variables.isEmpty) {
if (_library.variables!.isEmpty) {
return new SpanElement();
}
final variables = _library.variables.toList();
final variables = _library.variables!.toList();
return new DivElement()
..children = <Element>[
new SpanElement()..text = 'variables (${variables.length}) ',
@ -285,7 +285,7 @@ class LibraryViewElement extends CustomElement implements Renderable {
? (new SpanElement()..text = 'loading...')
: (new DivElement()
..classes = ['indent', 'memberList']
..children = _variables
..children = _variables!
.map<Element>((f) => new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -311,10 +311,10 @@ class LibraryViewElement extends CustomElement implements Renderable {
}
Element _createFunctions() {
if (_library.functions.isEmpty) {
if (_library.functions!.isEmpty) {
return new SpanElement();
}
final functions = _library.functions.toList();
final functions = _library.functions!.toList();
return new DivElement()
..children = <Element>[
new SpanElement()..text = 'functions (${functions.length}) ',

View file

@ -12,20 +12,20 @@ import 'package:observatory/src/elements/helpers/uris.dart';
class LocalVarDescriptorsRefElement extends CustomElement
implements Renderable {
RenderingScheduler<LocalVarDescriptorsRefElement> _r;
late RenderingScheduler<LocalVarDescriptorsRefElement> _r;
Stream<RenderedEvent<LocalVarDescriptorsRefElement>> get onRendered =>
_r.onRendered;
M.IsolateRef _isolate;
M.LocalVarDescriptorsRef _localVar;
late M.IsolateRef _isolate;
late M.LocalVarDescriptorsRef _localVar;
M.IsolateRef get isolate => _isolate;
M.LocalVarDescriptorsRef get localVar => _localVar;
factory LocalVarDescriptorsRefElement(
M.IsolateRef isolate, M.LocalVarDescriptorsRef localVar,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(localVar != null);
LocalVarDescriptorsRefElement e =

View file

@ -22,15 +22,15 @@ import 'package:observatory/src/elements/nav/vm_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class LoggingPageElement extends CustomElement implements Renderable {
RenderingScheduler<LoggingPageElement> _r;
late RenderingScheduler<LoggingPageElement> _r;
Stream<RenderedEvent<LoggingPageElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
Level _level = Level.ALL;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late Level _level = Level.ALL;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -38,7 +38,7 @@ class LoggingPageElement extends CustomElement implements Renderable {
factory LoggingPageElement(M.VM vm, M.IsolateRef isolate,
M.EventRepository events, M.NotificationRepository notifications,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -67,11 +67,11 @@ class LoggingPageElement extends CustomElement implements Renderable {
children = <Element>[];
}
LoggingListElement _logs;
LoggingListElement? _logs;
void render() {
_logs = _logs ?? new LoggingListElement(_isolate, _events);
_logs.level = _level;
_logs!.level = _level;
children = <Element>[
navBar(<Element>[
new NavTopMenuElement(queue: _r.queue).element,
@ -94,7 +94,7 @@ class LoggingPageElement extends CustomElement implements Renderable {
new SpanElement()..text = 'Show messages with severity ',
_createLevelSelector(),
new HRElement(),
_logs.element
_logs!.element
]
];
}
@ -107,7 +107,7 @@ class LoggingPageElement extends CustomElement implements Renderable {
..text = level.name;
}).toList(growable: false);
s.onChange.listen((_) {
_level = Level.LEVELS[s.selectedIndex];
_level = Level.LEVELS[s.selectedIndex!];
_r.dirty();
});
return s;

View file

@ -11,13 +11,13 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/utils.dart';
class LoggingListElement extends CustomElement implements Renderable {
RenderingScheduler<LoggingListElement> _r;
late RenderingScheduler<LoggingListElement> _r;
Stream<RenderedEvent<LoggingListElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.EventRepository _events;
StreamSubscription _subscription;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late StreamSubscription _subscription;
Level _level = Level.ALL;
final _logs = <Map>[];
@ -27,7 +27,7 @@ class LoggingListElement extends CustomElement implements Renderable {
set level(Level value) => _level = _r.checkAndReact(_level, value);
factory LoggingListElement(M.IsolateRef isolate, M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(events != null);
LoggingListElement e = new LoggingListElement.created();

View file

@ -11,20 +11,20 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class MegamorphicCacheRefElement extends CustomElement implements Renderable {
RenderingScheduler<MegamorphicCacheRefElement> _r;
late RenderingScheduler<MegamorphicCacheRefElement> _r;
Stream<RenderedEvent<MegamorphicCacheRefElement>> get onRendered =>
_r.onRendered;
M.IsolateRef _isolate;
M.MegamorphicCacheRef _cache;
late M.IsolateRef _isolate;
late M.MegamorphicCacheRef _cache;
M.IsolateRef get isolate => _isolate;
M.MegamorphicCacheRef get cache => _cache;
factory MegamorphicCacheRefElement(
M.IsolateRef isolate, M.MegamorphicCacheRef cache,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(cache != null);
MegamorphicCacheRefElement e = new MegamorphicCacheRefElement.created();

View file

@ -23,22 +23,22 @@ import 'package:observatory/src/elements/object_common.dart';
import 'package:observatory/src/elements/view_footer.dart';
class MegamorphicCacheViewElement extends CustomElement implements Renderable {
RenderingScheduler<MegamorphicCacheViewElement> _r;
late RenderingScheduler<MegamorphicCacheViewElement> _r;
Stream<RenderedEvent<MegamorphicCacheViewElement>> get onRendered =>
_r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.MegamorphicCache _cache;
M.MegamorphicCacheRepository _caches;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.MegamorphicCache _cache;
late M.MegamorphicCacheRepository _caches;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -57,7 +57,7 @@ class MegamorphicCacheViewElement extends CustomElement implements Renderable {
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -111,7 +111,7 @@ class MegamorphicCacheViewElement extends CustomElement implements Renderable {
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
e.element.disabled = true;
_cache = await _caches.get(_isolate, _cache.id);
_cache = await _caches.get(_isolate, _cache.id!);
_r.dirty();
}))
.element,

View file

@ -9,20 +9,20 @@ import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/custom_element.dart';
class MetricDetailsElement extends CustomElement implements Renderable {
RenderingScheduler<MetricDetailsElement> _r;
late RenderingScheduler<MetricDetailsElement> _r;
Stream<RenderedEvent<MetricDetailsElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.Metric _metric;
M.MetricRepository _metrics;
late M.IsolateRef _isolate;
late M.Metric _metric;
late M.MetricRepository _metrics;
M.IsolateRef get isolate => _isolate;
M.Metric get metric => _metric;
factory MetricDetailsElement(
M.IsolateRef isolate, M.Metric metric, M.MetricRepository metrics,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(metric != null);
assert(metrics != null);

View file

@ -9,21 +9,21 @@ import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory/src/elements/helpers/custom_element.dart';
class MetricGraphElement extends CustomElement implements Renderable {
RenderingScheduler<MetricGraphElement> _r;
late RenderingScheduler<MetricGraphElement> _r;
Stream<RenderedEvent<MetricGraphElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.Metric _metric;
M.MetricRepository _metrics;
Timer _timer;
late M.IsolateRef _isolate;
late M.Metric _metric;
late M.MetricRepository _metrics;
late Timer _timer;
M.IsolateRef get isolate => _isolate;
M.Metric get metric => _metric;
factory MetricGraphElement(
M.IsolateRef isolate, M.Metric metric, M.MetricRepository metrics,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(metric != null);
assert(metrics != null);
@ -56,8 +56,8 @@ class MetricGraphElement extends CustomElement implements Renderable {
final min = _metrics.getMinValue(_isolate, _metric);
final max = _metrics.getMaxValue(_isolate, _metric);
final rows = _metrics
.getSamples(_isolate, _metric)
.map((s) => [s.time.millisecondsSinceEpoch, s.value])
.getSamples(_isolate, _metric)!
.map((s) => [s.time!.millisecondsSinceEpoch, s.value])
.toList();
final current = rows.last.last;

View file

@ -20,17 +20,17 @@ import 'package:observatory/src/elements/nav/top_menu.dart';
import 'package:observatory/src/elements/nav/vm_menu.dart';
class MetricsPageElement extends CustomElement implements Renderable {
RenderingScheduler<MetricsPageElement> _r;
late RenderingScheduler<MetricsPageElement> _r;
Stream<RenderedEvent<MetricsPageElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.MetricRepository _metrics;
List<M.Metric> _available;
M.Metric _selected;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.MetricRepository _metrics;
List<M.Metric>? _available;
M.Metric? _selected;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -42,7 +42,7 @@ class MetricsPageElement extends CustomElement implements Renderable {
M.EventRepository events,
M.NotificationRepository notifications,
M.MetricRepository metrics,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -114,7 +114,7 @@ class MetricsPageElement extends CustomElement implements Renderable {
..children = _selected == null
? const []
: [
new MetricDetailsElement(_isolate, _selected, _metrics,
new MetricDetailsElement(_isolate, _selected!, _metrics,
queue: _r.queue)
.element
],
@ -124,7 +124,7 @@ class MetricsPageElement extends CustomElement implements Renderable {
..children = _selected == null
? const []
: [
new MetricGraphElement(_isolate, _selected, _metrics,
new MetricGraphElement(_isolate, _selected!, _metrics,
queue: _r.queue)
.element
]
@ -134,8 +134,8 @@ class MetricsPageElement extends CustomElement implements Renderable {
Future _refresh() async {
_available = (await _metrics.list(_isolate)).toList();
if (!_available.contains(_selected)) {
_selected = _available.first;
if (!_available!.contains(_selected)) {
_selected = _available!.first;
}
_r.dirty();
}
@ -144,14 +144,14 @@ class MetricsPageElement extends CustomElement implements Renderable {
var s;
return [
s = new SelectElement()
..value = _selected.name
..children = _available.map((metric) {
..value = _selected!.name!
..children = _available!.map((metric) {
return new OptionElement(
value: metric.name, selected: _selected == metric)
..text = metric.name;
value: metric.name!, selected: _selected == metric)
..text = metric.name!;
}).toList(growable: false)
..onChange.listen((_) {
_selected = _available[s.selectedIndex];
_selected = _available![s.selectedIndex];
_r.dirty();
})
];

View file

@ -21,21 +21,21 @@ import 'package:observatory/src/elements/sample_buffer_control.dart';
import 'package:observatory/src/elements/stack_trace_tree_config.dart';
class NativeMemoryProfileElement extends CustomElement implements Renderable {
RenderingScheduler<NativeMemoryProfileElement> _r;
late RenderingScheduler<NativeMemoryProfileElement> _r;
Stream<RenderedEvent<NativeMemoryProfileElement>> get onRendered =>
_r.onRendered;
M.VM _vm;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.NativeMemorySampleProfileRepository _profiles;
Stream<M.SampleProfileLoadingProgressEvent> _progressStream;
M.SampleProfileLoadingProgress _progress;
M.SampleProfileTag _tag = M.SampleProfileTag.none;
ProfileTreeMode _mode = ProfileTreeMode.function;
M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
String _filter = '';
late M.VM _vm;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.NativeMemorySampleProfileRepository _profiles;
Stream<M.SampleProfileLoadingProgressEvent>? _progressStream;
M.SampleProfileLoadingProgress? _progress;
late M.SampleProfileTag _tag = M.SampleProfileTag.none;
late ProfileTreeMode _mode = ProfileTreeMode.function;
late M.ProfileTreeDirection _direction = M.ProfileTreeDirection.exclusive;
late String _filter = '';
M.NotificationRepository get notifications => _notifications;
M.NativeMemorySampleProfileRepository get profiles => _profiles;
@ -45,7 +45,7 @@ class NativeMemoryProfileElement extends CustomElement implements Renderable {
M.EventRepository events,
M.NotificationRepository notifications,
M.NativeMemorySampleProfileRepository profiles,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(events != null);
assert(notifications != null);
@ -90,15 +90,16 @@ class NativeMemoryProfileElement extends CustomElement implements Renderable {
children = content;
return;
}
content.add((new SampleBufferControlElement(_vm, _progress, _progressStream,
content.add((new SampleBufferControlElement(
_vm, _progress!, _progressStream!,
selectedTag: _tag, queue: _r.queue)
..onTagChange.listen((e) {
_tag = e.element.selectedTag;
_request();
}))
.element);
if (_progress.status == M.SampleProfileLoadingStatus.loaded) {
CpuProfileVirtualTreeElement tree;
if (_progress!.status == M.SampleProfileLoadingStatus.loaded) {
late CpuProfileVirtualTreeElement tree;
content.addAll([
new BRElement(),
(new StackTraceTreeConfigElement(
@ -124,7 +125,7 @@ class NativeMemoryProfileElement extends CustomElement implements Renderable {
}))
.element,
new BRElement(),
(tree = new CpuProfileVirtualTreeElement(null, _progress.profile,
(tree = new CpuProfileVirtualTreeElement(null, _progress!.profile,
queue: _r.queue, type: M.SampleProfileType.memory))
.element,
]);
@ -134,17 +135,17 @@ class NativeMemoryProfileElement extends CustomElement implements Renderable {
Future _request({bool forceFetch: false}) async {
if (forceFetch) {
for (M.Isolate isolate in _vm.isolates) {
for (M.IsolateRef isolate in _vm.isolates) {
await isolate.collectAllGarbage();
}
}
_progress = null;
_progressStream = _profiles.get(_vm, _tag, forceFetch: forceFetch);
_r.dirty();
_progress = (await _progressStream.first).progress;
_progress = (await _progressStream!.first).progress;
_r.dirty();
if (M.isSampleProcessRunning(_progress.status)) {
_progress = (await _progressStream.last).progress;
if (M.isSampleProcessRunning(_progress!.status)) {
_progress = (await _progressStream!.last).progress;
_r.dirty();
}
}

View file

@ -11,17 +11,17 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class NavClassMenuElement extends CustomElement implements Renderable {
RenderingScheduler<NavClassMenuElement> _r;
late RenderingScheduler<NavClassMenuElement> _r;
Stream<RenderedEvent<NavClassMenuElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.ClassRef _cls;
Iterable<Element> _content = const [];
late M.IsolateRef _isolate;
late M.ClassRef _cls;
List<Element> _content = const [];
M.IsolateRef get isolate => _isolate;
M.ClassRef get cls => _cls;
Iterable<Element> get content => _content;
List<Element> get content => _content;
set content(Iterable<Element> value) {
_content = value.toList();
@ -29,7 +29,7 @@ class NavClassMenuElement extends CustomElement implements Renderable {
}
factory NavClassMenuElement(M.IsolateRef isolate, M.ClassRef cls,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(cls != null);
NavClassMenuElement e = new NavClassMenuElement.created();
@ -56,7 +56,7 @@ class NavClassMenuElement extends CustomElement implements Renderable {
void render() {
children = <Element>[
navMenu(cls.name,
navMenu(cls.name!,
content: _content, link: Uris.inspect(isolate, object: cls))
];
}

View file

@ -12,14 +12,14 @@ import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/nav/menu_item.dart';
class NavIsolateMenuElement extends CustomElement implements Renderable {
RenderingScheduler<NavIsolateMenuElement> _r;
late RenderingScheduler<NavIsolateMenuElement> _r;
Stream<RenderedEvent<NavIsolateMenuElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.EventRepository _events;
StreamSubscription _updatesSubscription;
Iterable<Element> _content = const [];
late M.IsolateRef _isolate;
late M.EventRepository _events;
StreamSubscription? _updatesSubscription;
late Iterable<Element> _content = const [];
M.IsolateRef get isolate => _isolate;
Iterable<Element> get content => _content;
@ -30,7 +30,7 @@ class NavIsolateMenuElement extends CustomElement implements Renderable {
}
factory NavIsolateMenuElement(M.IsolateRef isolate, M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(events != null);
NavIsolateMenuElement e = new NavIsolateMenuElement.created();
@ -60,7 +60,7 @@ class NavIsolateMenuElement extends CustomElement implements Renderable {
children = <Element>[];
_r.disable(notify: true);
assert(_updatesSubscription != null);
_updatesSubscription.cancel();
_updatesSubscription!.cancel();
_updatesSubscription = null;
}
@ -101,7 +101,7 @@ class NavIsolateMenuElement extends CustomElement implements Renderable {
.element,
]..addAll(_content);
children = <Element>[
navMenu(isolate.name, content: content, link: Uris.inspect(isolate))
navMenu(isolate.name!, content: content, link: Uris.inspect(isolate))
];
}
}

View file

@ -11,17 +11,17 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class NavLibraryMenuElement extends CustomElement implements Renderable {
RenderingScheduler<NavLibraryMenuElement> _r;
late RenderingScheduler<NavLibraryMenuElement> _r;
Stream<RenderedEvent<NavLibraryMenuElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.LibraryRef _library;
Iterable<Element> _content = const [];
late M.IsolateRef _isolate;
late M.LibraryRef _library;
List<Element> _content = const [];
M.IsolateRef get isolate => _isolate;
M.LibraryRef get library => _library;
Iterable<Element> get content => _content;
List<Element> get content => _content;
set content(Iterable<Element> value) {
_content = value.toList();
@ -29,7 +29,7 @@ class NavLibraryMenuElement extends CustomElement implements Renderable {
}
factory NavLibraryMenuElement(M.IsolateRef isolate, M.LibraryRef library,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(library != null);
NavLibraryMenuElement e = new NavLibraryMenuElement.created();
@ -56,7 +56,7 @@ class NavLibraryMenuElement extends CustomElement implements Renderable {
void render() {
children = <Element>[
navMenu(library.name,
navMenu(library.name!,
content: _content,
link: Uris.inspect(isolate, object: library).toString())
];

View file

@ -8,17 +8,17 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/rendering_scheduler.dart';
class NavMenuItemElement extends CustomElement implements Renderable {
RenderingScheduler<NavMenuItemElement> _r;
late RenderingScheduler<NavMenuItemElement> _r;
Stream<RenderedEvent<NavMenuItemElement>> get onRendered => _r.onRendered;
String _label;
String _link;
Iterable<Element> _content = const <Element>[];
late String _label;
late String _link;
List<Element> _content = const <Element>[];
String get label => _label;
String get link => _link;
Iterable<Element> get content => _content;
List<Element> get content => _content;
set label(String value) => _label = _r.checkAndReact(_label, value);
set link(String value) => _link = _r.checkAndReact(_link, value);
@ -28,7 +28,7 @@ class NavMenuItemElement extends CustomElement implements Renderable {
}
factory NavMenuItemElement(String label,
{String link, RenderingQueue queue}) {
{String link = '', RenderingQueue? queue}) {
assert(label != null);
NavMenuItemElement e = new NavMenuItemElement.created();
e._r = new RenderingScheduler<NavMenuItemElement>(e, queue: queue);

View file

@ -11,14 +11,14 @@ import 'package:observatory/src/elements/nav/notify_event.dart';
import 'package:observatory/src/elements/nav/notify_exception.dart';
class NavNotifyElement extends CustomElement implements Renderable {
RenderingScheduler<NavNotifyElement> _r;
late RenderingScheduler<NavNotifyElement> _r;
Stream<RenderedEvent<NavNotifyElement>> get onRendered => _r.onRendered;
M.NotificationRepository _repository;
StreamSubscription _subscription;
late M.NotificationRepository _repository;
StreamSubscription? _subscription;
bool _notifyOnPause;
late bool _notifyOnPause;
bool get notifyOnPause => _notifyOnPause;
@ -26,7 +26,7 @@ class NavNotifyElement extends CustomElement implements Renderable {
_notifyOnPause = _r.checkAndReact(_notifyOnPause, value);
factory NavNotifyElement(M.NotificationRepository repository,
{bool notifyOnPause: true, RenderingQueue queue}) {
{bool notifyOnPause: true, RenderingQueue? queue}) {
assert(repository != null);
assert(notifyOnPause != null);
NavNotifyElement e = new NavNotifyElement.created();
@ -50,7 +50,7 @@ class NavNotifyElement extends CustomElement implements Renderable {
super.detached();
children = <Element>[];
_r.disable(notify: true);
_subscription.cancel();
_subscription!.cancel();
}
void render() {

View file

@ -15,7 +15,7 @@ class EventDeleteEvent {
}
class NavNotifyEventElement extends CustomElement implements Renderable {
RenderingScheduler<NavNotifyEventElement> _r;
late RenderingScheduler<NavNotifyEventElement> _r;
Stream<RenderedEvent<NavNotifyEventElement>> get onRendered => _r.onRendered;
@ -23,11 +23,11 @@ class NavNotifyEventElement extends CustomElement implements Renderable {
new StreamController<EventDeleteEvent>.broadcast();
Stream<EventDeleteEvent> get onDelete => _onDelete.stream;
M.Event _event;
late M.Event _event;
M.Event get event => _event;
factory NavNotifyEventElement(M.Event event, {RenderingQueue queue}) {
factory NavNotifyEventElement(M.Event event, {RenderingQueue? queue}) {
assert(event != null);
NavNotifyEventElement e = new NavNotifyEventElement.created();
e._r = new RenderingScheduler<NavNotifyEventElement>(e, queue: queue);
@ -116,7 +116,7 @@ class NavNotifyEventElement extends CustomElement implements Renderable {
M.PauseBreakpointEvent event) {
String message = ' is paused';
if (event.breakpoint != null) {
message += ' at breakpoint ${event.breakpoint.number}';
message += ' at breakpoint ${event.breakpoint!.number}';
}
return [
new SpanElement()..text = 'Isolate ',

View file

@ -11,13 +11,13 @@ import 'package:observatory/models.dart' show ConnectionException;
class ExceptionDeleteEvent {
final dynamic exception;
final StackTrace stacktrace;
final StackTrace? stacktrace;
ExceptionDeleteEvent(this.exception, {this.stacktrace});
}
class NavNotifyExceptionElement extends CustomElement implements Renderable {
RenderingScheduler<NavNotifyExceptionElement> _r;
late RenderingScheduler<NavNotifyExceptionElement> _r;
Stream<RenderedEvent<NavNotifyExceptionElement>> get onRendered =>
_r.onRendered;
@ -26,14 +26,14 @@ class NavNotifyExceptionElement extends CustomElement implements Renderable {
new StreamController<ExceptionDeleteEvent>.broadcast();
Stream<ExceptionDeleteEvent> get onDelete => _onDelete.stream;
dynamic _exception;
StackTrace _stacktrace;
late dynamic _exception;
StackTrace? _stacktrace;
dynamic get exception => _exception;
StackTrace get stacktrace => _stacktrace;
StackTrace? get stacktrace => _stacktrace;
factory NavNotifyExceptionElement(dynamic exception,
{StackTrace stacktrace: null, RenderingQueue queue}) {
{StackTrace? stacktrace: null, RenderingQueue? queue}) {
assert(exception != null);
NavNotifyExceptionElement e = new NavNotifyExceptionElement.created();
e._r = new RenderingScheduler<NavNotifyExceptionElement>(e, queue: queue);

View file

@ -13,7 +13,7 @@ class RefreshEvent {
}
class NavRefreshElement extends CustomElement implements Renderable {
RenderingScheduler<NavRefreshElement> _r;
late RenderingScheduler<NavRefreshElement> _r;
Stream<RenderedEvent<NavRefreshElement>> get onRendered => _r.onRendered;
@ -21,8 +21,8 @@ class NavRefreshElement extends CustomElement implements Renderable {
new StreamController<RefreshEvent>.broadcast();
Stream<RefreshEvent> get onRefresh => _onRefresh.stream;
bool _disabled;
String _label;
late bool _disabled;
late String _label;
bool get disabled => _disabled;
String get label => _label;
@ -31,7 +31,7 @@ class NavRefreshElement extends CustomElement implements Renderable {
set label(String value) => _label = _r.checkAndReact(_label, value);
factory NavRefreshElement(
{String label: 'Refresh', bool disabled: false, RenderingQueue queue}) {
{String label: 'Refresh', bool disabled: false, RenderingQueue? queue}) {
assert(label != null);
assert(disabled != null);
NavRefreshElement e = new NavRefreshElement.created();

View file

@ -16,7 +16,7 @@ class ReloadEvent {
}
class NavReloadElement extends CustomElement implements Renderable {
RenderingScheduler<NavReloadElement> _r;
late RenderingScheduler<NavReloadElement> _r;
Stream<RenderedEvent<NavReloadElement>> get onRendered => _r.onRendered;
@ -24,15 +24,15 @@ class NavReloadElement extends CustomElement implements Renderable {
new StreamController<ReloadEvent>.broadcast();
Stream<ReloadEvent> get onReload => _onReload.stream;
M.IsolateRef _isolate;
M.IsolateRepository _isolates;
M.EventRepository _events;
StreamSubscription _sub;
late M.IsolateRef _isolate;
late M.IsolateRepository _isolates;
late M.EventRepository _events;
StreamSubscription? _sub;
bool _disabled = false;
factory NavReloadElement(M.IsolateRef isolate, M.IsolateRepository isolates,
M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(isolates != null);
assert(events != null);
@ -57,7 +57,7 @@ class NavReloadElement extends CustomElement implements Renderable {
void detached() {
super.detached();
children = <Element>[];
_sub.cancel();
_sub!.cancel();
_sub = null;
_r.disable(notify: true);
}
@ -82,13 +82,15 @@ class NavReloadElement extends CustomElement implements Renderable {
.listen((_) => _reload(_isolates.reloadSourcesServices.single))
]);
} else {
final content = _isolates.reloadSourcesServices.map((s) => new LIElement()
..children = <Element>[
new ButtonElement()
..text = s.alias
..disabled = _disabled
..onClick.listen((_) => _reload(s))
]);
final content = _isolates.reloadSourcesServices
.map((s) => new LIElement()
..children = <Element>[
new ButtonElement()
..text = s.alias
..disabled = _disabled
..onClick.listen((_) => _reload(s))
])
.toList();
children.add(navMenu('Reload Source', content: content));
}
this.children = children;

View file

@ -11,7 +11,7 @@ import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/nav/menu_item.dart';
class NavTopMenuElement extends CustomElement implements Renderable {
RenderingScheduler<NavTopMenuElement> _r;
late RenderingScheduler<NavTopMenuElement> _r;
Stream<RenderedEvent<NavTopMenuElement>> get onRendered => _r.onRendered;
@ -24,7 +24,7 @@ class NavTopMenuElement extends CustomElement implements Renderable {
_r.dirty();
}
factory NavTopMenuElement({RenderingQueue queue}) {
factory NavTopMenuElement({RenderingQueue? queue}) {
NavTopMenuElement e = new NavTopMenuElement.created();
e._r = new RenderingScheduler<NavTopMenuElement>(e, queue: queue);
return e;

View file

@ -12,13 +12,13 @@ import 'package:observatory/src/elements/helpers/uris.dart';
import 'package:observatory/src/elements/nav/menu_item.dart';
class NavVMMenuElement extends CustomElement implements Renderable {
RenderingScheduler<NavVMMenuElement> _r;
late RenderingScheduler<NavVMMenuElement> _r;
Stream<RenderedEvent<NavVMMenuElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.EventRepository _events;
StreamSubscription _updatesSubscription;
late M.VM _vm;
late M.EventRepository _events;
late StreamSubscription _updatesSubscription;
Iterable<Element> _content = const [];
M.VM get vm => _vm;
@ -30,7 +30,7 @@ class NavVMMenuElement extends CustomElement implements Renderable {
}
factory NavVMMenuElement(M.VM vm, M.EventRepository events,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(events != null);
NavVMMenuElement e = new NavVMMenuElement.created();
@ -46,7 +46,7 @@ class NavVMMenuElement extends CustomElement implements Renderable {
void attached() {
super.attached();
_updatesSubscription = _events.onVMUpdate.listen((e) {
_vm = e.vm;
_vm = e.vm as M.VM;
_r.dirty();
});
_r.enable();
@ -62,13 +62,13 @@ class NavVMMenuElement extends CustomElement implements Renderable {
void render() {
final content = (_vm.isolates.map<Element>((isolate) {
return new NavMenuItemElement(isolate.name,
return new NavMenuItemElement(isolate.name!,
queue: _r.queue, link: Uris.inspect(isolate))
.element;
}).toList()
..addAll(_content));
children = <Element>[
navMenu(vm.displayName, link: Uris.vm(), content: content)
navMenu(vm.displayName!, link: Uris.vm(), content: content)
];
}
}

View file

@ -14,20 +14,20 @@ import 'package:observatory/src/elements/sentinel_value.dart';
import 'package:observatory/utils.dart';
class ObjectCommonElement extends CustomElement implements Renderable {
RenderingScheduler<ObjectCommonElement> _r;
late RenderingScheduler<ObjectCommonElement> _r;
Stream<RenderedEvent<ObjectCommonElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.Object _object;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ObjectRepository _objects;
M.Guarded<M.Instance> _retainedSize = null;
late M.IsolateRef _isolate;
late M.Object _object;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ObjectRepository _objects;
M.Guarded<M.Instance>? _retainedSize = null;
bool _loadingRetainedBytes = false;
M.Guarded<M.Instance> _reachableSize = null;
M.Guarded<M.Instance>? _reachableSize = null;
bool _loadingReachableBytes = false;
M.IsolateRef get isolate => _isolate;
@ -41,7 +41,7 @@ class ObjectCommonElement extends CustomElement implements Renderable {
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(object != null);
assert(retainedSizes != null);
@ -76,8 +76,8 @@ class ObjectCommonElement extends CustomElement implements Renderable {
children = <Element>[];
}
RetainingPathElement _path;
InboundReferencesElement _inbounds;
RetainingPathElement? _path;
InboundReferencesElement? _inbounds;
void render() {
_path = _path ??
@ -101,7 +101,7 @@ class ObjectCommonElement extends CustomElement implements Renderable {
..children = <Element>[
_object.clazz == null
? (new SpanElement()..text = '...')
: new ClassRefElement(_isolate, _object.clazz,
: new ClassRefElement(_isolate, _object.clazz!,
queue: _r.queue)
.element
]
@ -149,7 +149,7 @@ class ObjectCommonElement extends CustomElement implements Renderable {
..text = 'Retaining path ',
new DivElement()
..classes = ['memberValue']
..children = <Element>[_path.element]
..children = <Element>[_path!.element]
],
new DivElement()
..classes = ['memberItem']
@ -160,7 +160,7 @@ class ObjectCommonElement extends CustomElement implements Renderable {
..text = 'Inbound references ',
new DivElement()
..classes = ['memberValue']
..children = <Element>[_inbounds.element]
..children = <Element>[_inbounds!.element]
]
]
];
@ -169,14 +169,14 @@ class ObjectCommonElement extends CustomElement implements Renderable {
List<Element> _createReachableSizeValue() {
final content = <Element>[];
if (_reachableSize != null) {
if (_reachableSize.isSentinel) {
content.add(
new SentinelValueElement(_reachableSize.asSentinel, queue: _r.queue)
.element);
if (_reachableSize!.isSentinel) {
content.add(new SentinelValueElement(_reachableSize!.asSentinel!,
queue: _r.queue)
.element);
} else {
content.add(new SpanElement()
..text = Utils.formatSize(
int.parse(_reachableSize.asValue.valueAsString)));
int.parse(_reachableSize!.asValue!.valueAsString!)));
}
} else {
content.add(new SpanElement()..text = '...');
@ -188,7 +188,7 @@ class ObjectCommonElement extends CustomElement implements Renderable {
button.onClick.listen((_) async {
button.disabled = true;
_loadingReachableBytes = true;
_reachableSize = await _reachableSizes.get(_isolate, _object.id);
_reachableSize = await _reachableSizes.get(_isolate, _object.id!);
_r.dirty();
});
content.add(button);
@ -198,14 +198,14 @@ class ObjectCommonElement extends CustomElement implements Renderable {
List<Element> _createRetainedSizeValue() {
final content = <Element>[];
if (_retainedSize != null) {
if (_retainedSize.isSentinel) {
content.add(
new SentinelValueElement(_retainedSize.asSentinel, queue: _r.queue)
.element);
if (_retainedSize!.isSentinel) {
content.add(new SentinelValueElement(_retainedSize!.asSentinel!,
queue: _r.queue)
.element);
} else {
content.add(new SpanElement()
..text =
Utils.formatSize(int.parse(_retainedSize.asValue.valueAsString)));
..text = Utils.formatSize(
int.parse(_retainedSize!.asValue!.valueAsString!)));
}
} else {
content.add(new SpanElement()..text = '...');
@ -217,7 +217,7 @@ class ObjectCommonElement extends CustomElement implements Renderable {
button.onClick.listen((_) async {
button.disabled = true;
_loadingRetainedBytes = true;
_retainedSize = await _retainedSizes.get(_isolate, _object.id);
_retainedSize = await _retainedSizes.get(_isolate, _object.id!);
_r.dirty();
});
content.add(button);

View file

@ -20,25 +20,24 @@ import 'package:observatory/src/elements/object_common.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ObjectViewElement extends CustomElement implements Renderable {
RenderingScheduler<ObjectViewElement> _r;
late RenderingScheduler<ObjectViewElement> _r;
Stream<RenderedEvent<ObjectViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.Object _object;
M.ObjectRepository _objects;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.Object _object;
late M.ObjectRepository _objects;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
M.NotificationRepository get notifications => _notifications;
M.Context get object => _object;
factory ObjectViewElement(
M.VM vm,
@ -51,7 +50,7 @@ class ObjectViewElement extends CustomElement implements Renderable {
M.ReachableSizeRepository reachableSizes,
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -102,7 +101,7 @@ class ObjectViewElement extends CustomElement implements Renderable {
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
e.element.disabled = true;
_object = await _objects.get(_isolate, _object.id);
_object = await _objects.get(_isolate, _object.id!);
_r.dirty();
}))
.element,

View file

@ -10,18 +10,18 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class ObjectPoolRefElement extends CustomElement implements Renderable {
RenderingScheduler<ObjectPoolRefElement> _r;
late RenderingScheduler<ObjectPoolRefElement> _r;
Stream<RenderedEvent<ObjectPoolRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.ObjectPoolRef _pool;
late M.IsolateRef _isolate;
late M.ObjectPoolRef _pool;
M.IsolateRef get isolate => _isolate;
M.ObjectPoolRef get pool => _pool;
factory ObjectPoolRefElement(M.IsolateRef isolate, M.ObjectPoolRef pool,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(pool != null);
ObjectPoolRefElement e = new ObjectPoolRefElement.created();

View file

@ -23,21 +23,21 @@ import 'package:observatory/src/elements/object_common.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ObjectPoolViewElement extends CustomElement implements Renderable {
RenderingScheduler<ObjectPoolViewElement> _r;
late RenderingScheduler<ObjectPoolViewElement> _r;
Stream<RenderedEvent<ObjectPoolViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.ObjectPool _pool;
M.ObjectPoolRepository _pools;
M.RetainedSizeRepository _retainedSizes;
M.ReachableSizeRepository _reachableSizes;
M.InboundReferencesRepository _references;
M.RetainingPathRepository _retainingPaths;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.ObjectPool _pool;
late M.ObjectPoolRepository _pools;
late M.RetainedSizeRepository _retainedSizes;
late M.ReachableSizeRepository _reachableSizes;
late M.InboundReferencesRepository _references;
late M.RetainingPathRepository _retainingPaths;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -56,7 +56,7 @@ class ObjectPoolViewElement extends CustomElement implements Renderable {
M.InboundReferencesRepository references,
M.RetainingPathRepository retainingPaths,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -109,7 +109,7 @@ class ObjectPoolViewElement extends CustomElement implements Renderable {
(new NavRefreshElement(queue: _r.queue)
..onRefresh.listen((e) async {
e.element.disabled = true;
_pool = await _pools.get(_isolate, _pool.id);
_pool = await _pools.get(_isolate, _pool.id!);
_r.dirty();
}))
.element,
@ -125,10 +125,10 @@ class ObjectPoolViewElement extends CustomElement implements Renderable {
queue: _r.queue)
.element,
new HRElement(),
new HeadingElement.h3()..text = 'entries (${_pool.entries.length})',
new HeadingElement.h3()..text = 'entries (${_pool.entries!.length})',
new DivElement()
..classes = ['memberList']
..children = _pool.entries
..children = _pool.entries!
.map<Element>((entry) => new DivElement()
..classes = ['memberItem']
..children = <Element>[
@ -154,12 +154,12 @@ class ObjectPoolViewElement extends CustomElement implements Renderable {
case M.ObjectPoolEntryKind.immediate:
return [
new SpanElement()
..text = 'Immediate 0x${entry.asInteger.toRadixString(16)}'
..text = 'Immediate 0x${entry.asInteger!.toRadixString(16)}'
];
case M.ObjectPoolEntryKind.nativeEntry:
return [
new SpanElement()
..text = 'NativeEntry 0x${entry.asInteger.toRadixString(16)}'
..text = 'NativeEntry 0x${entry.asInteger!.toRadixString(16)}'
];
}
throw new Exception('Unknown ObjectPoolEntryKind (${entry.kind})');

View file

@ -20,17 +20,17 @@ import 'package:observatory/src/elements/nav/vm_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class ObjectStoreViewElement extends CustomElement implements Renderable {
RenderingScheduler<ObjectStoreViewElement> _r;
late RenderingScheduler<ObjectStoreViewElement> _r;
Stream<RenderedEvent<ObjectStoreViewElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.ObjectStore _store;
M.ObjectStoreRepository _stores;
M.ObjectRepository _objects;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
M.ObjectStore? _store;
late M.ObjectStoreRepository _stores;
late M.ObjectRepository _objects;
M.VMRef get vm => _vm;
M.IsolateRef get isolate => _isolate;
@ -43,7 +43,7 @@ class ObjectStoreViewElement extends CustomElement implements Renderable {
M.NotificationRepository notifications,
M.ObjectStoreRepository stores,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -78,7 +78,7 @@ class ObjectStoreViewElement extends CustomElement implements Renderable {
}
void render() {
final fields = _store?.fields?.toList(growable: false);
final fields = _store?.fields.toList(growable: false);
children = <Element>[
navBar(<Element>[
new NavTopMenuElement(queue: _r.queue).element,

View file

@ -11,7 +11,7 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
/// [ObservatoryApplication] which is passed declaratively to all child
/// elements.
class ObservatoryApplicationElement extends CustomElement {
ObservatoryApplication app;
late ObservatoryApplication app;
ObservatoryApplicationElement.created()
: super.created('observatory-application');

View file

@ -10,20 +10,20 @@ import 'package:observatory/src/elements/helpers/custom_element.dart';
import 'package:observatory/src/elements/helpers/uris.dart';
class PcDescriptorsRefElement extends CustomElement implements Renderable {
RenderingScheduler<PcDescriptorsRefElement> _r;
late RenderingScheduler<PcDescriptorsRefElement> _r;
Stream<RenderedEvent<PcDescriptorsRefElement>> get onRendered =>
_r.onRendered;
M.IsolateRef _isolate;
M.PcDescriptorsRef _descriptors;
late M.IsolateRef _isolate;
late M.PcDescriptorsRef _descriptors;
M.IsolateRef get isolate => _isolate;
M.PcDescriptorsRef get descriptors => _descriptors;
factory PcDescriptorsRefElement(
M.IsolateRef isolate, M.PcDescriptorsRef descriptors,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(isolate != null);
assert(descriptors != null);
PcDescriptorsRefElement e = new PcDescriptorsRefElement.created();

View file

@ -26,18 +26,18 @@ enum _SortingField { externalSize, peer, finalizerCallback }
enum _SortingDirection { ascending, descending }
class PersistentHandlesPageElement extends CustomElement implements Renderable {
RenderingScheduler<PersistentHandlesPageElement> _r;
late RenderingScheduler<PersistentHandlesPageElement> _r;
Stream<RenderedEvent<PersistentHandlesPageElement>> get onRendered =>
_r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.PersistentHandlesRepository _repository;
M.ObjectRepository _objects;
M.PersistentHandles _handles;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.PersistentHandlesRepository _repository;
late M.ObjectRepository _objects;
M.PersistentHandles? _handles;
_SortingField _sortingField = _SortingField.externalSize;
_SortingDirection _sortingDirection = _SortingDirection.descending;
@ -52,7 +52,7 @@ class PersistentHandlesPageElement extends CustomElement implements Renderable {
M.NotificationRepository notifications,
M.PersistentHandlesRepository repository,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -102,19 +102,19 @@ class PersistentHandlesPageElement extends CustomElement implements Renderable {
])
]
..addAll(_createHandlers('Persistent Handles',
_handles?.elements?.toList(), _createLine, _updateLine))
_handles?.elements.toList(), _createLine, _updateLine))
..add(new BRElement())
..addAll(_createHandlers(
'Weak Persistent Handles',
_handles == null
? null
: (_handles.weakElements.toList()..sort(_createSorter())),
: (_handles!.weakElements.toList()..sort(_createSorter())),
_createWeakLine,
_updateWeakLine,
createHeader: _createWeakHeader));
}
List<Element> _createHandlers(String name, List items, create, update,
List<Element> _createHandlers(String name, List? items, create, update,
{createHeader}) {
return [
new DivElement()

View file

@ -19,17 +19,17 @@ import 'package:observatory/src/elements/nav/vm_menu.dart';
import 'package:observatory/src/elements/view_footer.dart';
class PortsElement extends CustomElement implements Renderable {
RenderingScheduler<PortsElement> _r;
late RenderingScheduler<PortsElement> _r;
Stream<RenderedEvent<PortsElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.IsolateRef _isolate;
M.EventRepository _events;
M.NotificationRepository _notifications;
M.PortsRepository _ports;
M.ObjectRepository _objects;
M.Ports _isolatePorts;
late M.VM _vm;
late M.IsolateRef _isolate;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
late M.PortsRepository _ports;
late M.ObjectRepository _objects;
M.Ports? _isolatePorts;
M.IsolateRef get isolate => _isolate;
M.NotificationRepository get notifications => _notifications;
@ -43,7 +43,7 @@ class PortsElement extends CustomElement implements Renderable {
M.NotificationRepository notifications,
M.PortsRepository ports,
M.ObjectRepository objects,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(isolate != null);
assert(events != null);
@ -64,7 +64,7 @@ class PortsElement extends CustomElement implements Renderable {
PortsElement.created() : super.created('ports-page');
int get portCount {
return _isolatePorts == null ? 0 : _isolatePorts.elements.length;
return _isolatePorts == null ? 0 : _isolatePorts!.elements.length;
}
@override
@ -110,7 +110,7 @@ class PortsElement extends CustomElement implements Renderable {
return const [];
}
int i = 0;
return _isolatePorts.elements
return _isolatePorts!.elements
.map<Element>((port) => new DivElement()
..classes = ['memberItem']
..children = <Element>[

View file

@ -44,24 +44,24 @@ class ProcessItemTreeMap extends NormalTreeMap<Map> {
}
class ProcessSnapshotElement extends CustomElement implements Renderable {
RenderingScheduler<ProcessSnapshotElement> _r;
late RenderingScheduler<ProcessSnapshotElement> _r;
Stream<RenderedEvent<ProcessSnapshotElement>> get onRendered => _r.onRendered;
M.VM _vm;
M.EventRepository _events;
M.NotificationRepository _notifications;
late M.VM _vm;
late M.EventRepository _events;
late M.NotificationRepository _notifications;
M.NotificationRepository get notifications => _notifications;
M.VMRef get vm => _vm;
List<Map> _loadedSnapshots = <Map>[];
Map selection;
Map _snapshotA;
Map _snapshotB;
Map? selection;
Map? _snapshotA;
Map? _snapshotB;
factory ProcessSnapshotElement(
M.VM vm, M.EventRepository events, M.NotificationRepository notifications,
{RenderingQueue queue}) {
{RenderingQueue? queue}) {
assert(vm != null);
assert(events != null);
assert(notifications != null);
@ -145,10 +145,10 @@ class ProcessSnapshotElement extends CustomElement implements Renderable {
input.type = 'file';
input.multiple = false;
input.onChange.listen((event) {
var file = input.files[0];
var file = input.files![0];
var reader = new FileReader();
reader.onLoad.listen((event) async {
_snapshotLoaded(jsonDecode(reader.result));
_snapshotLoaded(jsonDecode(reader.result as String));
});
reader.readAsText(file);
});
@ -224,7 +224,7 @@ class ProcessSnapshotElement extends CustomElement implements Renderable {
],
];
if (selection == null) {
selection = _snapshotA["root"];
selection = _snapshotA!["root"];
}
_createTreeMap(report, new ProcessItemTreeMap(this), selection);
return report;

Some files were not shown because too many files have changed in this diff Show more