Skip to content

Commit

Permalink
repl: make 'Unexpected token' errors recoverable
Browse files Browse the repository at this point in the history
Fix the regexp used to detect 'Unexpected token' errors so that they can
be considered as recoverable. This fixes the following use case:

> var foo = 'bar \
... baz';
undefined
> foo
'bar baz'
>

Fixes: nodejs/node-v0.x-archive#8874
PR-URL: nodejs/node-v0.x-archive#8875
PR-URL: nodejs#2052
Reviewed-By: Colin Ihrig <[email protected]>
Reviewed-By: Ben Noordhuis <[email protected]>
  • Loading branch information
Julien Gilli authored and mscdex committed Jul 9, 2015
1 parent 9d99dbe commit fb44dfb
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -994,7 +994,7 @@ function isRecoverableError(e, self) {
self._inTemplateLiteral = true;
return true;
}
return /^(Unexpected end of input|Unexpected token :)/.test(message);
return /^(Unexpected end of input|Unexpected token)/.test(message);
}
return false;
}
Expand Down
33 changes: 33 additions & 0 deletions test/parallel/test-repl-unexpected-token-recoverable.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict';
/*
* This is a regression test for https://github.com/joyent/node/issues/8874.
*/
var common = require('../common');
var assert = require('assert');

var spawn = require('child_process').spawn;
// use -i to force node into interactive mode, despite stdout not being a TTY
var args = [ '-i' ];
var child = spawn(process.execPath, args);

var input = 'var foo = "bar\\\nbaz"';
// Match '...' as well since it marks a multi-line statement
var expectOut = /^> ... undefined\n/;

child.stderr.setEncoding('utf8');
child.stderr.on('data', function(c) {
throw new Error('child.stderr be silent');
});

child.stdout.setEncoding('utf8');
var out = '';
child.stdout.on('data', function(c) {
out += c;
});

child.stdout.on('end', function() {
assert(expectOut.test(out));
console.log('ok');
});

child.stdin.end(input);

0 comments on commit fb44dfb

Please sign in to comment.