From bb2c0e49e3132cf7eac4d9590558ce8f1981be1c Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Nov 2022 14:38:39 -0800 Subject: [PATCH 1/6] Fix selection and formatting for CDD. --- Extension/src/LanguageServer/client.ts | 37 +++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 0dcb41854..14d45ed11 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -3013,8 +3013,43 @@ export class DefaultClient implements Client { }; if (modifiedDocument && lastEdit) { await vscode.workspace.applyEdit(workspaceEdit); - const selectionRange: vscode.Range = lastEdit.range; // TODO: range should be the new range after text edit was applied. + + // Compute numNewlines for formatRange. + let numNewlines: number = 0; + for (let index: number = 0; index < lastEdit.newText.length; ++index) { + if (lastEdit.newText.charAt(index) === "\n") { + ++numNewlines; + } + } + + // Move the cursor to the new code, accounting for \n or \n\n at the start. + let selectionRange: vscode.Range = lastEdit.range; + if (lastEdit.newText.startsWith("\r\n\r\n") || lastEdit.newText.startsWith("\n\n")) { + selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 2, 0), new vscode.Position(selectionRange.start.line + 2, 0)); + numNewlines -= 2; + } else if (lastEdit.newText.startsWith("\r\n") || lastEdit.newText.startsWith("\n")) { + selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 1, 0), new vscode.Position(selectionRange.start.line + 1, 0)); + numNewlines -= 1; + } else { + selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line, 0), new vscode.Position(selectionRange.start.line, 0)); + } await vscode.window.showTextDocument(modifiedDocument, { selection: selectionRange }); + + // Run formatRange. + const formatEdits: vscode.WorkspaceEdit = new vscode.WorkspaceEdit(); + const formatRange: vscode.Range = new vscode.Range(selectionRange.start, new vscode.Position(selectionRange.start.line + numNewlines, 0)); + const settings: OtherSettings = new OtherSettings(vscode.workspace.getWorkspaceFolder(modifiedDocument)?.uri); + const formatOptions: vscode.FormattingOptions = { + insertSpaces: settings.editorInsertSpaces ?? true, + tabSize: settings.editorTabSize ?? 4 + } + const formatTextEdits: vscode.TextEdit[] | undefined = await vscode.commands.executeCommand("vscode.executeFormatRangeProvider", modifiedDocument, formatRange, formatOptions); + if (formatTextEdits && formatTextEdits.length > 0) { + formatEdits.set(modifiedDocument, formatTextEdits); + } + if (formatEdits.size > 0) { + await vscode.workspace.applyEdit(formatEdits); + } } } } From 2c04c3b12ed567bd837948ec58ff797a70346435 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Nov 2022 14:49:31 -0800 Subject: [PATCH 2/6] Minor change. --- Extension/src/LanguageServer/client.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 14d45ed11..42251a896 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -3023,15 +3023,13 @@ export class DefaultClient implements Client { } // Move the cursor to the new code, accounting for \n or \n\n at the start. - let selectionRange: vscode.Range = lastEdit.range; + let selectionRange: vscode.Range = new vscode.Range(new vscode.Position(lastEdit.range.start.line, 0), new vscode.Position(lastEdit.range.start.line, 0)); if (lastEdit.newText.startsWith("\r\n\r\n") || lastEdit.newText.startsWith("\n\n")) { selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 2, 0), new vscode.Position(selectionRange.start.line + 2, 0)); numNewlines -= 2; } else if (lastEdit.newText.startsWith("\r\n") || lastEdit.newText.startsWith("\n")) { selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 1, 0), new vscode.Position(selectionRange.start.line + 1, 0)); numNewlines -= 1; - } else { - selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line, 0), new vscode.Position(selectionRange.start.line, 0)); } await vscode.window.showTextDocument(modifiedDocument, { selection: selectionRange }); From 00052e888f258107509f9f5b7b811eecd423a15f Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Nov 2022 15:41:53 -0800 Subject: [PATCH 3/6] Fix multiple edit at the same spot case. --- Extension/src/LanguageServer/client.ts | 27 ++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 42251a896..48b1bc86b 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -2964,6 +2964,16 @@ export class DefaultClient implements Client { this.handleRemoveCodeAnalysisProblems(false, identifiersAndUris); } + private static countNewlines(text: string): number { + let numNewlines: number = 0; + for (let index: number = 0; index < text.length; ++index) { + if (text.charAt(index) === "\n") { + ++numNewlines; + } + } + return numNewlines; + } + public async handleCreateDeclarationOrDefinition(): Promise { let range: vscode.Range | undefined; let uri: vscode.Uri | undefined; @@ -3000,11 +3010,15 @@ export class DefaultClient implements Client { const workspaceEdit: vscode.WorkspaceEdit = new vscode.WorkspaceEdit(); let modifiedDocument: vscode.Uri | undefined; let lastEdit: vscode.TextEdit | undefined; + let numNewlinesFromPreviousEdits: number = 0; for (const file in result.changes) { const uri: vscode.Uri = vscode.Uri.file(file); const edits: vscode.TextEdit[] = []; for (const edit of result.changes[file]) { - const range: vscode.Range = makeVscodeRange(edit.range); + let range: vscode.Range = makeVscodeRange(edit.range); + if (lastEdit && lastEdit.range.isEqual(range)) { + numNewlinesFromPreviousEdits += DefaultClient.countNewlines(lastEdit.newText); + } lastEdit = new vscode.TextEdit(range, edit.newText); edits.push(lastEdit); } @@ -3013,17 +3027,10 @@ export class DefaultClient implements Client { }; if (modifiedDocument && lastEdit) { await vscode.workspace.applyEdit(workspaceEdit); - - // Compute numNewlines for formatRange. - let numNewlines: number = 0; - for (let index: number = 0; index < lastEdit.newText.length; ++index) { - if (lastEdit.newText.charAt(index) === "\n") { - ++numNewlines; - } - } + let numNewlines: number = DefaultClient.countNewlines(lastEdit.newText); // Move the cursor to the new code, accounting for \n or \n\n at the start. - let selectionRange: vscode.Range = new vscode.Range(new vscode.Position(lastEdit.range.start.line, 0), new vscode.Position(lastEdit.range.start.line, 0)); + let selectionRange: vscode.Range = new vscode.Range(new vscode.Position(lastEdit.range.start.line + numNewlinesFromPreviousEdits, 0), new vscode.Position(lastEdit.range.start.line + numNewlinesFromPreviousEdits, 0)); if (lastEdit.newText.startsWith("\r\n\r\n") || lastEdit.newText.startsWith("\n\n")) { selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 2, 0), new vscode.Position(selectionRange.start.line + 2, 0)); numNewlines -= 2; From 536ab4c8d74de442b303cf27179d9939c556a793 Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Mon, 21 Nov 2022 15:48:25 -0800 Subject: [PATCH 4/6] Fix linter issues. --- Extension/src/LanguageServer/client.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 48b1bc86b..24027af1f 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -3015,7 +3015,7 @@ export class DefaultClient implements Client { const uri: vscode.Uri = vscode.Uri.file(file); const edits: vscode.TextEdit[] = []; for (const edit of result.changes[file]) { - let range: vscode.Range = makeVscodeRange(edit.range); + const range: vscode.Range = makeVscodeRange(edit.range); if (lastEdit && lastEdit.range.isEqual(range)) { numNewlinesFromPreviousEdits += DefaultClient.countNewlines(lastEdit.newText); } @@ -3047,7 +3047,7 @@ export class DefaultClient implements Client { const formatOptions: vscode.FormattingOptions = { insertSpaces: settings.editorInsertSpaces ?? true, tabSize: settings.editorTabSize ?? 4 - } + }; const formatTextEdits: vscode.TextEdit[] | undefined = await vscode.commands.executeCommand("vscode.executeFormatRangeProvider", modifiedDocument, formatRange, formatOptions); if (formatTextEdits && formatTextEdits.length > 0) { formatEdits.set(modifiedDocument, formatTextEdits); From eb7a38918c27c624ce8a4e756ac5e5bf5f5c5aeb Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Wed, 23 Nov 2022 13:01:45 -0800 Subject: [PATCH 5/6] Code review feedback. --- Extension/src/LanguageServer/client.ts | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 24027af1f..fe1a0c0b9 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -2964,16 +2964,6 @@ export class DefaultClient implements Client { this.handleRemoveCodeAnalysisProblems(false, identifiersAndUris); } - private static countNewlines(text: string): number { - let numNewlines: number = 0; - for (let index: number = 0; index < text.length; ++index) { - if (text.charAt(index) === "\n") { - ++numNewlines; - } - } - return numNewlines; - } - public async handleCreateDeclarationOrDefinition(): Promise { let range: vscode.Range | undefined; let uri: vscode.Uri | undefined; @@ -3017,7 +3007,7 @@ export class DefaultClient implements Client { for (const edit of result.changes[file]) { const range: vscode.Range = makeVscodeRange(edit.range); if (lastEdit && lastEdit.range.isEqual(range)) { - numNewlinesFromPreviousEdits += DefaultClient.countNewlines(lastEdit.newText); + numNewlinesFromPreviousEdits += (lastEdit.newText.match(/\n/g) || []).length; } lastEdit = new vscode.TextEdit(range, edit.newText); edits.push(lastEdit); @@ -3027,17 +3017,19 @@ export class DefaultClient implements Client { }; if (modifiedDocument && lastEdit) { await vscode.workspace.applyEdit(workspaceEdit); - let numNewlines: number = DefaultClient.countNewlines(lastEdit.newText); + let numNewlines: number = (lastEdit.newText.match(/\n/g) || []).length; // Move the cursor to the new code, accounting for \n or \n\n at the start. - let selectionRange: vscode.Range = new vscode.Range(new vscode.Position(lastEdit.range.start.line + numNewlinesFromPreviousEdits, 0), new vscode.Position(lastEdit.range.start.line + numNewlinesFromPreviousEdits, 0)); + let startLine: number = lastEdit.range.start.line; if (lastEdit.newText.startsWith("\r\n\r\n") || lastEdit.newText.startsWith("\n\n")) { - selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 2, 0), new vscode.Position(selectionRange.start.line + 2, 0)); + startLine += 2; numNewlines -= 2; } else if (lastEdit.newText.startsWith("\r\n") || lastEdit.newText.startsWith("\n")) { - selectionRange = new vscode.Range(new vscode.Position(selectionRange.start.line + 1, 0), new vscode.Position(selectionRange.start.line + 1, 0)); + startLine += 1; numNewlines -= 1; } + const selectionPosition: vscode.Position = new vscode.Position(startLine + numNewlinesFromPreviousEdits, 0); + const selectionRange: vscode.Range = new vscode.Range(selectionPosition, selectionPosition); await vscode.window.showTextDocument(modifiedDocument, { selection: selectionRange }); // Run formatRange. From aab7eeb7652aa3e585bd70c9f30f411a94bd547d Mon Sep 17 00:00:00 2001 From: Sean McManus Date: Wed, 23 Nov 2022 16:09:32 -0800 Subject: [PATCH 6/6] Minor fix. Prevents an issue with vcFormat. --- Extension/src/LanguageServer/client.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index fe1a0c0b9..33a11e224 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -3028,6 +3028,10 @@ export class DefaultClient implements Client { startLine += 1; numNewlines -= 1; } + if (!lastEdit.newText.endsWith("\n")) { + numNewlines++; // Increase the format range. + } + const selectionPosition: vscode.Position = new vscode.Position(startLine + numNewlinesFromPreviousEdits, 0); const selectionRange: vscode.Range = new vscode.Range(selectionPosition, selectionPosition); await vscode.window.showTextDocument(modifiedDocument, { selection: selectionRange });