| Index: tool/input_sdk/private/debugger.dart
|
| diff --git a/tool/input_sdk/private/debugger.dart b/tool/input_sdk/private/debugger.dart
|
| index 43d553d2e171c45c9bb0fcb2f113a4915d396d16..975ad5eed40fec8fec195adfc616e45de7b5ae69 100644
|
| --- a/tool/input_sdk/private/debugger.dart
|
| +++ b/tool/input_sdk/private/debugger.dart
|
| @@ -10,12 +10,17 @@ import 'dart:core';
|
| import 'dart:collection';
|
| import 'dart:html' as html;
|
|
|
| -/// Config object to pass to devtools to signal that an object should not be
|
| +/// Config String to pass to devtools to signal that an object should not be
|
| /// formatted by the Dart formatter. This is used to specify that an Object
|
| /// should just be displayed using the regular JavaScript view instead of a
|
| /// custom Dart view. For example, this is used to display the JavaScript view
|
| /// of a Dart Function as a child of the regular Function object.
|
| -const skipDartConfig = const Object();
|
| +const skipDartConfig = "skipDartConfig";
|
| +
|
| +/// Config String to pass to devtools to signal that a map key object should
|
| +/// have its toString() displayed by the Dart formatter.
|
| +const keyToStringConfig = "keyToStringConfig";
|
| +
|
| final int maxIterableChildrenToDisplay = 50;
|
|
|
| var _devtoolsFormatter = new JsonMLFormatter(new DartFormatter());
|
| @@ -85,8 +90,9 @@ bool hasMethod(object, String name) {
|
|
|
| /// [JsonMLFormatter] consumes [NameValuePair] objects and
|
| class NameValuePair {
|
| - NameValuePair({this.name, this.value, bool skipDart})
|
| - : skipDart = skipDart == true;
|
| + NameValuePair({this.name, this.value, bool skipDart, bool keyToString})
|
| + : skipDart = skipDart == true,
|
| + keyToString = keyToString == true;
|
|
|
| // Define equality and hashCode so that NameValuePair can be used
|
| // in a Set to dedupe entries with duplicate names.
|
| @@ -96,12 +102,13 @@ class NameValuePair {
|
| final String name;
|
| final Object value;
|
| final bool skipDart;
|
| + final bool keyToString;
|
| }
|
|
|
| class MapEntry {
|
| MapEntry({this.key, this.value});
|
|
|
| - final String key;
|
| + final Object key;
|
| final Object value;
|
| }
|
|
|
| @@ -200,6 +207,10 @@ class JsonMLFormatter {
|
| var c = _simpleFormatter.preview(object);
|
| if (c == null) return null;
|
|
|
| + if (identical(config, keyToStringConfig)) {
|
| + c = object.toString();
|
| + }
|
| +
|
| // Indicate this is a Dart Object by using a Dart background color.
|
| // This is stylistically a bit ugly but it eases distinguishing Dart and
|
| // JS objects.
|
| @@ -233,6 +244,9 @@ class JsonMLFormatter {
|
| if (child.skipDart) {
|
| objectTag.addAttribute('config', skipDartConfig);
|
| }
|
| + if (child.keyToString) {
|
| + objectTag.addAttribute('config', keyToStringConfig);
|
| + }
|
| if (!_simpleFormatter.hasChildren(child.value)) {
|
| li.setStyle("padding-left: 13px;");
|
| }
|
| @@ -561,7 +575,7 @@ class MapEntryFormatter implements Formatter {
|
| bool hasChildren(object) => true;
|
|
|
| List<NameValuePair> children(object) => <NameValuePair>[
|
| - new NameValuePair(name: 'key', value: object.key),
|
| + new NameValuePair(name: 'key', value: object.key, keyToString: true),
|
| new NameValuePair(name: 'value', value: object.value)
|
| ];
|
| }
|
|
|