|
5 | 5 |
|
6 | 6 | import * as vscode from 'vscode';
|
7 | 7 |
|
8 |
| -import { FormattingOptions, LanguageClient, TextDocumentIdentifier } from 'vscode-languageclient/node'; |
| 8 | +import { |
| 9 | + FormattingOptions, |
| 10 | + InsertTextFormat, |
| 11 | + LanguageClient, |
| 12 | + TextDocumentIdentifier, |
| 13 | +} from 'vscode-languageclient/node'; |
9 | 14 | import * as RoslynProtocol from '../server/roslynProtocol';
|
10 | 15 | import { RoslynLanguageServer } from '../server/roslynLanguageServer';
|
11 | 16 |
|
@@ -50,7 +55,13 @@ export function registerOnAutoInsert(languageServer: RoslynLanguageServer, langu
|
50 | 55 | }
|
51 | 56 |
|
52 | 57 | // Regular expression to match all whitespace characters except the newline character
|
53 |
| - const changeTrimmed = change.text.replace(/[^\S\n]+/g, ''); |
| 58 | + let changeTrimmed = change.text.replace(/[^\S\n]+/g, ''); |
| 59 | + // When hitting enter between braces, we can end up with two new lines added (one to move the cursor down to an empty line, |
| 60 | + // and another to move the close brace to a new line below that). We still want to trigger on auto insert here, so remove |
| 61 | + // duplicates before we check if the change matches a trigger character. |
| 62 | + if (changeTrimmed.length > 1) { |
| 63 | + changeTrimmed = [...new Set(changeTrimmed)].join(''); |
| 64 | + } |
54 | 65 |
|
55 | 66 | if (!vsTriggerCharacters.includes(changeTrimmed)) {
|
56 | 67 | return;
|
@@ -98,12 +109,22 @@ async function applyAutoInsertEdit(
|
98 | 109 | const textEdit = response._vs_textEdit;
|
99 | 110 | const startPosition = new vscode.Position(textEdit.range.start.line, textEdit.range.start.character);
|
100 | 111 | const endPosition = new vscode.Position(textEdit.range.end.line, textEdit.range.end.character);
|
101 |
| - const docComment = new vscode.SnippetString(textEdit.newText); |
102 |
| - const code: any = vscode; |
103 |
| - const textEdits = [new code.SnippetTextEdit(new vscode.Range(startPosition, endPosition), docComment)]; |
| 112 | + |
| 113 | + //const editor = vscode.window.activeTextEditor?.insertSnippet(); |
| 114 | + |
| 115 | + let textEdits: (vscode.TextEdit | vscode.SnippetTextEdit)[] = []; |
| 116 | + if (response._vs_textEditFormat === InsertTextFormat.Snippet) { |
| 117 | + const docComment = new vscode.SnippetString(textEdit.newText); |
| 118 | + const edit = vscode.SnippetTextEdit.replace(new vscode.Range(startPosition, endPosition), docComment); |
| 119 | + // Roslyn already formats the snippet correctly - we don't want the client to try and change the whitespace. |
| 120 | + edit.keepWhitespace = true; |
| 121 | + textEdits = [edit]; |
| 122 | + } else { |
| 123 | + textEdits = [vscode.TextEdit.replace(new vscode.Range(startPosition, endPosition), textEdit.newText)]; |
| 124 | + } |
| 125 | + |
104 | 126 | const edit = new vscode.WorkspaceEdit();
|
105 | 127 | edit.set(uri, textEdits);
|
106 |
| - |
107 | 128 | const applied = vscode.workspace.applyEdit(edit);
|
108 | 129 | if (!applied) {
|
109 | 130 | throw new Error('Tried to apply an edit but an error occurred.');
|
|
0 commit comments