Skip to content

Commit 3e232a8

Browse files
authored
only activate snippet choice completion provider when at a choice element (microsoft#184174)
fixes microsoft#180069
1 parent 3062c19 commit 3e232a8

File tree

1 file changed

+29
-11
lines changed

1 file changed

+29
-11
lines changed

src/vs/editor/contrib/snippet/browser/snippetController2.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
7-
import { DisposableStore } from 'vs/base/common/lifecycle';
7+
import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
88
import { assertType } from 'vs/base/common/types';
99
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
1010
import { EditorCommand, EditorContributionInstantiation, registerEditorCommand, registerEditorContribution } from 'vs/editor/browser/editorExtensions';
@@ -66,7 +66,7 @@ export class SnippetController2 implements IEditorContribution {
6666
private _modelVersionId: number = -1;
6767
private _currentChoice?: Choice;
6868

69-
private _choiceCompletionItemProvider?: CompletionItemProvider;
69+
private _choiceCompletions?: { provider: CompletionItemProvider; enable(): void; disable(): void };
7070

7171
constructor(
7272
private readonly _editor: ICodeEditor,
@@ -156,7 +156,7 @@ export class SnippetController2 implements IEditorContribution {
156156

157157
// regster completion item provider when there is any choice element
158158
if (this._session?.hasChoice) {
159-
this._choiceCompletionItemProvider = {
159+
const provider = {
160160
provideCompletionItems: (model: ITextModel, position: Position) => {
161161
if (!this._session || model !== this._editor.getModel() || !Position.equals(this._editor.getPosition(), position)) {
162162
return undefined;
@@ -185,14 +185,29 @@ export class SnippetController2 implements IEditorContribution {
185185
}
186186
};
187187

188-
const registration = this._languageFeaturesService.completionProvider.register({
189-
language: this._editor.getModel().getLanguageId(),
190-
pattern: this._editor.getModel().uri.fsPath,
191-
scheme: this._editor.getModel().uri.scheme,
192-
exclusive: true
193-
}, this._choiceCompletionItemProvider);
188+
const model = this._editor.getModel();
189+
190+
let registration: IDisposable = Disposable.None;
191+
let isRegistered = false;
192+
const disable = () => {
193+
registration.dispose();
194+
isRegistered = false;
195+
};
196+
197+
const enable = () => {
198+
if (!isRegistered) {
199+
registration = this._languageFeaturesService.completionProvider.register({
200+
language: model.getLanguageId(),
201+
pattern: model.uri.fsPath,
202+
scheme: model.uri.scheme,
203+
exclusive: true
204+
}, provider);
205+
isRegistered = true;
206+
}
207+
};
194208

195209
this._snippetListener.add(registration);
210+
this._choiceCompletions = { provider, enable, disable };
196211
}
197212

198213
this._updateState();
@@ -239,17 +254,20 @@ export class SnippetController2 implements IEditorContribution {
239254
}
240255

241256
const { activeChoice } = this._session;
242-
if (!activeChoice || !this._choiceCompletionItemProvider) {
257+
if (!activeChoice || !this._choiceCompletions) {
258+
this._choiceCompletions?.disable();
243259
this._currentChoice = undefined;
244260
return;
245261
}
246262

247263
if (this._currentChoice !== activeChoice.choice) {
248264
this._currentChoice = activeChoice.choice;
249265

266+
this._choiceCompletions.enable();
267+
250268
// trigger suggest with the special choice completion provider
251269
queueMicrotask(() => {
252-
showSimpleSuggestions(this._editor, this._choiceCompletionItemProvider!);
270+
showSimpleSuggestions(this._editor, this._choiceCompletions!.provider);
253271
});
254272
}
255273
}

0 commit comments

Comments
 (0)