repl: attach location info to syntax errors
authorcjihrig <cjihrig@gmail.com>
Wed, 25 Nov 2015 00:55:51 +0000 (19:55 -0500)
committerMyles Borins <mborins@us.ibm.com>
Tue, 19 Jan 2016 19:52:29 +0000 (11:52 -0800)
Currently, when a file with a syntax error is imported in the
REPL, no information is provided on the error's location. This
commit adds the error's location to the stack trace.

Refs: https://github.com/nodejs/node/issues/2762
Refs: https://github.com/nodejs/node/issues/3411
Refs: https://github.com/nodejs/node/issues/3784
PR-URL: https://github.com/nodejs/node/pull/4013
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
lib/repl.js
test/parallel/test-repl-syntax-error-stack.js [new file with mode: 0644]

index 4fe50f3..0d82a84 100644 (file)
@@ -274,6 +274,7 @@ function REPLServer(prompt,
   self._domain.on('error', function(e) {
     debug('domain error');
     const top = replMap.get(self);
+    util.decorateErrorStack(e);
     top.outputStream.write((e.stack || e) + '\n');
     top.lineParser.reset();
     top.bufferedCommand = '';
diff --git a/test/parallel/test-repl-syntax-error-stack.js b/test/parallel/test-repl-syntax-error-stack.js
new file mode 100644 (file)
index 0000000..573059e
--- /dev/null
@@ -0,0 +1,39 @@
+'use strict';
+
+const common = require('../common');
+const assert = require('assert');
+const path = require('path');
+const repl = require('repl');
+const util = require('util');
+let found = false;
+
+process.on('exit', () => {
+  assert.strictEqual(found, true);
+});
+
+// A stream to push an array into a REPL
+function ArrayStream() {
+  this.run = function(data) {
+    data.forEach(line => {
+      this.emit('data', line + '\n');
+    });
+  };
+}
+util.inherits(ArrayStream, require('stream').Stream);
+ArrayStream.prototype.readable = true;
+ArrayStream.prototype.writable = true;
+ArrayStream.prototype.resume = function() {};
+ArrayStream.prototype.write = function(output) {
+  if (/var foo bar;/.test(output))
+    found = true;
+};
+
+const putIn = new ArrayStream();
+const testMe = repl.start('', putIn);
+let file = path.resolve(__dirname, '../fixtures/syntax/bad_syntax');
+
+if (common.isWindows)
+  file = file.replace(/\\/g, '\\\\');
+
+putIn.run(['.clear']);
+putIn.run([`require('${file}');`]);