diff --git a/rewrite-javascript/rewrite/src/javascript/format.ts b/rewrite-javascript/rewrite/src/javascript/format.ts index 50e921db5c..b20a874455 100644 --- a/rewrite-javascript/rewrite/src/javascript/format.ts +++ b/rewrite-javascript/rewrite/src/javascript/format.ts @@ -15,7 +15,7 @@ */ import {JS} from "./tree"; import {JavaScriptVisitor} from "./visitor"; -import {Comment, emptySpace, J, Statement} from "../java"; +import {Comment, J, Statement} from "../java"; import {Draft, produce} from "immer"; import {Cursor, isScope, Tree} from "../tree"; import { @@ -445,6 +445,10 @@ export class SpacesVisitor
extends JavaScriptVisitor
{
}
protected async visitVariable(variable: J.VariableDeclarations.NamedVariable, p: P): Promise extends JavaScriptVisitor {
});
return super.visit(cu, p, cursor);
}
- if (tree.kind === J.Kind.MethodDeclaration) {
+ if (tree.kind === JS.Kind.StatementExpression && (tree as JS.StatementExpression).statement.kind == J.Kind.MethodDeclaration) {
+ tree = produce(tree as JS.StatementExpression, draft => {
+ this.ensurePrefixHasNewLine(draft);
+ });
+ } else if (tree.kind === J.Kind.MethodDeclaration && this.cursor.value.kind != JS.Kind.StatementExpression) {
tree = produce(tree as J.MethodDeclaration, draft => {
this.ensurePrefixHasNewLine(draft);
});
@@ -1149,7 +1157,7 @@ export class TabsAndIndentsVisitor extends JavaScriptVisitor {
let indentShouldIncrease =
tree.kind === J.Kind.Block
|| this.cursor.parent?.parent?.parent?.value.kind == J.Kind.Case
- || (tree.kind === J.Kind.MethodDeclaration && this.cursor.parent?.value.kind === JS.Kind.StatementExpression);
+ || (tree.kind === JS.Kind.StatementExpression && (tree as JS.StatementExpression).statement.kind == J.Kind.MethodDeclaration);
const previousIndent = this.currentIndent;
diff --git a/rewrite-javascript/rewrite/src/javascript/parser.ts b/rewrite-javascript/rewrite/src/javascript/parser.ts
index 7992dc89e4..1cd27f10a2 100644
--- a/rewrite-javascript/rewrite/src/javascript/parser.ts
+++ b/rewrite-javascript/rewrite/src/javascript/parser.ts
@@ -3131,12 +3131,15 @@ export class JavaScriptParserVisitor {
}
visitFunctionExpression(node: ts.FunctionExpression): JS.StatementExpression {
+ const delegate = this.mapFunctionDeclaration(node);
return {
kind: JS.Kind.StatementExpression,
id: randomId(),
- prefix: emptySpace,
+ prefix: delegate.prefix,
markers: emptyMarkers,
- statement: this.mapFunctionDeclaration(node)
+ statement: produce(delegate, draft => {
+ draft.prefix = emptySpace;
+ })
};
}
diff --git a/rewrite-javascript/rewrite/test/javascript/format/format.test.ts b/rewrite-javascript/rewrite/test/javascript/format/format.test.ts
index 148bba6147..9171c4b07d 100644
--- a/rewrite-javascript/rewrite/test/javascript/format/format.test.ts
+++ b/rewrite-javascript/rewrite/test/javascript/format/format.test.ts
@@ -192,9 +192,8 @@ describe('AutoformatVisitor', () => {
//language=typescript
typescript(
`const fn = function () {return 99;};`,
- // TODO the space after `const fn=` is excessive
`
- const fn =
+ const fn =
function () {
return 99;
};
diff --git a/rewrite-javascript/rewrite/test/javascript/parser/variable-declarations.test.ts b/rewrite-javascript/rewrite/test/javascript/parser/variable-declarations.test.ts
index ef85ddd9f7..3b2218f301 100644
--- a/rewrite-javascript/rewrite/test/javascript/parser/variable-declarations.test.ts
+++ b/rewrite-javascript/rewrite/test/javascript/parser/variable-declarations.test.ts
@@ -252,4 +252,23 @@ describe('variable declaration mapping', () => {
}
`)
));
+
+ test.each([
+ "const c = function(): number { return 116; };",
+ "const c = 136;",
+ "const c = (1 > 0) ? 116 : 119;"
+ ])('double space: %s', (code) =>
+ spec.rewriteRun({
+ //language=javascript
+ ...typescript(code),
+ afterRecipe: (cu: JS.CompilationUnit) => {
+ expect(cu.statements).toHaveLength(1);
+ cu.statements.forEach(statement => {
+ const varDecl = statement.element as J.VariableDeclarations;
+ const initializer = varDecl.variables[0].element.initializer!;
+ expect(initializer.before.whitespace).toBe(" ");
+ expect(initializer.element.prefix.whitespace).toBe(" ");
+ });
+ }
+ }));
});