Skip to content

Commit aaadde5

Browse files
authored
1 parent 89db3e4 commit aaadde5

File tree

5 files changed

+36
-27
lines changed

5 files changed

+36
-27
lines changed

src/vs/editor/contrib/inlineCompletions/browser/commands.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export class ToggleAlwaysShowInlineSuggestionToolbar extends Action2 {
198198
group: 'secondary',
199199
order: 10,
200200
}],
201-
toggled: InlineCompletionContextKeys.alwaysShowInlineSuggestionToolbar,
201+
toggled: ContextKeyExpr.equals('config.editor.inlineSuggest.showToolbar', 'always')
202202
});
203203
}
204204

src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ export class InlineCompletionContextKeys extends Disposable {
1515
public static readonly inlineSuggestionVisible = new RawContextKey<boolean>('inlineSuggestionVisible', false, localize('inlineSuggestionVisible', "Whether an inline suggestion is visible"));
1616
public static readonly inlineSuggestionHasIndentation = new RawContextKey<boolean>('inlineSuggestionHasIndentation', false, localize('inlineSuggestionHasIndentation', "Whether the inline suggestion starts with whitespace"));
1717
public static readonly inlineSuggestionHasIndentationLessThanTabSize = new RawContextKey<boolean>('inlineSuggestionHasIndentationLessThanTabSize', true, localize('inlineSuggestionHasIndentationLessThanTabSize', "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab"));
18-
public static readonly alwaysShowInlineSuggestionToolbar = new RawContextKey<boolean>('alwaysShowInlineSuggestionToolbar', false, localize('alwaysShowInlineSuggestionToolbar', "Whether the inline suggestion toolbar should always be visible"));
1918
public static readonly suppressSuggestions = new RawContextKey<boolean | undefined>('inlineSuggestionSuppressSuggestions', undefined, localize('suppressSuggestions', "Whether suggestions should be suppressed for the current suggestion"));
2019

2120
public readonly inlineCompletionVisible = InlineCompletionContextKeys.inlineSuggestionVisible.bindTo(this.contextKeyService);

src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { IModelContentChangedEvent } from 'vs/editor/common/textModelEvents';
2020
import { inlineSuggestCommitId } from 'vs/editor/contrib/inlineCompletions/browser/commandIds';
2121
import { GhostTextWidget } from 'vs/editor/contrib/inlineCompletions/browser/ghostTextWidget';
2222
import { InlineCompletionContextKeys } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys';
23-
import { InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget';
23+
import { InlineCompletionsHintsWidget, InlineSuggestionHintsContentWidget } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget';
2424
import { InlineCompletionsModel, VersionIdChangeReason } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsModel';
2525
import { SuggestWidgetAdaptor } from 'vs/editor/contrib/inlineCompletions/browser/suggestWidgetInlineCompletionProvider';
2626
import { AudioCue, IAudioCueService } from 'vs/platform/audioCues/browser/audioCueService';
@@ -191,6 +191,8 @@ export class InlineCompletionsController extends Disposable {
191191
});
192192
}
193193
}));
194+
195+
this._register(new InlineCompletionsHintsWidget(this.editor, this.model, this.instantiationService));
194196
}
195197

