From 200c5bc694529a76abe51ce0c972b19dbbf28b31 Mon Sep 17 00:00:00 2001 From: tomasnyberg Date: Tue, 11 Mar 2025 14:11:28 +0100 Subject: [PATCH] Adds preservation of newlines between statements in formatter --- .../src/formatting/formatting.ts | 7 +- .../src/tests/formatting/linebreaks.test.ts | 65 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/packages/language-support/src/formatting/formatting.ts b/packages/language-support/src/formatting/formatting.ts index 7f516f255..663409dcf 100644 --- a/packages/language-support/src/formatting/formatting.ts +++ b/packages/language-support/src/formatting/formatting.ts @@ -290,16 +290,16 @@ export class TreePrintVisitor extends CypherCmdParserVisitor { throw new Error('Internal formatting error in findBottomChild'); }; - preserveExplicitNewlineAfter = (ctx: ParserRuleContext) => { + preserveExplicitNewlineAfter = (ctx: ParserRuleContext | TerminalNode) => { this.preserveExplicitNewline(ctx, 'after'); }; - preserveExplicitNewlineBefore = (ctx: ParserRuleContext) => { + preserveExplicitNewlineBefore = (ctx: ParserRuleContext | TerminalNode) => { this.preserveExplicitNewline(ctx, 'before'); }; preserveExplicitNewline = ( - ctx: ParserRuleContext, + ctx: ParserRuleContext | TerminalNode, side: 'before' | 'after', ) => { const bottomChild = this.getBottomChild(ctx, side); @@ -414,6 +414,7 @@ export class TreePrintVisitor extends CypherCmdParserVisitor { this.currentBuffer().pop(); } this.visit(ctx.SEMICOLON(i)); + this.preserveExplicitNewlineAfter(ctx.SEMICOLON(i)); } } }; diff --git a/packages/language-support/src/tests/formatting/linebreaks.test.ts b/packages/language-support/src/tests/formatting/linebreaks.test.ts index 2bb1dac10..ca631ef28 100644 --- a/packages/language-support/src/tests/formatting/linebreaks.test.ts +++ b/packages/language-support/src/tests/formatting/linebreaks.test.ts @@ -920,4 +920,69 @@ LIMIT 10`.trimStart(); const expected = query; verifyFormatting(query, expected); }); + + test('two statements', () => { + const query = ` +MATCH (n) + +RETURN n; + +MATCH (n) + +RETURN m;`; + const expected = query.trimStart(); + verifyFormatting(query, expected); + }); + + test('multiple statements with comments inbetween', () => { + const query = ` +MATCH (n) + +RETURN n; +// This is a comment + +MATCH (n) + +RETURN n; + +// This is another comment + +MATCH (n) +RETURN n;`; + const expected = query.trimStart(); + verifyFormatting(query, expected); + }); + + test('end of statement with multiple newlines', () => { + const query = ` +MATCH (n) +RETURN m; + + +`; + const expected = `MATCH (n) +RETURN m;`; + verifyFormatting(query, expected); + }); + + test('too many newlines between statements should truncate to one', () => { + const query = ` +MATCH (n) +RETURN n; + + + + + + +MATCH (n) +RETURN m;`; + const expected = ` +MATCH (n) +RETURN n; + +MATCH (n) +RETURN m;`.trimStart(); + verifyFormatting(query, expected); + }); });