diff --git a/package.json b/package.json index 8021745dcce3..6a7b33d1ab24 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "dependencies": { "@angular/compiler": "10.0.14", "@babel/code-frame": "7.10.4", - "@babel/parser": "7.11.2", + "@babel/parser": "7.11.5", "@glimmer/syntax": "0.60.0", "@iarna/toml": "2.2.5", "@typescript-eslint/typescript-estree": "3.10.1", diff --git a/src/language-js/parser-babel.js b/src/language-js/parser-babel.js index 563e8bb89b3b..8f43d5af634d 100644 --- a/src/language-js/parser-babel.js +++ b/src/language-js/parser-babel.js @@ -1,6 +1,5 @@ "use strict"; -const { ErrorMessages } = require("@babel/parser/lib/parser/error-message"); const createError = require("../common/parser-create-error"); const { getNextNonSpaceNonCommentCharacterIndexWithStartIndex, @@ -165,10 +164,15 @@ function tryCombinations(fn, combinations) { } const messagesShouldThrow = new Set([ - // `TSErrors.UnexpectedTypeAnnotation` not exported + // TSErrors.UnexpectedTypeAnnotation // https://github.com/babel/babel/blob/008fe25ae22e78288fbc637d41069bb4a1040987/packages/babel-parser/src/plugins/typescript/index.js#L95 "Did not expect a type annotation here.", - ErrorMessages.ModuleAttributeDifferentFromType, + // ErrorMessages.ModuleAttributeDifferentFromType + // https://github.com/babel/babel/blob/a023b6456cac4505096028f91c5b78829955bfc2/packages/babel-parser/src/parser/error-message.js#L92 + "The only accepted module attribute is `type`", + // FlowErrors.UnexpectedTypeParameterBeforeAsyncArrowFunction + // https://github.com/babel/babel/blob/a023b6456cac4505096028f91c5b78829955bfc2/packages/babel-parser/src/plugins/flow.js#L118 + "Type parameters must come after the async keyword, e.g. instead of ` async () => {}`, use `async () => {}`", ]); function shouldRethrow(error) { diff --git a/src/language-js/printer-estree.js b/src/language-js/printer-estree.js index 66f2e0f348d9..74c78b6a7105 100644 --- a/src/language-js/printer-estree.js +++ b/src/language-js/printer-estree.js @@ -3682,15 +3682,17 @@ function printMethod(path, options, print) { if (value.async) { parts.push("async "); } - if (value.generator) { - parts.push("*"); - } } else { assert.ok(kind === "get" || kind === "set"); parts.push(kind, " "); } + // A `getter`/`setter` can't be a generator, but it's recoverable + if (value.generator) { + parts.push("*"); + } + parts.push( printPropertyKey(path, options, print), node.optional || node.key.optional ? "?" : "", diff --git a/tests/js/objects/__snapshots__/jsfmt.spec.js.snap b/tests/js/objects/__snapshots__/jsfmt.spec.js.snap index d0fb29c1f3be..fe84e6fa3470 100644 --- a/tests/js/objects/__snapshots__/jsfmt.spec.js.snap +++ b/tests/js/objects/__snapshots__/jsfmt.spec.js.snap @@ -113,6 +113,36 @@ const a3 = { ================================================================================ `; +exports[`invalid-accessor-generator.js format 1`] = ` +====================================options===================================== +parsers: ["babel"] +printWidth: 80 + | printWidth +=====================================input====================================== +// Invalid, but recoverable +// https://github.com/babel/babel/pull/11921/ + +({ + get *iterator() { }, + set *iterator(iter) { }, + get iterator2() { }, + set iterator2(iter) { }, +}); + +=====================================output===================================== +// Invalid, but recoverable +// https://github.com/babel/babel/pull/11921/ + +({ + get *iterator() {}, + set *iterator(iter) {}, + get iterator2() {}, + set iterator2(iter) {}, +}); + +================================================================================ +`; + exports[`method.js format 1`] = ` ====================================options===================================== parsers: ["babel"] @@ -165,7 +195,7 @@ group( ================================================================================ `; -exports[`right_break.js format 1`] = ` +exports[`right-break.js format 1`] = ` ====================================options===================================== parsers: ["babel"] printWidth: 80 diff --git a/tests/js/objects/invalid-accessor-generator.js b/tests/js/objects/invalid-accessor-generator.js new file mode 100644 index 000000000000..80f40624b4b4 --- /dev/null +++ b/tests/js/objects/invalid-accessor-generator.js @@ -0,0 +1,9 @@ +// Invalid, but recoverable +// https://github.com/babel/babel/pull/11921/ + +({ + get *iterator() { }, + set *iterator(iter) { }, + get iterator2() { }, + set iterator2(iter) { }, +}); diff --git a/tests/js/objects/right_break.js b/tests/js/objects/right-break.js similarity index 100% rename from tests/js/objects/right_break.js rename to tests/js/objects/right-break.js diff --git a/tests/misc/errors/babel-flow/__snapshots__/jsfmt.spec.js.snap b/tests/misc/errors/babel-flow/__snapshots__/jsfmt.spec.js.snap new file mode 100644 index 000000000000..d3842ea9e109 --- /dev/null +++ b/tests/misc/errors/babel-flow/__snapshots__/jsfmt.spec.js.snap @@ -0,0 +1,19 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`async-arrow-invalid.js error test 1`] = ` +"Type parameters must come after the async keyword, e.g. instead of \` async (3:1) + 1 | // https://github.com/babel/babel/pull/11979 + 2 | +> 3 | async () => {} + | ^ + 4 | " +`; + +exports[`async-arrow-invalid.js error test 2`] = ` +"Type parameters must come after the async keyword, e.g. instead of \` async (3:1) + 1 | // https://github.com/babel/babel/pull/11979 + 2 | +> 3 | async () => {} + | ^ + 4 | " +`; diff --git a/tests/misc/errors/babel-flow/async-arrow-invalid.js b/tests/misc/errors/babel-flow/async-arrow-invalid.js new file mode 100644 index 000000000000..00642f400118 --- /dev/null +++ b/tests/misc/errors/babel-flow/async-arrow-invalid.js @@ -0,0 +1,3 @@ +// https://github.com/babel/babel/pull/11979 + + async () => {} diff --git a/tests/misc/errors/babel-flow/jsfmt.spec.js b/tests/misc/errors/babel-flow/jsfmt.spec.js new file mode 100644 index 000000000000..2ecb070a2e5f --- /dev/null +++ b/tests/misc/errors/babel-flow/jsfmt.spec.js @@ -0,0 +1,2 @@ +run_spec(__dirname, ["babel-flow"]); +run_spec(__dirname, ["babel"]); diff --git a/tests/misc/errors/flow/__snapshots__/jsfmt.spec.js.snap b/tests/misc/errors/flow/__snapshots__/jsfmt.spec.js.snap index 9389c007d8f4..1055035e425e 100644 --- a/tests/misc/errors/flow/__snapshots__/jsfmt.spec.js.snap +++ b/tests/misc/errors/flow/__snapshots__/jsfmt.spec.js.snap @@ -1,5 +1,13 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`async-arrow-invalid.js error test 1`] = ` +"Unexpected token ILLEGAL (4:1) + 2 | + 3 | async () => {} +> 4 | + | ^" +`; + exports[`default-escaped.js error test 1`] = ` "Unexpected identifier, expected the token \`{\` (1:8) > 1 | export asyn\\\\u{63} from \\"async\\"; diff --git a/tests/misc/errors/flow/async-arrow-invalid.js b/tests/misc/errors/flow/async-arrow-invalid.js new file mode 100644 index 000000000000..00642f400118 --- /dev/null +++ b/tests/misc/errors/flow/async-arrow-invalid.js @@ -0,0 +1,3 @@ +// https://github.com/babel/babel/pull/11979 + + async () => {} diff --git a/tests/misc/errors/js/__snapshots__/jsfmt.spec.js.snap b/tests/misc/errors/js/__snapshots__/jsfmt.spec.js.snap index d5b7068fa497..02535f581236 100644 --- a/tests/misc/errors/js/__snapshots__/jsfmt.spec.js.snap +++ b/tests/misc/errors/js/__snapshots__/jsfmt.spec.js.snap @@ -18,6 +18,15 @@ exports[`module-attributes.js error test 1`] = ` 2 | " `; +exports[`no-for-in-init-concise-binary-in.js error test 1`] = ` +"Unexpected token, expected \\")\\" (3:18) + 1 | // https://github.com/babel/babel/pull/11931 + 2 | +> 3 | for (() => x in y;;); + | ^ + 4 | " +`; + exports[`partial-template-strings.js error test 1`] = ` "Unexpected token (6:42) 4 | diff --git a/tests/misc/errors/js/no-for-in-init-concise-binary-in.js b/tests/misc/errors/js/no-for-in-init-concise-binary-in.js new file mode 100644 index 000000000000..a5ede557702f --- /dev/null +++ b/tests/misc/errors/js/no-for-in-init-concise-binary-in.js @@ -0,0 +1,3 @@ +// https://github.com/babel/babel/pull/11931 + +for (() => x in y;;); diff --git a/yarn.lock b/yarn.lock index d0b16b69860e..f3a41c1f2940 100644 --- a/yarn.lock +++ b/yarn.lock @@ -279,10 +279,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@7.11.2": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.2.tgz#0882ab8a455df3065ea2dcb4c753b2460a24bead" - integrity sha512-Vuj/+7vLo6l1Vi7uuO+1ngCDNeVmNbTngcJFKCR/oEtz8tKz0CJxZEGmPt9KcIloZhOZ3Zit6xbpXT2MDlS9Vw== +"@babel/parser@7.11.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.5.tgz#c7ff6303df71080ec7a4f5b8c003c58f1cf51037" + integrity sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q== "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.11.5": version "7.11.5"