blob: 27c270b3811097553c0b63b4cdf6509945a41943 [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library function_ref_element;
import 'dart:html';
import 'dart:async';
import 'package:observatory_2/models.dart' as M
show
IsolateRef,
FunctionRef,
isSyntheticFunction,
ClassRef,
ObjectRef,
getFunctionFullName;
import 'package:observatory_2/src/elements/class_ref.dart';
import 'package:observatory_2/src/elements/helpers/rendering_scheduler.dart';
import 'package:observatory_2/src/elements/helpers/custom_element.dart';
import 'package:observatory_2/src/elements/helpers/uris.dart';
class FunctionRefElement extends CustomElement implements Renderable {
RenderingScheduler<FunctionRefElement> _r;
Stream<RenderedEvent<FunctionRefElement>> get onRendered => _r.onRendered;
M.IsolateRef _isolate;
M.FunctionRef _function;
bool _qualified;
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}) {
assert(function != null);
assert(qualified != null);
FunctionRefElement e = new FunctionRefElement.created();
e._r = new RenderingScheduler<FunctionRefElement>(e, queue: queue);
e._isolate = isolate;
e._function = function;
e._qualified = qualified;
return e;
}
FunctionRefElement.created() : super.created('function-ref');
@override
void attached() {
super.attached();
_r.enable();
}
@override
void detached() {
super.detached();
children = <Element>[];
title = '';
_r.disable(notify: true);
}
void render() {
var content = <Element>[
new AnchorElement(
href: (M.isSyntheticFunction(_function.kind) || (_isolate == null))
? null
: Uris.inspect(_isolate, object: _function))
..text = _function.name
];
if (qualified) {
M.ObjectRef owner = _function.dartOwner;
while (owner is M.FunctionRef) {
M.FunctionRef function = (owner as M.FunctionRef);
content.addAll([
new SpanElement()..text = '.',
new AnchorElement(
href: (M.isSyntheticFunction(function.kind) || (_isolate == null))
? null
: Uris.inspect(_isolate, object: function))
..text = function.name
]);
owner = function.dartOwner;
}
if (owner is M.ClassRef) {
content.addAll([
new SpanElement()..text = '.',
new ClassRefElement(_isolate, owner, queue: _r.queue).element
]);
}
}
children = content.reversed.toList(growable: false);
title = M.getFunctionFullName(_function);
}
}