196198
/**

src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsHintsWidget.ts

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { RunOnceScheduler } from 'vs/base/common/async';
1212
import { Codicon } from 'vs/base/common/codicons';
1313
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
1414
import { IObservable, autorun, derived, observableFromEvent } from 'vs/base/common/observable';
15+
import { autorunWithStore2 } from 'vs/base/common/observableImpl/autorun';
1516
import { OS } from 'vs/base/common/platform';
1617
import { ThemeIcon } from 'vs/base/common/themables';
1718
import 'vs/css!./inlineCompletionsHintsWidget';
@@ -35,14 +36,14 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
3536
import { registerIcon } from 'vs/platform/theme/common/iconRegistry';
3637

3738
export class InlineCompletionsHintsWidget extends Disposable {
38-
private readonly showToolbar = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).showToolbar);
39+
private readonly alwaysShowToolbar = observableFromEvent(this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).showToolbar === 'always');
3940

4041
private sessionPosition: Position | undefined = undefined;
4142

4243
private readonly position = derived('position', reader => {
43-
const ghostText = this.model.ghostText.read(reader);
44+
const ghostText = this.model.read(reader)?.ghostText.read(reader);
4445

45-
if (this.showToolbar.read(reader) !== 'always' || !ghostText) {
46+
if (!this.alwaysShowToolbar.read(reader) || !ghostText || ghostText.parts.length === 0) {
4647
this.sessionPosition = undefined;
4748
return null;
4849
}
@@ -53,37 +54,44 @@ export class InlineCompletionsHintsWidget extends Disposable {
5354
}
5455

5556
const position = new Position(ghostText.lineNumber, Math.min(firstColumn, this.sessionPosition?.column ?? Number.MAX_SAFE_INTEGER));
57+
this.sessionPosition = position;
5658
return position;
5759
});
5860

59-
private readonly contentWidget = this._register(this.instantiationService.createInstance(
60-
InlineSuggestionHintsContentWidget,
61-
this.editor,
62-
true,
63-
this.position,
64-
this.model.selectedInlineCompletionIndex,
65-
this.model.inlineCompletionsCount,
66-
this.model.selectedInlineCompletion.map(v => v?.inlineCompletion.source.inlineCompletions.commands ?? []),
67-
));
68-
6961
constructor(
7062
private readonly editor: ICodeEditor,
71-
private readonly model: InlineCompletionsModel,
63+
private readonly model: IObservable<InlineCompletionsModel | undefined>,
7264
@IInstantiationService private readonly instantiationService: IInstantiationService,
7365
) {
7466
super();
7567

76-
editor.addContentWidget(this.contentWidget);
77-
this._register(toDisposable(() => editor.removeContentWidget(this.contentWidget)));
78-
79-
this._register(autorun('request explicit', reader => {
80-
const position = this.position.read(reader);
81-
if (!position) {
68+
this._register(autorunWithStore2('setup content widget', (reader, store) => {
69+
const model = this.model.read(reader);
70+
if (!model || !this.alwaysShowToolbar.read(reader)) {
8271
return;
8372
}
84-
if (this.model.lastTriggerKind.read(reader) !== InlineCompletionTriggerKind.Explicit) {
85-
this.model.triggerExplicitly();
86-
}
73+
74+
const contentWidget = store.add(this.instantiationService.createInstance(
75+
InlineSuggestionHintsContentWidget,
76+
this.editor,
77+
true,
78+
this.position,
79+
model.selectedInlineCompletionIndex,
80+
model.inlineCompletionsCount,
81+
model.selectedInlineCompletion.map(v => v?.inlineCompletion.source.inlineCompletions.commands ?? []),
82+
));
83+
editor.addContentWidget(contentWidget);
84+
store.add(toDisposable(() => editor.removeContentWidget(contentWidget)));
85+
86+
store.add(autorun('request explicit', reader => {
87+
const position = this.position.read(reader);
88+
if (!position) {
89+
return;
90+
}
91+
if (model.lastTriggerKind.read(reader) !== InlineCompletionTriggerKind.Explicit) {
92+
model.triggerExplicitly();
93+
}
94+
}));
8795
}));
8896
}
8997
}

src/vs/editor/contrib/inlineCompletions/browser/inlineCompletionsSource.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ export class InlineCompletionsSource extends Disposable {
8989
}
9090
}
9191

92+
this._updateOperation.clear();
9293
transaction(tx => {
9394
target.set(completions, tx);
9495
});
95-
this._updateOperation.clear();
9696

9797
return true;
9898
})();

0 commit comments

Comments
 (0)