repl: support non-array `.scope`, document it
authorYazhong Liu <yorkiefixer@gmail.com>
Tue, 12 May 2015 08:00:35 +0000 (16:00 +0800)
committerFedor Indutny <fedor@indutny.com>
Sun, 17 May 2015 10:22:26 +0000 (12:22 +0200)
REPL evaluate `.scope` when it needs to get a list of the variable names
available in the current scope. Do not throw if the output of such
evaluation is not array, just ignore it.

PR-URL: https://github.com/nodejs/io.js/pull/1682
Reviewed-By: Fedor Indutny <fedor@indutny.com>
doc/api/repl.markdown
lib/repl.js
test/parallel/test-repl-tab.js [new file with mode: 0644]

index 18722b9..99cef9f 100644 (file)
@@ -90,6 +90,9 @@ You can use your own `eval` function if it has following signature:
       callback(null, result);
     }
 
+On tab completion - `eval` will be called with `.scope` as an input string. It
+is expected to return an array of scope names to be used for the auto-completion.
+
 Multiple REPLs may be started against the same running instance of io.js.  Each
 will share the same global object but will have unique I/O.
 
@@ -232,4 +235,5 @@ The following key combinations in the REPL have these special effects:
   - `<ctrl>C` - Similar to the `.break` keyword.  Terminates the current
     command.  Press twice on a blank line to forcibly exit.
   - `<ctrl>D` - Similar to the `.exit` keyword.
+  - `<tab>` - Show both global and local(scope) variables
 
index fae6dc4..7d2a77a 100644 (file)
@@ -624,7 +624,7 @@ REPLServer.prototype.complete = function(line, callback) {
           completionGroupsLoaded();
         } else {
           this.eval('.scope', this.context, 'repl', function(err, globals) {
-            if (err || !globals) {
+            if (err || !globals || !Array.isArray(globals)) {
               addStandardGlobals(completionGroups, filter);
             } else if (Array.isArray(globals[0])) {
               // Add grouped globals
diff --git a/test/parallel/test-repl-tab.js b/test/parallel/test-repl-tab.js
new file mode 100644 (file)
index 0000000..79d3c63
--- /dev/null
@@ -0,0 +1,18 @@
+var assert = require('assert');
+var util = require('util');
+var repl = require('repl');
+var zlib = require('zlib');
+
+// just use builtin stream inherited from Duplex
+var putIn = zlib.createGzip();
+var testMe = repl.start('', putIn, function(cmd, context, filename, callback) {
+  callback(null, cmd);
+});
+
+testMe._domain.on('error', function (e) {
+  assert.fail();
+});
+
+testMe.complete('', function(err, results) {
+  assert.equal(err, null);
+});