-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathInlineCompletionProvider.ts
68 lines (63 loc) · 2.14 KB
/
InlineCompletionProvider.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import * as monaco from "monaco-editor/esm/vs/editor/editor.api";
import { Dispatch, SetStateAction } from "react";
import { PromiseClient } from "@connectrpc/connect";
import { Status } from "./Status";
import { MonacoCompletionProvider } from "./CompletionProvider";
import { LanguageServerService } from "../../api/proto/exa/language_server_pb/language_server_connect";
import MonacoInlineCompletion from "./InlineCompletion";
declare module "monaco-editor" {
namespace editor {
interface ICodeEditor {
_commandService: { executeCommand(command: string): unknown };
}
}
}
export class InlineCompletionProvider
implements
monaco.languages.InlineCompletionsProvider<
monaco.languages.InlineCompletions<MonacoInlineCompletion>
>
{
private numCompletionsProvided: number;
readonly completionProvider: MonacoCompletionProvider;
constructor(
grpcClient: PromiseClient<typeof LanguageServerService>,
readonly setCompletionCount: Dispatch<SetStateAction<number>>,
setCodeiumStatus: Dispatch<SetStateAction<Status>>,
setCodeiumStatusMessage: Dispatch<SetStateAction<string>>
) {
this.numCompletionsProvided = 0;
this.completionProvider = new MonacoCompletionProvider(
grpcClient,
setCodeiumStatus,
setCodeiumStatusMessage
);
}
freeInlineCompletions() {
// nothing
}
async provideInlineCompletions(
model: monaco.editor.ITextModel,
position: monaco.Position,
context: monaco.languages.InlineCompletionContext,
token: monaco.CancellationToken
) {
const completions = await this.completionProvider.provideInlineCompletions(
model,
position,
token
);
// Only count completions provided if non-empty (i.e. exclude cancelled
// requests).
// TODO(nick): don't count cached results either.
// TODO(nick): better distinguish warning and error states.
if (completions) {
this.numCompletionsProvided += 1;
this.setCompletionCount(this.numCompletionsProvided);
}
return completions;
}
public acceptedLastCompletion(completionId: string) {
this.completionProvider.acceptedLastCompletion(completionId);
}
}