diff --git a/tests/config/format-test/failed-format-tests.js b/tests/config/format-test/failed-format-tests.js index 48a1afc79..5a4835af1 100644 --- a/tests/config/format-test/failed-format-tests.js +++ b/tests/config/format-test/failed-format-tests.js @@ -58,7 +58,11 @@ const disabledTests = new Map( oxc: [], "oxc-ts": [], yuku: ["js/await/await-with-parens.js"], - "yuku-ts": ["js/await/await-with-parens.js"], + "yuku-ts": [ + "js/await/await-with-parens.js", + "js/decorators/rest-parameters/constructor.js", + "js/decorators/rest-parameters/method.js", + ], hermes: [ "js/await/like-call.js", // Different result "jsx/top-level-await/test.jsx", diff --git a/tests/format/js/decorators/rest-parameters/__snapshots__/format.test.js.snap b/tests/format/js/decorators/rest-parameters/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..1699a7737 --- /dev/null +++ b/tests/format/js/decorators/rest-parameters/__snapshots__/format.test.js.snap @@ -0,0 +1,370 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`constructor.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] + printWidth: 80 (default) | +=====================================input====================================== +class C { + constructor(@decorator ...args) {} +} + +=====================================output===================================== +class C { + constructor(@decorator ...args) {} +} + +================================================================================ +`; + +exports[`constructor.js format[__babel_estree] 1`] = ` +"Unexpected token (2:26) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:25)" +`; + +exports[`constructor.js format[acorn] 1`] = ` +"Unexpected character '@' (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected character '@' (2:14)" +`; + +exports[`constructor.js format[babel] 1`] = ` +"Unexpected token (2:26) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:25)" +`; + +exports[`constructor.js format[babel-ts] 1`] = ` +"Unexpected token (2:26) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:25)" +`; + +exports[`constructor.js format[espree] 1`] = ` +"Unexpected character '@' (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected character '@'" +`; + +exports[`constructor.js format[flow] 1`] = ` +"Unexpected token \`@\`, expected an identifier (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token \`@\`, expected an identifier (2:14)" +`; + +exports[`constructor.js format[hermes] 1`] = ` +"identifier, '{' or '[' expected in binding pattern (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: identifier, '{' or '[' expected in binding pattern (2:14) + constructor(@decorator ...args) {} + ^" +`; + +exports[`constructor.js format[meriyah] 1`] = ` +"Expected ')' (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: [2:14-2:15]: Expected ')'" +`; + +exports[`constructor.js format[oxc] 1`] = ` +"Decorators are not valid here. (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^^^^^^^^^^ + 3 | } + 4 |" +`; + +exports[`constructor.js format[yuku] 1`] = ` +"Unexpected token '@' in binding pattern (2:15) + 1 | class C { +> 2 | constructor(@decorator ...args) {} + | ^ + 3 | } + 4 |" +`; + +exports[`method.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] + printWidth: 80 (default) | +=====================================input====================================== +class C { + method(@decorator ...args) {} +} + +=====================================output===================================== +class C { + method(@decorator ...args) {} +} + +================================================================================ +`; + +exports[`method.js format[__babel_estree] 1`] = ` +"Unexpected token (2:21) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:20)" +`; + +exports[`method.js format[acorn] 1`] = ` +"Unexpected character '@' (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected character '@' (2:9)" +`; + +exports[`method.js format[babel] 1`] = ` +"Unexpected token (2:21) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:20)" +`; + +exports[`method.js format[babel-ts] 1`] = ` +"Unexpected token (2:21) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:20)" +`; + +exports[`method.js format[espree] 1`] = ` +"Unexpected character '@' (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected character '@'" +`; + +exports[`method.js format[flow] 1`] = ` +"Unexpected token \`@\`, expected an identifier (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token \`@\`, expected an identifier (2:9)" +`; + +exports[`method.js format[hermes] 1`] = ` +"identifier, '{' or '[' expected in binding pattern (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: identifier, '{' or '[' expected in binding pattern (2:9) + method(@decorator ...args) {} + ^" +`; + +exports[`method.js format[meriyah] 1`] = ` +"Expected ')' (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: [2:9-2:10]: Expected ')'" +`; + +exports[`method.js format[oxc] 1`] = ` +"Decorators are not valid here. (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^^^^^^^^^^ + 3 | } + 4 |" +`; + +exports[`method.js format[yuku] 1`] = ` +"Unexpected token '@' in binding pattern (2:10) + 1 | class C { +> 2 | method(@decorator ...args) {} + | ^ + 3 | } + 4 |" +`; + +exports[`setter.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] + printWidth: 80 (default) | +=====================================input====================================== +class C { + set setter(@decorator ...args) {} +} + +=====================================output===================================== +class C { + set setter(@decorator ...args) {} +} + +================================================================================ +`; + +exports[`setter.js format[__babel_estree] 1`] = ` +"Unexpected token (2:25) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:24)" +`; + +exports[`setter.js format[acorn] 1`] = ` +"Unexpected character '@' (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected character '@' (2:13)" +`; + +exports[`setter.js format[babel] 1`] = ` +"Unexpected token (2:25) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:24)" +`; + +exports[`setter.js format[babel-ts] 1`] = ` +"Unexpected token (2:25) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token (2:24)" +`; + +exports[`setter.js format[espree] 1`] = ` +"Unexpected character '@' (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected character '@'" +`; + +exports[`setter.js format[flow] 1`] = ` +"Unexpected token \`@\`, expected an identifier (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: Unexpected token \`@\`, expected an identifier (2:13)" +`; + +exports[`setter.js format[hermes] 1`] = ` +"identifier, '{' or '[' expected in binding pattern (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: identifier, '{' or '[' expected in binding pattern (2:13) + set setter(@decorator ...args) {} + ^" +`; + +exports[`setter.js format[meriyah] 1`] = ` +"Expected ')' (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 | +Cause: [2:13-2:14]: Expected ')'" +`; + +exports[`setter.js format[oxc] 1`] = ` +"Decorators are not valid here. (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^^^^^^^^^^ + 3 | } + 4 |" +`; + +exports[`setter.js format[oxc-ts] 1`] = ` +"A 'set' accessor cannot have rest parameter. (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^^^^^^^^^^^^^^^^^^ + 3 | } + 4 |" +`; + +exports[`setter.js format[yuku] 1`] = ` +"Unexpected token '@' in binding pattern (2:14) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^ + 3 | } + 4 |" +`; + +exports[`setter.js format[yuku-ts] 1`] = ` +"Setter must have exactly one parameter (2:13) + 1 | class C { +> 2 | set setter(@decorator ...args) {} + | ^^^^^^^^^^^^^^^^^^^^ + 3 | } + 4 |" +`; diff --git a/tests/format/js/decorators/rest-parameters/constructor.js b/tests/format/js/decorators/rest-parameters/constructor.js new file mode 100644 index 000000000..b4c90884e --- /dev/null +++ b/tests/format/js/decorators/rest-parameters/constructor.js @@ -0,0 +1,3 @@ +class C { + constructor(@decorator ...args) {} +} diff --git a/tests/format/js/decorators/rest-parameters/format.test.js b/tests/format/js/decorators/rest-parameters/format.test.js new file mode 100644 index 000000000..56d841e0c --- /dev/null +++ b/tests/format/js/decorators/rest-parameters/format.test.js @@ -0,0 +1,16 @@ +runFormatTest(import.meta, ["babel", "flow", "typescript"], { + errors: { + babel: ["constructor.js", "method.js", "setter.js"], + flow: ["constructor.js", "method.js", "setter.js"], + acorn: ["constructor.js", "method.js", "setter.js"], + espree: ["constructor.js", "method.js", "setter.js"], + meriyah: ["constructor.js", "method.js", "setter.js"], + oxc: ["constructor.js", "method.js", "setter.js"], + "oxc-ts": ["setter.js"], + yuku: ["constructor.js", "method.js", "setter.js"], + "yuku-ts": ["setter.js"], + hermes: ["constructor.js", "method.js", "setter.js"], + "babel-ts": ["constructor.js", "method.js", "setter.js"], + __babel_estree: ["constructor.js", "method.js", "setter.js"], + }, +}); diff --git a/tests/format/js/decorators/rest-parameters/method.js b/tests/format/js/decorators/rest-parameters/method.js new file mode 100644 index 000000000..5a1954b04 --- /dev/null +++ b/tests/format/js/decorators/rest-parameters/method.js @@ -0,0 +1,3 @@ +class C { + method(@decorator ...args) {} +} diff --git a/tests/format/js/decorators/rest-parameters/setter.js b/tests/format/js/decorators/rest-parameters/setter.js new file mode 100644 index 000000000..d9bebc168 --- /dev/null +++ b/tests/format/js/decorators/rest-parameters/setter.js @@ -0,0 +1,3 @@ +class C { + set setter(@decorator ...args) {} +}