Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: lib/runtime/dart/_debugger.js

Issue 1625563002: Use the great new Devtools API for custom formatters. Now Dart objects are now generally as easy to… (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 dart_library.library('dart/_debugger', null, /* Imports */[
skybrian 2016/01/22 21:45:21 Readability: it's kind of a large chunk of code wi
2 'dart/_runtime',
3 'dart/core'
4 ], /* Lazy imports */[
5 ], function(exports, dart, core) {
6 'use strict';
7 let dartx = dart.dartx;
8 const SKIP_DART_CONFIG = dart.const(new core.Object());
9 exports.MAX_ITERABLE_CHILDREN_TO_DISPLAY = 50;
10 dart.defineLazyProperties(exports, {
11 get _devtoolsFormatter() {
12 return new JsonMLFormatter(new DartFormatter());
13 },
14 set _devtoolsFormatter(_) {}
15 });
16 function typeof$(object) {
17 return typeof object;
18 }
19 dart.fn(typeof$, core.String, [dart.dynamic]);
20 function instanceof$(object, clazz) {
21 return object instanceof clazz;
22 }
23 dart.fn(instanceof$, core.bool, [dart.dynamic, dart.dynamic]);
24 function getOwnPropertyNames(object) {
25 return dart.as(dart.list(Object.getOwnPropertyNames(object), core.String), c ore.List$(core.String));
26 }
27 dart.fn(getOwnPropertyNames, core.List$(core.String), [dart.dynamic]);
28 function getOwnPropertySymbols(object) {
29 return Object.getOwnPropertySymbols(object);
30 }
31 dart.fn(getOwnPropertySymbols, core.List, [dart.dynamic]);
32 class JSNative extends core.Object {
33 static getProperty(object, name) {
34 return object[name];
35 }
36 static setProperty(object, name, value) {
37 return object[name] = value;
38 }
39 }
40 dart.setSignature(JSNative, {
41 statics: () => ({
42 getProperty: [dart.dynamic, [dart.dynamic, dart.dynamic]],
43 setProperty: [dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic]]
44 }),
45 names: ['getProperty', 'setProperty']
46 });
47 function isRegularDartObject(object) {
48 if (typeof$(object) == 'function') return false;
49 return instanceof$(object, core.Object);
50 }
51 dart.fn(isRegularDartObject, core.bool, [dart.dynamic]);
52 function getObjectTypeName(object) {
53 let realRuntimeType = dart.realRuntimeType(object);
54 if (realRuntimeType == null) {
55 if (typeof$(object) == 'function') {
56 return '[[Raw JavaScript Function]]';
57 }
58 return '<Error getting type name>';
59 }
60 return getTypeName(dart.as(realRuntimeType, core.Type));
61 }
62 dart.fn(getObjectTypeName, core.String, [dart.dynamic]);
63 function getTypeName(type) {
64 let name = dart.typeName(type);
65 if (dart.equals(name, 'JSArray<dynamic>') || dart.equals(name, 'JSObject<Arr ay>')) return 'List<dynamic>';
66 return dart.as(name, core.String);
67 }
68 dart.fn(getTypeName, core.String, [core.Type]);
69 const _simpleFormatter = Symbol('_simpleFormatter');
70 function safePreview(object) {
71 try {
72 let preview = exports._devtoolsFormatter[_simpleFormatter].preview(object) ;
73 if (preview != null) return preview;
74 return dart.toString(object);
75 } catch (e) {
76 return '<Exception thrown>';
77 }
78
79 }
80 dart.fn(safePreview, core.String, [dart.dynamic]);
81 function symbolName(symbol) {
82 let name = dart.toString(symbol);
83 dart.assert(name[dartx.startsWith]('Symbol('));
84 return name[dartx.substring]('Symbol('[dartx.length], dart.notNull(name[dart x.length]) - 1);
85 }
86 dart.fn(symbolName, core.String, [dart.dynamic]);
87 function hasMethod(object, name) {
88 try {
89 return dart.as(dart.hasMethod(object, name), core.bool);
90 } catch (e) {
91 return false;
92 }
93
94 }
95 dart.fn(hasMethod, core.bool, [dart.dynamic, core.String]);
96 class NameValuePair extends core.Object {
97 NameValuePair(opts) {
98 let name = opts && 'name' in opts ? opts.name : null;
99 let value = opts && 'value' in opts ? opts.value : null;
100 let skipDart = opts && 'skipDart' in opts ? opts.skipDart : null;
101 this.name = name;
102 this.value = value;
103 this.skipDart = null;
104 this.skipDart = dart.equals(skipDart, true);
105 }
106 }
107 dart.setSignature(NameValuePair, {
108 constructors: () => ({NameValuePair: [NameValuePair, [], {name: core.String, value: dart.dynamic, skipDart: dart.dynamic}]})
109 });
110 class MapEntry extends core.Object {
111 MapEntry(opts) {
112 let key = opts && 'key' in opts ? opts.key : null;
113 let value = opts && 'value' in opts ? opts.value : null;
114 this.key = key;
115 this.value = value;
116 }
117 }
118 dart.setSignature(MapEntry, {
119 constructors: () => ({MapEntry: [MapEntry, [], {key: core.String, value: dar t.dynamic}]})
120 });
121 class ClassMetadata extends core.Object {
122 ClassMetadata(object) {
123 this.object = object;
124 }
125 }
126 dart.setSignature(ClassMetadata, {
127 constructors: () => ({ClassMetadata: [ClassMetadata, [dart.dynamic]]})
128 });
129 class HeritageClause extends core.Object {
130 HeritageClause(name, types) {
131 this.name = name;
132 this.types = types;
133 }
134 }
135 dart.setSignature(HeritageClause, {
136 constructors: () => ({HeritageClause: [HeritageClause, [core.String, core.Li st]]})
137 });
138 const _attributes = Symbol('_attributes');
139 const _jsonML = Symbol('_jsonML');
140 class JsonMLElement extends core.Object {
141 JsonMLElement(tagName) {
142 this[_attributes] = null;
143 this[_jsonML] = null;
144 this[_attributes] = {};
145 this[_jsonML] = [tagName, this[_attributes]];
146 }
147 appendChild(element) {
148 this[_jsonML][dartx.add](dart.dsend(element, 'toJsonML'));
149 }
150 createChild(tagName) {
151 let c = new JsonMLElement(tagName);
152 this[_jsonML][dartx.add](c.toJsonML());
153 return c;
154 }
155 createObjectTag(object) {
156 return (() => {
157 let _ = this.createChild('object');
158 _.addAttribute('object', object);
159 return _;
160 }).bind(this)();
161 }
162 setStyle(style) {
163 dart.dput(this[_attributes], 'style', style);
164 }
165 addStyle(style) {
166 if (dart.dload(this[_attributes], 'style') == null) {
167 dart.dput(this[_attributes], 'style', style);
168 } else {
169 let o = this[_attributes];
170 dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', style));
171 }
172 }
173 addAttribute(key, value) {
174 JSNative.setProperty(this[_attributes], key, value);
175 }
176 createTextChild(text) {
177 this[_jsonML][dartx.add](text);
178 }
179 toJsonML() {
180 return this[_jsonML];
181 }
182 }
183 dart.setSignature(JsonMLElement, {
184 constructors: () => ({JsonMLElement: [JsonMLElement, [dart.dynamic]]}),
185 methods: () => ({
186 appendChild: [dart.dynamic, [dart.dynamic]],
187 createChild: [JsonMLElement, [core.String]],
188 createObjectTag: [JsonMLElement, [dart.dynamic]],
189 setStyle: [dart.void, [core.String]],
190 addStyle: [dart.dynamic, [core.String]],
191 addAttribute: [dart.dynamic, [dart.dynamic, dart.dynamic]],
192 createTextChild: [dart.dynamic, [core.String]],
193 toJsonML: [dart.dynamic, []]
194 })
195 });
196 class JsonMLFormatter extends core.Object {
197 JsonMLFormatter(simpleFormatter) {
198 this[_simpleFormatter] = simpleFormatter;
199 }
200 header(object, config) {
201 if (dart.notNull(core.identical(config, SKIP_DART_CONFIG))) return null;
202 let c = this[_simpleFormatter].preview(object);
203 if (c == null) return null;
204 let element = new JsonMLElement('span');
205 element.setStyle('background-color: #d9edf7');
206 element.createTextChild(c);
207 return element.toJsonML();
208 }
209 hasBody(object) {
210 return this[_simpleFormatter].hasChildren(object);
211 }
212 body(object) {
213 let body = new JsonMLElement('ol');
214 body.setStyle('list-style-type:none;' + 'padding-left: 0px;' + 'margin-top : 0px;' + 'margin-bottom: 0px;' + 'margin-left: 12px');
215 let children = this[_simpleFormatter].children(object);
216 for (let child of children) {
217 let li = body.createChild('li');
218 let nameSpan = new JsonMLElement('span');
219 nameSpan.createTextChild(child.name != null ? dart.notNull(child.name) + ': ' : '');
220 nameSpan.setStyle('color: rgb(136, 19, 145);');
221 if (typeof$(child.value) == 'object' || typeof$(child.value) == 'functio n') {
222 nameSpan.addStyle("padding-left: 13px;");
223 li.appendChild(nameSpan);
224 let objectTag = li.createObjectTag(child.value);
225 if (dart.notNull(child.skipDart)) {
226 objectTag.addAttribute('config', SKIP_DART_CONFIG);
227 }
228 if (!dart.notNull(this[_simpleFormatter].hasChildren(child.value))) {
229 li.setStyle("padding-left: 13px;");
230 }
231 } else {
232 li.setStyle("padding-left: 13px;");
233 let _ = li.createChild('span');
234 _.appendChild(nameSpan);
235 _.createTextChild(safePreview(child.value));
236 }
237 }
238 return body.toJsonML();
239 }
240 }
241 dart.setSignature(JsonMLFormatter, {
242 constructors: () => ({JsonMLFormatter: [JsonMLFormatter, [DartFormatter]]}),
243 methods: () => ({
244 header: [dart.dynamic, [dart.dynamic, dart.dynamic]],
245 hasBody: [core.bool, [dart.dynamic]],
246 body: [dart.dynamic, [dart.dynamic]]
247 })
248 });
249 class Formatter extends core.Object {}
250 const _formatters = Symbol('_formatters');
251 class DartFormatter extends core.Object {
252 DartFormatter() {
253 this[_formatters] = null;
254 this[_formatters] = dart.list([new FunctionFormatter(), new MapFormatter() , new IterableFormatter(), new MapEntryFormatter(), new ClassMetadataFormatter() , new HeritageClauseFormatter(), new ObjectFormatter()], Formatter);
255 }
256 preview(object) {
257 if (object == null) return 'null';
258 if (typeof object == 'number') return dart.toString(object);
259 if (typeof object == 'string') return `"${object}"`;
260 for (let formatter of this[_formatters]) {
261 if (dart.notNull(formatter.accept(object))) return formatter.preview(obj ect);
262 }
263 return null;
264 }
265 hasChildren(object) {
266 if (object == null) return false;
267 for (let formatter of this[_formatters]) {
268 if (dart.notNull(formatter.accept(object))) return formatter.hasChildren (object);
269 }
270 return false;
271 }
272 children(object) {
273 if (object != null) {
274 for (let formatter of this[_formatters]) {
275 if (dart.notNull(formatter.accept(object))) return formatter.children( object);
276 }
277 }
278 return dart.list([], NameValuePair);
279 }
280 }
281 dart.setSignature(DartFormatter, {
282 constructors: () => ({DartFormatter: [DartFormatter, []]}),
283 methods: () => ({
284 preview: [core.String, [dart.dynamic]],
285 hasChildren: [core.bool, [dart.dynamic]],
286 children: [core.List$(NameValuePair), [dart.dynamic]]
287 })
288 });
289 const _addMembers = Symbol('_addMembers');
290 class ObjectFormatter extends Formatter {
291 accept(object) {
292 return isRegularDartObject(object);
293 }
294 preview(object) {
295 return getObjectTypeName(object);
296 }
297 hasChildren(object) {
298 return true;
299 }
300 [_addMembers](current, object, properties) {
301 let className = dart.dload(dart.realRuntimeType(current), 'name');
302 for (let name of getOwnPropertyNames(current)) {
303 if (name == 'constructor' || name == '__proto__' || dart.equals(name, cl assName)) continue;
304 if (dart.notNull(hasMethod(object, name))) {
305 continue;
306 }
307 let value = null;
308 try {
309 value = JSNative.getProperty(object, name);
310 } catch (e) {
311 value = '<Exception thrown>';
312 }
313
314 properties[dartx.add](new NameValuePair({name: name, value: value}));
315 }
316 for (let symbol of getOwnPropertySymbols(current)) {
317 let dartName = symbolName(symbol);
318 if (dart.notNull(hasMethod(object, dartName))) {
319 continue;
320 }
321 let value = null;
322 try {
323 value = JSNative.getProperty(object, symbol);
324 } catch (e) {
325 value = '<Exception thrown>';
326 }
327
328 properties[dartx.add](new NameValuePair({name: dartName, value: value})) ;
329 }
330 let base = JSNative.getProperty(current, '__proto__');
331 if (base == null) return;
332 if (dart.notNull(isRegularDartObject(base))) {
333 this[_addMembers](base, object, properties);
334 }
335 }
336 children(object) {
337 let properties = dart.list([], NameValuePair);
338 this.addMetadataChildren(object, properties);
339 this[_addMembers](object, object, properties);
340 return properties;
341 }
342 addMetadataChildren(object, ret) {
343 ret[dartx.add](new NameValuePair({name: '[[class]]', value: new ClassMetad ata(object)}));
344 }
345 }
346 dart.setSignature(ObjectFormatter, {
347 methods: () => ({
348 accept: [core.bool, [dart.dynamic]],
349 preview: [core.String, [dart.dynamic]],
350 hasChildren: [core.bool, [dart.dynamic]],
351 [_addMembers]: [dart.dynamic, [dart.dynamic, dart.dynamic, core.List$(Name ValuePair)]],
352 children: [core.List$(NameValuePair), [dart.dynamic]],
353 addMetadataChildren: [dart.dynamic, [dart.dynamic, core.List$(NameValuePai r)]]
354 })
355 });
356 class FunctionFormatter extends Formatter {
357 accept(object) {
358 if (typeof$(object) != 'function') return false;
359 return dart.realRuntimeType(object) != null;
360 }
361 hasChildren(object) {
362 return true;
363 }
364 preview(object) {
365 return dart.as(dart.typeName(dart.realRuntimeType(object)), core.String);
366 }
367 children(object) {
368 return dart.list([new NameValuePair({name: 'signature', value: this.previe w(object)}), new NameValuePair({name: 'JavaScript Function', value: object, skip Dart: true})], NameValuePair);
369 }
370 }
371 dart.setSignature(FunctionFormatter, {
372 methods: () => ({
373 accept: [core.bool, [dart.dynamic]],
374 hasChildren: [core.bool, [dart.dynamic]],
375 preview: [core.String, [dart.dynamic]],
376 children: [core.List$(NameValuePair), [dart.dynamic]]
377 })
378 });
379 class MapFormatter extends ObjectFormatter {
380 accept(object) {
381 return dart.is(object, core.Map);
382 }
383 hasChildren(object) {
384 return true;
385 }
386 preview(object) {
387 let map = dart.as(object, core.Map);
388 return `${getObjectTypeName(map)} length ${map.length}`;
389 }
390 children(object) {
391 let map = dart.as(object, core.Map);
392 let keys = map.keys[dartx.toList]();
393 let entries = dart.list([], NameValuePair);
394 map.forEach(dart.fn((key, value) => {
395 let entryWrapper = new MapEntry({key: dart.as(key, core.String), value: value});
396 entries[dartx.add](new NameValuePair({name: dart.toString(entries[dartx. length]), value: entryWrapper}));
397 }, dart.void, [dart.dynamic, dart.dynamic]));
398 this.addMetadataChildren(object, entries);
399 return entries;
400 }
401 }
402 class IterableFormatter extends ObjectFormatter {
403 accept(object) {
404 return dart.is(object, core.Iterable);
405 }
406 preview(object) {
407 let iterable = dart.as(object, core.Iterable);
408 try {
409 let length = iterable[dartx.length];
410 return `${getObjectTypeName(iterable)} length ${length}`;
411 } catch (_) {
412 return `${getObjectTypeName(iterable)}`;
413 }
414
415 }
416 hasChildren(object) {
417 return true;
418 }
419 children(object) {
420 let iterable = dart.as(object, core.Iterable);
421 let ret = dart.list([], NameValuePair);
422 let i = 0;
423 for (let entry of iterable) {
424 if (dart.notNull(i) > dart.notNull(exports.MAX_ITERABLE_CHILDREN_TO_DISP LAY)) {
425 ret[dartx.add](new NameValuePair({name: 'Warning', value: 'Truncated I terable display'}));
426 break;
427 }
428 ret[dartx.add](new NameValuePair({name: dart.toString(i), value: entry}) );
429 i = dart.notNull(i) + 1;
430 }
431 this.addMetadataChildren(object, ret);
432 return ret;
433 }
434 }
435 const _getType = Symbol('_getType');
436 class ClassMetadataFormatter extends core.Object {
437 accept(object) {
438 return dart.is(object, ClassMetadata);
439 }
440 [_getType](object) {
441 if (dart.is(object, core.Type)) return object;
442 return dart.realRuntimeType(object);
443 }
444 preview(object) {
445 let entry = dart.as(object, ClassMetadata);
446 return getTypeName(dart.as(this[_getType](entry.object), core.Type));
447 }
448 hasChildren(object) {
449 return true;
450 }
451 children(object) {
452 let entry = dart.as(object, ClassMetadata);
453 let type = this[_getType](entry.object);
454 let ret = dart.list([], NameValuePair);
455 let implements$ = dart.getImplements(type);
456 if (implements$ != null) {
457 ret[dartx.add](new NameValuePair({name: '[[Implements]]', value: new Her itageClause('implements', dart.as(dart.dcall(implements$), core.List))}));
458 }
459 let mixins = dart.getMixins(type);
460 if (mixins != null) {
461 ret[dartx.add](new NameValuePair({name: '[[Mixins]]', value: new Heritag eClause('mixins', dart.as(dart.dcall(mixins), core.List))}));
462 }
463 ret[dartx.add](new NameValuePair({name: '[[JavaScript View]]', value: entr y.object, skipDart: true}));
464 if (!dart.is(entry.object, core.Type)) {
465 ret[dartx.add](new NameValuePair({name: '[[JavaScript Constructor]]', va lue: JSNative.getProperty(entry.object, 'constructor'), skipDart: true}));
466 }
467 return ret;
468 }
469 }
470 ClassMetadataFormatter[dart.implements] = () => [Formatter];
471 dart.setSignature(ClassMetadataFormatter, {
472 methods: () => ({
473 accept: [core.bool, [dart.dynamic]],
474 [_getType]: [dart.dynamic, [dart.dynamic]],
475 preview: [core.String, [dart.dynamic]],
476 hasChildren: [core.bool, [dart.dynamic]],
477 children: [core.List$(NameValuePair), [dart.dynamic]]
478 })
479 });
480 class MapEntryFormatter extends core.Object {
481 accept(object) {
482 return dart.is(object, MapEntry);
483 }
484 preview(object) {
485 let entry = dart.as(object, MapEntry);
486 return `${safePreview(entry.key)} => ${safePreview(entry.value)}`;
487 }
488 hasChildren(object) {
489 return true;
490 }
491 children(object) {
492 return dart.list([new NameValuePair({name: 'key', value: dart.dload(object , 'key')}), new NameValuePair({name: 'value', value: dart.dload(object, 'value') })], NameValuePair);
493 }
494 }
495 MapEntryFormatter[dart.implements] = () => [Formatter];
496 dart.setSignature(MapEntryFormatter, {
497 methods: () => ({
498 accept: [core.bool, [dart.dynamic]],
499 preview: [core.String, [dart.dynamic]],
500 hasChildren: [core.bool, [dart.dynamic]],
501 children: [core.List$(NameValuePair), [dart.dynamic]]
502 })
503 });
504 class HeritageClauseFormatter extends core.Object {
505 accept(object) {
506 return dart.is(object, HeritageClause);
507 }
508 preview(object) {
509 let clause = dart.as(object, HeritageClause);
510 return `${clause.name} ${clause.types[dartx.map](dart.fn(type => getTypeNa me(dart.as(type, core.Type)), core.String, [dart.dynamic]))[dartx.join](", ")}`;
511 }
512 hasChildren(object) {
513 return true;
514 }
515 children(object) {
516 let clause = dart.as(object, HeritageClause);
517 let ret = dart.list([], NameValuePair);
518 for (let type of clause.types) {
519 ret[dartx.add](new NameValuePair({value: new ClassMetadata(type)}));
520 }
521 return ret;
522 }
523 }
524 HeritageClauseFormatter[dart.implements] = () => [Formatter];
525 dart.setSignature(HeritageClauseFormatter, {
526 methods: () => ({
527 accept: [core.bool, [dart.dynamic]],
528 preview: [core.String, [dart.dynamic]],
529 hasChildren: [core.bool, [dart.dynamic]],
530 children: [core.List$(NameValuePair), [dart.dynamic]]
531 })
532 });
533 function registerDevtoolsFormatter() {
534 let formatters = [exports._devtoolsFormatter];
535 window.devtoolsFormatters = formatters;
536 }
537 dart.fn(registerDevtoolsFormatter);
538 // Exports:
539 exports.SKIP_DART_CONFIG = SKIP_DART_CONFIG;
540 exports.typeof = typeof$;
541 exports.instanceof = instanceof$;
542 exports.getOwnPropertyNames = getOwnPropertyNames;
543 exports.getOwnPropertySymbols = getOwnPropertySymbols;
544 exports.JSNative = JSNative;
545 exports.isRegularDartObject = isRegularDartObject;
546 exports.getObjectTypeName = getObjectTypeName;
547 exports.getTypeName = getTypeName;
548 exports.safePreview = safePreview;
549 exports.symbolName = symbolName;
550 exports.hasMethod = hasMethod;
551 exports.NameValuePair = NameValuePair;
552 exports.MapEntry = MapEntry;
553 exports.ClassMetadata = ClassMetadata;
554 exports.HeritageClause = HeritageClause;
555 exports.JsonMLElement = JsonMLElement;
556 exports.JsonMLFormatter = JsonMLFormatter;
557 exports.Formatter = Formatter;
558 exports.DartFormatter = DartFormatter;
559 exports.ObjectFormatter = ObjectFormatter;
560 exports.FunctionFormatter = FunctionFormatter;
561 exports.MapFormatter = MapFormatter;
562 exports.IterableFormatter = IterableFormatter;
563 exports.ClassMetadataFormatter = ClassMetadataFormatter;
564 exports.MapEntryFormatter = MapEntryFormatter;
565 exports.HeritageClauseFormatter = HeritageClauseFormatter;
566 exports.registerDevtoolsFormatter = registerDevtoolsFormatter;
567 });
OLDNEW
« no previous file with comments | « no previous file | lib/runtime/dart/_runtime.js » ('j') | tool/input_sdk/lib/_internal/libraries.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698