diff --git a/package.json b/package.json index b70f66e..7c8d2a6 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "andreas-talon", "displayName": "Andreas Talon", "description": "VSCode extension used by Talon Voice", - "version": "3.68.0", + "version": "3.68.1", "publisher": "AndreasArvidsson", "license": "MIT", "main": "./out/extension.js", diff --git a/src/language/TreeSitterFormatter.ts b/src/language/TreeSitterFormatter.ts index f5e4d30..e588b44 100644 --- a/src/language/TreeSitterFormatter.ts +++ b/src/language/TreeSitterFormatter.ts @@ -101,10 +101,10 @@ export class TreeSitterFormatter { private getNodeTextInternal(node: SyntaxNode, numIndents: number): string { switch (node.type) { case "program": - return node.children.map((n) => this.getNodeText(n, 0)).join("\n"); + return joinLines(node.children.map((n) => this.getNodeText(n, 0))); case "grouping": - return node.children.map((n) => this.getNodeText(n, numIndents + 1)).join("\n"); + return joinLines(node.children.map((n) => this.getNodeText(n, numIndents + 1))); case "list": return this.getListText(node, numIndents); @@ -158,3 +158,13 @@ export class TreeSitterFormatter { return length < 1 ? "" : new Array(length).fill(this.indentation).join(""); } } + +function joinLines(lines: string[]): string { + if (lines.length === 0) { + return ""; + } + if (lines[lines.length - 1] === "?") { + return lines.slice(0, -1).join("\n") + "?"; + } + return lines.join("\n"); +} diff --git a/src/test/treeSitterFormatter.test.ts b/src/test/treeSitterFormatter.test.ts index 7b5fdcb..a3b0d07 100644 --- a/src/test/treeSitterFormatter.test.ts +++ b/src/test/treeSitterFormatter.test.ts @@ -14,6 +14,18 @@ const fixtures: { title: string; pre: Content; post: Content }[] = [ pre: '";" ? @namedFunction.end @functionName.domain.end', post: '";"? @namedFunction.end @functionName.domain.end\n' }, + { + title: "Trailing ?", + pre: '(("." (type))?)?', + post: `\ +( + ( + "." + (type) + )? +)? +` + }, { title: "Large file", pre: `\