diff --git a/packages/babel-generator/src/generators/classes.js b/packages/babel-generator/src/generators/classes.js index db0288e083..e08fc35ef5 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 0000000000..35591df838 --- /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 0000000000..ab2bf8d8c8 --- /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 0000000000..cd301a712d --- /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 0000000000..65b568b5be --- /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 0000000000..95f37461cd --- /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 0000000000..601185646e --- /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 0000000000..e6bc0b905e --- /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