Skip to content

Commit 02ec023

Browse files
committed
code snippet provider
1 parent 77f30fa commit 02ec023

File tree

8 files changed

+1251
-727
lines changed

8 files changed

+1251
-727
lines changed

Extension/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6590,6 +6590,7 @@
65906590
"xml2js": "^0.6.2"
65916591
},
65926592
"dependencies": {
6593+
"@github/copilot-language-server": "^1.253.0",
65936594
"@vscode/extension-telemetry": "^0.9.6",
65946595
"chokidar": "^3.6.0",
65956596
"comment-json": "^4.2.3",

Extension/src/LanguageServer/client.ts

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import {
5454
} from './codeAnalysis';
5555
import { Location, TextEdit, WorkspaceEdit } from './commonTypes';
5656
import * as configs from './configurations';
57+
import { CopilotCompletionContextFeatureFlag, CopilotCompletionContextProvider, SnippetEntry } from './copilotCompletionContextProvider';
5758
import { DataBinding } from './dataBinding';
5859
import { cachedEditorConfigSettings, getEditorConfigSettings } from './editorConfig';
5960
import { CppSourceStr, clients, configPrefix, updateLanguageConfigurations, usesCrashHandler, watchForCrashes } from './extension';
@@ -183,6 +184,7 @@ interface TelemetryPayload {
183184
event: string;
184185
properties?: Record<string, string>;
185186
metrics?: Record<string, number>;
187+
signedMetrics?: Record<string, number>;
186188
}
187189

188190
interface ReportStatusNotificationBody extends WorkspaceFolderParams {
@@ -577,6 +579,21 @@ interface FilesEncodingChanged {
577579
foldersFilesEncoding: FolderFilesEncodingChanged[];
578580
}
579581

582+
export interface CopilotCompletionContextResult {
583+
requestId: number;
584+
isResultMissing: boolean;
585+
snippets: SnippetEntry[];
586+
translationUnitUri: string;
587+
caretOffset: number;
588+
featureFlag: CopilotCompletionContextFeatureFlag;
589+
}
590+
591+
export interface CopilotCompletionContextParams {
592+
uri: string;
593+
caretOffset: number;
594+
featureFlag: CopilotCompletionContextFeatureFlag;
595+
}
596+
580597
// Requests
581598
const PreInitializationRequest: RequestType<void, string, void> = new RequestType<void, string, void>('cpptools/preinitialize');
582599
const InitializationRequest: RequestType<CppInitializationParams, void, void> = new RequestType<CppInitializationParams, void, void>('cpptools/initialize');
@@ -599,6 +616,7 @@ const ChangeCppPropertiesRequest: RequestType<CppPropertiesParams, void, void> =
599616
const IncludesRequest: RequestType<GetIncludesParams, GetIncludesResult, void> = new RequestType<GetIncludesParams, GetIncludesResult, void>('cpptools/getIncludes');
600617
const CppContextRequest: RequestType<TextDocumentIdentifier, ChatContextResult, void> = new RequestType<TextDocumentIdentifier, ChatContextResult, void>('cpptools/getChatContext');
601618
const ProjectContextRequest: RequestType<TextDocumentIdentifier, ProjectContextResult, void> = new RequestType<TextDocumentIdentifier, ProjectContextResult, void>('cpptools/getProjectContext');
619+
const CopilotCompletionContextRequest: RequestType<CopilotCompletionContextParams, CopilotCompletionContextResult, void> = new RequestType<CopilotCompletionContextParams, CopilotCompletionContextResult, void>('cpptools/getCompletionContext');
602620

603621
// Notifications to the server
604622
const DidOpenNotification: NotificationType<DidOpenTextDocumentParams> = new NotificationType<DidOpenTextDocumentParams>('textDocument/didOpen');
@@ -834,6 +852,7 @@ export interface Client {
834852
getChatContext(uri: vscode.Uri, token: vscode.CancellationToken): Promise<ChatContextResult>;
835853
getProjectContext(uri: vscode.Uri): Promise<ProjectContextResult>;
836854
filesEncodingChanged(filesEncodingChanged: FilesEncodingChanged): void;
855+
getCompletionContext(fileName: vscode.Uri, caretOffset: number, featureFlag: CopilotCompletionContextFeatureFlag, token: vscode.CancellationToken): Promise<CopilotCompletionContextResult>;
837856
}
838857

839858
export function createClient(workspaceFolder?: vscode.WorkspaceFolder): Client {
@@ -868,6 +887,7 @@ export class DefaultClient implements Client {
868887
private configurationProvider?: string;
869888
private hoverProvider: HoverProvider | undefined;
870889
private copilotHoverProvider: CopilotHoverProvider | undefined;
890+
private copilotCompletionProvider?: CopilotCompletionContextProvider;
871891

872892
public lastCustomBrowseConfiguration: PersistentFolderState<WorkspaceBrowseConfiguration | undefined> | undefined;
873893
public lastCustomBrowseConfigurationProviderId: PersistentFolderState<string | undefined> | undefined;
@@ -1346,6 +1366,9 @@ export class DefaultClient implements Client {
13461366
this.semanticTokensProviderDisposable = vscode.languages.registerDocumentSemanticTokensProvider(util.documentSelector, this.semanticTokensProvider, semanticTokensLegend);
13471367
}
13481368

1369+
this.copilotCompletionProvider = await CopilotCompletionContextProvider.Create();
1370+
this.disposables.push(this.copilotCompletionProvider);
1371+
13491372
// Listen for messages from the language server.
13501373
this.registerNotifications();
13511374

@@ -1878,6 +1901,7 @@ export class DefaultClient implements Client {
18781901
if (diagnosticsCollectionIntelliSense) {
18791902
diagnosticsCollectionIntelliSense.delete(document.uri);
18801903
}
1904+
this.copilotCompletionProvider?.removeFile(uri);
18811905
openFileVersions.delete(uri);
18821906
}
18831907

@@ -2259,7 +2283,6 @@ export class DefaultClient implements Client {
22592283
return util.extractCompilerPathAndArgs(!!settings.legacyCompilerArgsBehavior,
22602284
this.configuration.CurrentConfiguration?.compilerPath,
22612285
this.configuration.CurrentConfiguration?.compilerArgs);
2262-
22632286
}
22642287

22652288
public async getVcpkgInstalled(): Promise<boolean> {
@@ -2328,6 +2351,14 @@ export class DefaultClient implements Client {
23282351
() => this.languageClient.sendRequest(CppContextRequest, params, token), token);
23292352
}
23302353

2354+
public async getCompletionContext(file: vscode.Uri, caretOffset: number, featureFlag: CopilotCompletionContextFeatureFlag,
2355+
token: vscode.CancellationToken): Promise<CopilotCompletionContextResult> {
2356+
await withCancellation(this.ready, token);
2357+
return DefaultClient.withLspCancellationHandling(
2358+
() => this.languageClient.sendRequest(CopilotCompletionContextRequest,
2359+
{ uri: file.toString(), caretOffset, featureFlag }, token), token);
2360+
}
2361+
23312362
/**
23322363
* a Promise that can be awaited to know when it's ok to proceed.
23332364
*
@@ -2700,7 +2731,8 @@ export class DefaultClient implements Client {
27002731
if (notificationBody.event === "includeSquiggles" && this.configurationProvider && notificationBody.properties) {
27012732
notificationBody.properties["providerId"] = this.configurationProvider;
27022733
}
2703-
telemetry.logLanguageServerEvent(notificationBody.event, notificationBody.properties, notificationBody.metrics);
2734+
const metrics_unified: Record<string, number> = { ...notificationBody.metrics, ...notificationBody.signedMetrics };
2735+
telemetry.logLanguageServerEvent(notificationBody.event, notificationBody.properties, metrics_unified);
27042736
}
27052737

27062738
private async updateStatus(notificationBody: ReportStatusNotificationBody): Promise<void> {
@@ -4256,4 +4288,5 @@ class NullClient implements Client {
42564288
getChatContext(uri: vscode.Uri, token: vscode.CancellationToken): Promise<ChatContextResult> { return Promise.resolve({} as ChatContextResult); }
42574289
getProjectContext(uri: vscode.Uri): Promise<ProjectContextResult> { return Promise.resolve({} as ProjectContextResult); }
42584290
filesEncodingChanged(filesEncodingChanged: FilesEncodingChanged): void { }
4291+
getCompletionContext(file: vscode.Uri, caretOffset: number, featureFlag: CopilotCompletionContextFeatureFlag, token: vscode.CancellationToken): Promise<CopilotCompletionContextResult> { return Promise.resolve({} as CopilotCompletionContextResult); }
42594292
}

0 commit comments

Comments
 (0)