summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2019-04-24 23:56:35 +0200
committerRuben Bridgewater <ruben@bridgewater.de>2019-04-30 16:22:57 +0200
commite939b8f13b311fcc39d7806537a5c768f37bb0d0 (patch)
treec606d99962c7e0d84c25996a150d11dcf7a3a06f
parentf37e40af2b34990540337cfa2932650a584d413c (diff)
downloadandroid-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>
-rw-r--r--lib/internal/repl/utils.js72
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.