From 446c70c6c3367565dafbcb98431442391eddd725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Sat, 23 Jan 2021 20:06:01 -0500 Subject: [PATCH] fix: avoid line breaks between class members head and key (#12653) --- .../babel-generator/src/generators/classes.js | 8 +++++++ .../input.js | 23 +++++++++++++++++++ .../options.json | 1 + .../output.js | 22 ++++++++++++++++++ .../accessor-with-retainlines/input.js | 7 ++++++ .../accessor-with-retainlines/output.js | 8 +++++++ .../async-method-with-retainlines/input.js | 9 ++++++++ .../async-method-with-retainlines/output.js | 8 +++++++ .../{private-props => }/options.json | 0 9 files changed, 86 insertions(+) create mode 100644 packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/input.js create mode 100644 packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/options.json create mode 100644 packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/output.js create mode 100644 packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/input.js create mode 100644 packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/output.js create mode 100644 packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/input.js create mode 100644 packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/output.js rename packages/babel-generator/test/fixtures/decorators/{private-props => }/options.json (100%) diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index db0288e08310..e08fc35ef53f 100644 --- a/packages/babel-generator/src/generators/classes.js +++ b/packages/babel-generator/src/generators/classes.js @@ -71,6 +71,11 @@ export function ClassBody(node: Object) { export function ClassProperty(node: Object) { this.printJoin(node.decorators, node); + + // catch up to property key, avoid line break + // between member modifiers and the property key. + this.source("end", node.key.loc); + this.tsPrintClassMemberModifiers(node, /* isField */ true); if (node.computed) { @@ -131,6 +136,9 @@ export function ClassPrivateMethod(node: Object) { export function _classMethodHead(node) { this.printJoin(node.decorators, node); + // catch up to method key, avoid line break + // between member modifiers/method heads and the method key. + this.source("end", node.key.loc); this.tsPrintClassMemberModifiers(node, /* isField */ false); this._methodHead(node); } diff --git a/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/input.js b/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/input.js new file mode 100644 index 000000000000..35591df838ca --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/input.js @@ -0,0 +1,23 @@ +class A { + @decorate + public p = "p" + + @decorate + public m() {} + + @decorate + private set s + (v) {} + + @decorate + public [ + cp + ] + = "cp" + + @decorate + private [ + cm + ] + () {} +} diff --git a/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/options.json b/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/options.json new file mode 100644 index 000000000000..ab2bf8d8c808 --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/options.json @@ -0,0 +1 @@ +{ "plugins": ["classProperties", "decorators-legacy", "typescript"], "decoratorsBeforeExport": true, "retainLines": true } diff --git a/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/output.js b/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/output.js new file mode 100644 index 000000000000..cd301a712d47 --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators-legacy/ts-class-modifier-with-retainlines/output.js @@ -0,0 +1,22 @@ +class A { + @decorate + public p = "p"; + + @decorate + public m() {} + + @decorate + private set s( + v) {} + + @decorate + + public [cp] = + + "cp"; + + @decorate + + private [cm]() + + {}} diff --git a/packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/input.js b/packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/input.js new file mode 100644 index 000000000000..65b568b5bef1 --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/input.js @@ -0,0 +1,7 @@ +class C { + @dec + get a() {} + + @dec + set a(v) {} +} diff --git a/packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/output.js b/packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/output.js new file mode 100644 index 000000000000..95f37461cd8d --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators/accessor-with-retainlines/output.js @@ -0,0 +1,8 @@ +class C { + @dec + get a() {} + + @dec + set a(v) {} + +} \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/input.js b/packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/input.js new file mode 100644 index 000000000000..601185646eb0 --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/input.js @@ -0,0 +1,9 @@ +class C { + @dec + async a() {} + + @dec + async * + a(v) {} + +} diff --git a/packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/output.js b/packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/output.js new file mode 100644 index 000000000000..e6bc0b905ee6 --- /dev/null +++ b/packages/babel-generator/test/fixtures/decorators/async-method-with-retainlines/output.js @@ -0,0 +1,8 @@ +class C { + @dec + async a() {} + + @dec + async *a(v) {} + +} \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/decorators/private-props/options.json b/packages/babel-generator/test/fixtures/decorators/options.json similarity index 100% rename from packages/babel-generator/test/fixtures/decorators/private-props/options.json rename to packages/babel-generator/test/fixtures/decorators/options.json