Skip to content

Commit

Permalink
repl: refine handling of illegal tokens
Browse files Browse the repository at this point in the history
Illegal tokens are only recoverable in string literals, RegExp literals,
and block comments. If not in one of these constructs, immediately
return an error rather than giving the user false hope by giving them a
chance to try to recover.

PR-URL: #7104
Fixes: #3611
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
  • Loading branch information
Trott committed Jun 4, 2016
1 parent ac0665c commit de0aa23
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
18 changes: 15 additions & 3 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -1154,6 +1154,11 @@ REPLServer.prototype.convertToContext = function(cmd) {
return cmd;
};

function bailOnIllegalToken(parser) {
return parser._literal === null &&
!parser.blockComment &&
!parser.regExpLiteral;
}

// If the error is that we've unexpectedly ended the input,
// then let the user try to recover by adding more input.
Expand All @@ -1166,9 +1171,16 @@ function isRecoverableError(e, self) {
return true;
}

return message.startsWith('Unexpected end of input') ||
message.startsWith('Unexpected token') ||
message.startsWith('missing ) after argument list');
if (message.startsWith('Unexpected end of input') ||
message.startsWith('missing ) after argument list'))
return true;

if (message.startsWith('Unexpected token')) {
if (message.includes('ILLEGAL') && bailOnIllegalToken(self.lineParser))
return false;
else
return true;
}
}
return false;
}
Expand Down
4 changes: 4 additions & 0 deletions test/parallel/test-repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,10 @@ function error_test() {
'undefined\n' + prompt_unix },
{ client: client_unix, send: '{ var x = 4; }',
expect: 'undefined\n' + prompt_unix },
// Illegal token is not recoverable outside string literal, RegExp literal,
// or block comment. https://github.com/nodejs/node/issues/3611
{ client: client_unix, send: 'a = 3.5e',
expect: /^SyntaxError: Unexpected token ILLEGAL/ },
]);
}

Expand Down

0 comments on commit de0aa23

Please sign in to comment.