Skip to content

Commit cd6a1dd

Browse files
committed
feat: enhance completion item provider to support context-aware suggestions
1 parent 8150ccc commit cd6a1dd

1 file changed

Lines changed: 16 additions & 4 deletions

File tree

packages/ui/lib/features/extensions/monacoBridge/providerBridge.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
*/
1212

1313
import type * as Monaco from "monaco-editor/esm/vs/editor/editor.api.js";
14-
import type { ExtensionHostClient, ProviderRegistration } from "../extensionHostClient";
1514
import type { DocumentSelectorPayload, ProviderKind } from "../ehProtocol";
15+
import type { ExtensionHostClient, ProviderRegistration } from "../extensionHostClient";
16+
import type {
17+
rangeToMonaco
18+
} from "./typeAdapters";
1619
import {
1720
codeActionToMonaco,
1821
codeLensToMonaco,
@@ -27,7 +30,6 @@ import {
2730
locationToMonaco,
2831
monacoPositionToPayload,
2932
monacoRangeToPayload,
30-
rangeToMonaco,
3133
selectionRangeToMonaco,
3234
signatureHelpToMonaco,
3335
symbolInformationToMonaco,
@@ -82,15 +84,25 @@ export class MonacoProviderBridge {
8284
case "completion": {
8385
const provider: Monaco.languages.CompletionItemProvider = {
8486
triggerCharacters,
85-
provideCompletionItems: async (model, position) => {
87+
provideCompletionItems: async (model, position, context) => {
8688
const word = model.getWordAtPosition(position);
8789
const defaultRange = word
8890
? { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, startColumn: word.startColumn, endColumn: word.endColumn }
8991
: { startLineNumber: position.lineNumber, endLineNumber: position.lineNumber, startColumn: position.column, endColumn: position.column };
92+
// Forward Monaco's CompletionContext verbatim (triggerKind + triggerCharacter).
93+
// Many language servers (including yaml-language-server via vscode-languageclient)
94+
// return `isIncomplete: true` and rely on `TriggerForIncompleteCompletions` on
95+
// subsequent requests while the user keeps typing. Hard-coding `Invoke` breaks
96+
// that contract and yields empty or generic-looking suggestion lists.
9097
const result = await this.invoke(reg.providerId, "provideCompletionItems", {
9198
uri: model.uri.toString(),
9299
position: monacoPositionToPayload(position),
93-
context: { triggerKind: 0 },
100+
context: {
101+
triggerKind: context.triggerKind,
102+
...(context.triggerCharacter != null && context.triggerCharacter !== ""
103+
? { triggerCharacter: context.triggerCharacter }
104+
: {}),
105+
},
94106
});
95107
return completionListToMonaco(result as Parameters<typeof completionListToMonaco>[0], defaultRange) ?? undefined;
96108
},

0 commit comments

Comments
 (0)