Chromium Code Reviews| Index: corelib/src/implementation/maps.dart |
| =================================================================== |
| --- corelib/src/implementation/maps.dart (revision 3809) |
| +++ corelib/src/implementation/maps.dart (working copy) |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| +// Copyright (c) 2012, 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. |
| @@ -59,4 +59,55 @@ |
| static int length(Map map) => map.getKeys().length; |
| static bool isEmpty(Map map) => length(map) == 0; |
| + |
| + /** |
| + * Returns a string representing the specified map. The returned string |
| + * looks like this: [:"{key0: value0, key1: value1, ... keyN: valueN}":]. |
| + * The value returned by its [toString] method is used to represent each |
| + * key or value. |
| + * |
| + * If the map collection contains a reference to itself, either |
| + * directly as a key or value, or indirectly through other collections |
| + * or maps, the contained reference is rendered as [:"{...}":]. This |
| + * prevents the infinite regress that would otherwise occur. So, for example, |
| + * calling this method on a map whose sole entry maps the string key "me" |
| + * to a reference to the map would return [:"{me: {...}}":]. |
| + * |
| + * A typical implementation of a map's [toString] method will |
| + * simply return the results of this method applied to the collection. |
| + */ |
| + static String mapToString(Map m) { |
| + var result = new StringBuffer(); |
| + _emitMap(m, result, new List()); |
| + return result.toString(); |
| + } |
| + |
| + /** |
| + * Appends a string representing the specified map to the specified |
| + * string buffer. The string is formatted as per [mapToString]. |
| + * The [:visiting:] list contains references to all of the enclosing |
| + * collections and maps (which are currently in the process of being |
| + * emitted into [:result:]). The [:visiting:] parameter allows this method |
| + * to generate a [:"[...]":] or [:"{...}":] where required. In other words, |
| + * it allows this method and [_emitCollection] to identify recursive maps |
| + * and collections. |
| + */ |
| + static void _emitMap(Map m, StringBuffer result, List visiting) { |
| + visiting.add(m); |
| + result.add("{"); |
|
Bob Nystrom
2012/02/06 18:23:17
Either way is OK, but we generally default to sing
jjb
2012/02/06 19:10:03
Interesting! This is the opposite of what I'm use
Bob Nystrom
2012/02/06 20:37:12
I think so. We find that we very frequently have H
Ivan Posva
2012/02/15 09:54:10
I think the choice is really personal preference.
|
| + |
| + bool first = true; |
| + m.forEach((k, v) { |
| + if (!first) { |
| + result.add(", "); |
| + } |
| + first = false; |
| + Collections._emitObject(k, result, visiting); |
| + result.add(": "); |
| + Collections._emitObject(v, result, visiting); |
| + }); |
| + |
| + result.add("}"); |
| + visiting.removeLast(); |
| + } |
| } |