util: show symbol properties
authorVladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
Wed, 7 Jan 2015 21:54:25 +0000 (00:54 +0300)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 8 Jan 2015 10:20:15 +0000 (11:20 +0100)
Properties with symbol names are shown if option `showHidden` of `util.inspect`
or `console.dir` is `true`.

PR-URL: https://github.com/iojs/io.js/pull/247
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rod Vagg <rod@vagg.org>
doc/api/console.markdown
doc/api/util.markdown
lib/util.js
test/parallel/test-util-inspect.js

index 5ce3418..a42a391 100644 (file)
@@ -52,8 +52,8 @@ Uses `util.inspect` on `obj` and prints resulting string to stdout. This functio
 bypasses any custom `inspect()` function on `obj`. An optional *options* object
 may be passed that alters certain aspects of the formatted string:
 
-- `showHidden` - if `true` then the object's non-enumerable properties will be
-shown too. Defaults to `false`.
+- `showHidden` - if `true` then the object's non-enumerable and symbol
+properties will be shown too. Defaults to `false`.
 
 - `depth` - tells `inspect` how many times to recurse while formatting the
 object. This is useful for inspecting large complicated objects. Defaults to
index 4166062..ef62f96 100644 (file)
@@ -88,8 +88,8 @@ Return a string representation of `object`, which is useful for debugging.
 An optional *options* object may be passed that alters certain aspects of the
 formatted string:
 
- - `showHidden` - if `true` then the object's non-enumerable properties will be
-   shown too. Defaults to `false`.
+ - `showHidden` - if `true` then the object's non-enumerable and symbol
+   properties will be shown too. Defaults to `false`.
 
  - `depth` - tells `inspect` how many times to recurse while formatting the
    object. This is useful for inspecting large complicated objects. Defaults to
index 4fed831..c022f6f 100644 (file)
@@ -240,6 +240,7 @@ function formatValue(ctx, value, recurseTimes) {
 
   if (ctx.showHidden) {
     keys = Object.getOwnPropertyNames(value);
+    keys = keys.concat(Object.getOwnPropertySymbols(value));
   }
 
   // This could be a boxed primitive (new String(), etc.), check valueOf()
@@ -422,7 +423,7 @@ function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
     }
   }
   keys.forEach(function(key) {
-    if (!key.match(/^\d+$/)) {
+    if (isSymbol(key) || !key.match(/^\d+$/)) {
       output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
           key, true));
     }
@@ -446,7 +447,11 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
     }
   }
   if (!hasOwnProperty(visibleKeys, key)) {
-    name = '[' + key + ']';
+    if (isSymbol(key)) {
+      name = '[' + ctx.stylize(key.toString(), 'symbol') + ']';
+    } else {
+      name = '[' + key + ']';
+    }
   }
   if (!str) {
     if (ctx.seen.indexOf(desc.value) < 0) {
index 2a7c2c4..4a6cde9 100644 (file)
@@ -243,4 +243,19 @@ if (typeof Symbol !== 'undefined') {
   assert.equal(util.inspect(Symbol('hi')), 'Symbol(hi)');
   assert.equal(util.inspect([Symbol()]), '[ Symbol() ]');
   assert.equal(util.inspect({ foo: Symbol() }), '{ foo: Symbol() }');
+
+  var options = { showHidden: true };
+  var subject = {};
+
+  subject[Symbol('symbol')] = 42;
+
+  assert.equal(util.inspect(subject), '{}');
+  assert.equal(util.inspect(subject, options), '{ [Symbol(symbol)]: 42 }');
+
+  subject = [1, 2, 3];
+  subject[Symbol('symbol')] = 42;
+
+  assert.equal(util.inspect(subject), '[ 1, 2, 3 ]');
+  assert.equal(util.inspect(subject, options), '[ 1, 2, 3, [length]: 3, [Symbol(symbol)]: 42 ]');
+
 }