diff options
author | Ruben Bridgewater <ruben@bridgewater.de> | 2019-04-24 23:56:35 +0200 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2019-04-30 16:22:57 +0200 |
commit | e939b8f13b311fcc39d7806537a5c768f37bb0d0 (patch) | |
tree | c606d99962c7e0d84c25996a150d11dcf7a3a06f /lib/internal/repl/utils.js | |
parent | f37e40af2b34990540337cfa2932650a584d413c (diff) | |
download | android-node-v8-e939b8f13b311fcc39d7806537a5c768f37bb0d0.tar.gz android-node-v8-e939b8f13b311fcc39d7806537a5c768f37bb0d0.tar.bz2 android-node-v8-e939b8f13b311fcc39d7806537a5c768f37bb0d0.zip |
repl: handle stage-3 language features properly
This adds stage-3 language features to acorn so that the REPL is
able to parse these features properly. Otherwise these would cause
SyntaxErrors.
PR-URL: https://github.com/nodejs/node/pull/27400
Fixes: https://github.com/nodejs/node/issues/27391
Fixes: https://github.com/nodejs/node/issues/25835
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Michaƫl Zasso <targos@protonmail.com>
Diffstat (limited to 'lib/internal/repl/utils.js')
-rw-r--r-- | lib/internal/repl/utils.js | 72 |
1 files changed, 46 insertions, 26 deletions
diff --git a/lib/internal/repl/utils.js b/lib/internal/repl/utils.js index 6830ebb080..2ad78a8ab4 100644 --- a/lib/internal/repl/utils.js +++ b/lib/internal/repl/utils.js @@ -1,6 +1,15 @@ 'use strict'; const acorn = require('internal/deps/acorn/acorn/dist/acorn'); +const privateMethods = + require('internal/deps/acorn-plugins/acorn-private-methods/index'); +const bigInt = require('internal/deps/acorn-plugins/acorn-bigint/index'); +const classFields = + require('internal/deps/acorn-plugins/acorn-class-fields/index'); +const numericSeparator = + require('internal/deps/acorn-plugins/acorn-numeric-separator/index'); +const staticClassFeatures = + require('internal/deps/acorn-plugins/acorn-static-class-features/index'); const { tokTypes: tt, Parser: AcornParser } = acorn; // If the error is that we've unexpectedly ended the input, @@ -8,6 +17,12 @@ const { tokTypes: tt, Parser: AcornParser } = acorn; // Note: `e` (the original exception) is not used by the current implementation, // but may be needed in the future. function isRecoverableError(e, code) { + // For similar reasons as `defaultEval`, wrap expressions starting with a + // curly brace with parenthesis. Note: only the open parenthesis is added + // here as the point is to test for potentially valid but incomplete + // expressions. + if (/^\s*\{/.test(code) && isRecoverableError(e, `(${code}`)) return true; + let recoverable = false; // Determine if the point of any error raised is at the end of the input. @@ -26,34 +41,39 @@ function isRecoverableError(e, code) { // change these messages in the future, this will lead to a test // failure, indicating that this code needs to be updated. // - const RecoverableParser = AcornParser.extend((Parser) => { - return class extends Parser { - nextToken() { - super.nextToken(); - if (this.type === tt.eof) recoverable = true; - } - raise(pos, message) { - switch (message) { - case 'Unterminated template': - case 'Unterminated comment': - recoverable = true; - break; + const RecoverableParser = AcornParser + .extend( + privateMethods, + bigInt, + classFields, + numericSeparator, + staticClassFeatures, + (Parser) => { + return class extends Parser { + nextToken() { + super.nextToken(); + if (this.type === tt.eof) + recoverable = true; + } + raise(pos, message) { + switch (message) { + case 'Unterminated template': + case 'Unterminated comment': + recoverable = true; + break; - case 'Unterminated string constant': - const token = this.input.slice(this.lastTokStart, this.pos); - // See https://www.ecma-international.org/ecma-262/#sec-line-terminators - recoverable = /\\(?:\r\n?|\n|\u2028|\u2029)$/.test(token); - } - super.raise(pos, message); + case 'Unterminated string constant': + const token = this.input.slice(this.lastTokStart, this.pos); + // See https://www.ecma-international.org/ecma-262/#sec-line-terminators + if (/\\(?:\r\n?|\n|\u2028|\u2029)$/.test(token)) { + recoverable = true; + } + } + super.raise(pos, message); + } + }; } - }; - }); - - // For similar reasons as `defaultEval`, wrap expressions starting with a - // curly brace with parenthesis. Note: only the open parenthesis is added - // here as the point is to test for potentially valid but incomplete - // expressions. - if (/^\s*\{/.test(code) && isRecoverableError(e, `(${code}`)) return true; + ); // Try to parse the code with acorn. If the parse fails, ignore the acorn // error and return the recoverable status. |