Skip to content

Commit 9a9ac3a

Browse files
authored
Remove Compiler Argument Traits (#13278)
* Remove Compiler Argument Traits - Couldn't find examples of where this actually improved the prompt per ad-hoc analysis. * Address review comment
1 parent 879202e commit 9a9ac3a

File tree

5 files changed

+56
-550
lines changed

5 files changed

+56
-550
lines changed

Extension/src/LanguageServer/client.ts

-22
Original file line numberDiff line numberDiff line change
@@ -555,19 +555,6 @@ export interface ChatContextResult {
555555
targetArchitecture: string;
556556
}
557557

558-
export interface FileContextResult {
559-
compilerArguments: string[];
560-
}
561-
562-
export interface ProjectContextResult {
563-
language: string;
564-
standardVersion: string;
565-
compiler: string;
566-
targetPlatform: string;
567-
targetArchitecture: string;
568-
fileContext: FileContextResult;
569-
}
570-
571558
interface FolderFilesEncodingChanged {
572559
uri: string;
573560
filesEncoding: string;
@@ -614,7 +601,6 @@ const GenerateDoxygenCommentRequest: RequestType<GenerateDoxygenCommentParams, G
614601
const ChangeCppPropertiesRequest: RequestType<CppPropertiesParams, void, void> = new RequestType<CppPropertiesParams, void, void>('cpptools/didChangeCppProperties');
615602
const IncludesRequest: RequestType<GetIncludesParams, GetIncludesResult, void> = new RequestType<GetIncludesParams, GetIncludesResult, void>('cpptools/getIncludes');
616603
const CppContextRequest: RequestType<TextDocumentIdentifier, ChatContextResult, void> = new RequestType<TextDocumentIdentifier, ChatContextResult, void>('cpptools/getChatContext');
617-
const ProjectContextRequest: RequestType<TextDocumentIdentifier, ProjectContextResult, void> = new RequestType<TextDocumentIdentifier, ProjectContextResult, void>('cpptools/getProjectContext');
618604
const CopilotCompletionContextRequest: RequestType<CopilotCompletionContextParams, CopilotCompletionContextResult, void> = new RequestType<CopilotCompletionContextParams, CopilotCompletionContextResult, void>('cpptools/getCompletionContext');
619605

620606
// Notifications to the server
@@ -849,7 +835,6 @@ export interface Client {
849835
getCopilotHoverProvider(): CopilotHoverProvider | undefined;
850836
getIncludes(uri: vscode.Uri, maxDepth: number): Promise<GetIncludesResult>;
851837
getChatContext(uri: vscode.Uri, token: vscode.CancellationToken): Promise<ChatContextResult>;
852-
getProjectContext(uri: vscode.Uri): Promise<ProjectContextResult>;
853838
filesEncodingChanged(filesEncodingChanged: FilesEncodingChanged): void;
854839
getCompletionContext(fileName: vscode.Uri, caretOffset: number, featureFlag: CopilotCompletionContextFeatures, token: vscode.CancellationToken): Promise<CopilotCompletionContextResult>;
855840
}
@@ -2342,12 +2327,6 @@ export class DefaultClient implements Client {
23422327
return this.languageClient.sendRequest(IncludesRequest, params);
23432328
}
23442329

2345-
public async getProjectContext(uri: vscode.Uri): Promise<ProjectContextResult> {
2346-
const params: TextDocumentIdentifier = { uri: uri.toString() };
2347-
await this.ready;
2348-
return this.languageClient.sendRequest(ProjectContextRequest, params);
2349-
}
2350-
23512330
public async getChatContext(uri: vscode.Uri, token: vscode.CancellationToken): Promise<ChatContextResult> {
23522331
const params: TextDocumentIdentifier = { uri: uri.toString() };
23532332
await withCancellation(this.ready, token);
@@ -4296,7 +4275,6 @@ class NullClient implements Client {
42964275
getCopilotHoverProvider(): CopilotHoverProvider | undefined { return undefined; }
42974276
getIncludes(uri: vscode.Uri, maxDepth: number): Promise<GetIncludesResult> { return Promise.resolve({} as GetIncludesResult); }
42984277
getChatContext(uri: vscode.Uri, token: vscode.CancellationToken): Promise<ChatContextResult> { return Promise.resolve({} as ChatContextResult); }
4299-
getProjectContext(uri: vscode.Uri): Promise<ProjectContextResult> { return Promise.resolve({} as ProjectContextResult); }
43004278
filesEncodingChanged(filesEncodingChanged: FilesEncodingChanged): void { }
43014279
getCompletionContext(file: vscode.Uri, caretOffset: number, featureFlag: CopilotCompletionContextFeatures, token: vscode.CancellationToken): Promise<CopilotCompletionContextResult> { return Promise.resolve({} as CopilotCompletionContextResult); }
43024280
}

Extension/src/LanguageServer/copilotProviders.ts

+4-50
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import * as logger from '../logger';
1212
import * as telemetry from '../telemetry';
1313
import { GetIncludesResult } from './client';
1414
import { getClients } from './extension';
15-
import { getCompilerArgumentFilterMap, getProjectContext } from './lmTool';
15+
import { getProjectContext } from './lmTool';
1616

1717
nls.config({ messageFormat: nls.MessageFormat.bundle, bundleFormat: nls.BundleFormat.standalone })();
1818
const localize: nls.LocalizeFunc = nls.loadMessageBundle();
@@ -43,23 +43,20 @@ export async function registerRelatedFilesProvider(): Promise<void> {
4343
for (const languageId of ['c', 'cpp', 'cuda-cpp']) {
4444
api.registerRelatedFilesProvider(
4545
{ extensionId: util.extensionContext.extension.id, languageId },
46-
async (uri: vscode.Uri, context: { flags: Record<string, unknown> }) => {
46+
async (uri: vscode.Uri, context: { flags: Record<string, unknown> }, cancellationToken: vscode.CancellationToken) => {
4747
const start = performance.now();
4848
const telemetryProperties: Record<string, string> = {};
4949
const telemetryMetrics: Record<string, number> = {};
5050
try {
5151
const getIncludesHandler = async () => (await getIncludes(uri, 1))?.includedFiles.map(file => vscode.Uri.file(file)) ?? [];
5252
const getTraitsHandler = async () => {
53-
const projectContext = await getProjectContext(uri, context, telemetryProperties, telemetryMetrics);
53+
const projectContext = await getProjectContext(uri, context, cancellationToken, telemetryProperties, telemetryMetrics);
5454

5555
if (!projectContext) {
5656
return undefined;
5757
}
5858

59-
let traits: CopilotTrait[] = [
60-
{ name: "intelliSenseDisclaimer", value: '', includeInPrompt: true, promptTextOverride: `IntelliSense is currently configured with the following compiler information. It reflects the active configuration, and the project may have more configurations targeting different platforms.` },
61-
{ name: "intelliSenseDisclaimerBeginning", value: '', includeInPrompt: true, promptTextOverride: `Beginning of IntelliSense information.` }
62-
];
59+
let traits: CopilotTrait[] = [];
6360
if (projectContext.language) {
6461
traits.push({ name: "language", value: projectContext.language, includeInPrompt: true, promptTextOverride: `The language is ${projectContext.language}.` });
6562
}
@@ -76,49 +73,6 @@ export async function registerRelatedFilesProvider(): Promise<void> {
7673
traits.push({ name: "targetArchitecture", value: projectContext.targetArchitecture, includeInPrompt: true, promptTextOverride: `This build targets ${projectContext.targetArchitecture}.` });
7774
}
7875

79-
if (projectContext.compiler) {
80-
// We will process compiler arguments based on copilotcppXXXCompilerArgumentFilters and copilotcppCompilerArgumentDirectAskMap feature flags.
81-
// The copilotcppXXXCompilerArgumentFilters are maps. The keys are regex strings for filtering and the values, if not empty,
82-
// are the prompt text to use when no arguments are found.
83-
// copilotcppCompilerArgumentDirectAskMap map individual matched argument to a prompt text.
84-
// For duplicate matches, the last one will be used.
85-
const filterMap = getCompilerArgumentFilterMap(projectContext.compiler, context);
86-
if (filterMap !== undefined) {
87-
const directAskMap: Record<string, string> = context.flags.copilotcppCompilerArgumentDirectAskMap ? JSON.parse(context.flags.copilotcppCompilerArgumentDirectAskMap as string) : {};
88-
let directAsks: string = '';
89-
const remainingArguments: string[] = [];
90-
91-
for (const key in filterMap) {
92-
if (!key) {
93-
continue;
94-
}
95-
96-
const matchedArgument = projectContext.compilerArguments[key] as string;
97-
if (matchedArgument?.length > 0) {
98-
if (directAskMap[matchedArgument]) {
99-
directAsks += `${directAskMap[matchedArgument]} `;
100-
} else {
101-
remainingArguments.push(matchedArgument);
102-
}
103-
} else if (filterMap[key]) {
104-
// Use the prompt text in the absence of argument.
105-
directAsks += `${filterMap[key]} `;
106-
}
107-
}
108-
109-
if (remainingArguments.length > 0) {
110-
const compilerArgumentsValue = remainingArguments.join(", ");
111-
traits.push({ name: "compilerArguments", value: compilerArgumentsValue, includeInPrompt: true, promptTextOverride: `The compiler arguments include: ${compilerArgumentsValue}.` });
112-
}
113-
114-
if (directAsks) {
115-
traits.push({ name: "directAsks", value: directAsks, includeInPrompt: true, promptTextOverride: directAsks });
116-
}
117-
}
118-
}
119-
120-
traits.push({ name: "intelliSenseDisclaimerEnd", value: '', includeInPrompt: true, promptTextOverride: `End of IntelliSense information.` });
121-
12276
const includeTraitsArray = context.flags.copilotcppIncludeTraits ? context.flags.copilotcppIncludeTraits as string[] : [];
12377
const includeTraits = new Set(includeTraitsArray);
12478
telemetryProperties["includeTraits"] = includeTraitsArray.join(',');

Extension/src/LanguageServer/lmTool.ts

+23-90
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as nls from 'vscode-nls';
99
import * as util from '../common';
1010
import * as logger from '../logger';
1111
import * as telemetry from '../telemetry';
12-
import { ChatContextResult, ProjectContextResult } from './client';
12+
import { ChatContextResult } from './client';
1313
import { getClients } from './extension';
1414
import { checkDuration } from './utils';
1515

@@ -51,7 +51,7 @@ const knownValues: { [Property in keyof ChatContextResult]?: { [id: string]: str
5151
}
5252
};
5353

54-
function formatChatContext(context: ChatContextResult | ProjectContextResult): void {
54+
function formatChatContext(context: ChatContextResult): void {
5555
type KnownKeys = 'language' | 'standardVersion' | 'compiler' | 'targetPlatform';
5656
for (const key in knownValues) {
5757
const knownKey = key as KnownKeys;
@@ -68,115 +68,48 @@ export interface ProjectContext {
6868
compiler: string;
6969
targetPlatform: string;
7070
targetArchitecture: string;
71-
compilerArguments: Record<string, string>;
7271
}
7372

74-
export function getCompilerArgumentFilterMap(compiler: string, context: { flags: Record<string, unknown> }): Record<string, string> | undefined {
75-
// The copilotcppXXXCompilerArgumentFilters are maps.
76-
// The keys are regex strings and the values, if not empty, are the prompt text to use when no arguments are found.
77-
let filterMap: Record<string, string> | undefined;
73+
export async function getProjectContext(uri: vscode.Uri, context: { flags: Record<string, unknown> }, cancellationToken: vscode.CancellationToken, telemetryProperties: Record<string, string>, telemetryMetrics: Record<string, number>): Promise<ProjectContext | undefined> {
7874
try {
79-
switch (compiler) {
80-
case MSVC:
81-
if (context.flags.copilotcppMsvcCompilerArgumentFilter !== undefined) {
82-
filterMap = JSON.parse(context.flags.copilotcppMsvcCompilerArgumentFilter as string);
83-
}
84-
break;
85-
case Clang:
86-
if (context.flags.copilotcppClangCompilerArgumentFilter !== undefined) {
87-
filterMap = JSON.parse(context.flags.copilotcppClangCompilerArgumentFilter as string);
88-
}
89-
break;
90-
case GCC:
91-
if (context.flags.copilotcppGccCompilerArgumentFilter !== undefined) {
92-
filterMap = JSON.parse(context.flags.copilotcppGccCompilerArgumentFilter as string);
93-
}
94-
break;
95-
}
96-
}
97-
catch {
98-
// Intentionally swallow any exception.
99-
}
100-
return filterMap;
101-
}
102-
103-
function filterCompilerArguments(compiler: string, compilerArguments: string[], context: { flags: Record<string, unknown> }, telemetryProperties: Record<string, string>): Record<string, string> {
104-
const filterMap = getCompilerArgumentFilterMap(compiler, context);
105-
if (filterMap === undefined) {
106-
return {};
107-
}
108-
109-
const combinedArguments = compilerArguments.join(' ');
110-
const result: Record<string, string> = {};
111-
const filteredCompilerArguments: string[] = [];
112-
for (const key in filterMap) {
113-
if (!key) {
114-
continue;
115-
}
116-
const filter = new RegExp(key, 'g');
117-
const filtered = combinedArguments.match(filter);
118-
if (filtered) {
119-
filteredCompilerArguments.push(...filtered);
120-
result[key] = filtered[filtered.length - 1];
121-
}
122-
}
123-
124-
if (filteredCompilerArguments.length > 0) {
125-
// Telemetry to learn about the argument distribution. The filtered arguments are expected to be non-PII.
126-
telemetryProperties["filteredCompilerArguments"] = filteredCompilerArguments.join(',');
127-
}
128-
129-
const filters = Object.keys(filterMap).filter(filter => !!filter).join(',');
130-
if (filters) {
131-
telemetryProperties["filters"] = filters;
132-
}
133-
134-
return result;
135-
}
136-
137-
export async function getProjectContext(uri: vscode.Uri, context: { flags: Record<string, unknown> }, telemetryProperties: Record<string, string>, telemetryMetrics: Record<string, number>): Promise<ProjectContext | undefined> {
138-
try {
139-
const projectContext = await checkDuration<ProjectContextResult | undefined>(async () => await getClients()?.ActiveClient?.getProjectContext(uri) ?? undefined);
140-
telemetryMetrics["projectContextDuration"] = projectContext.duration;
141-
if (!projectContext.result) {
75+
const chatContext = await checkDuration<ChatContextResult | undefined>(async () => await getClients()?.ActiveClient?.getChatContext(uri, cancellationToken) ?? undefined);
76+
telemetryMetrics["projectContextDuration"] = chatContext.duration;
77+
if (!chatContext.result) {
14278
return undefined;
14379
}
14480

145-
const originalStandardVersion = projectContext.result.standardVersion;
81+
const originalStandardVersion = chatContext.result.standardVersion;
14682

147-
formatChatContext(projectContext.result);
83+
formatChatContext(chatContext.result);
14884

14985
const result: ProjectContext = {
150-
language: projectContext.result.language,
151-
standardVersion: projectContext.result.standardVersion,
152-
compiler: projectContext.result.compiler,
153-
targetPlatform: projectContext.result.targetPlatform,
154-
targetArchitecture: projectContext.result.targetArchitecture,
155-
compilerArguments: {}
86+
language: chatContext.result.language,
87+
standardVersion: chatContext.result.standardVersion,
88+
compiler: chatContext.result.compiler,
89+
targetPlatform: chatContext.result.targetPlatform,
90+
targetArchitecture: chatContext.result.targetArchitecture
15691
};
15792

158-
if (projectContext.result.language) {
159-
telemetryProperties["language"] = projectContext.result.language;
93+
if (result.language) {
94+
telemetryProperties["language"] = result.language;
16095
}
161-
if (projectContext.result.compiler) {
162-
telemetryProperties["compiler"] = projectContext.result.compiler;
96+
if (result.compiler) {
97+
telemetryProperties["compiler"] = result.compiler;
16398
}
164-
if (projectContext.result.standardVersion) {
165-
telemetryProperties["standardVersion"] = projectContext.result.standardVersion;
99+
if (result.standardVersion) {
100+
telemetryProperties["standardVersion"] = result.standardVersion;
166101
}
167102
else {
168103
if (originalStandardVersion) {
169104
telemetryProperties["originalStandardVersion"] = originalStandardVersion;
170105
}
171106
}
172-
if (projectContext.result.targetPlatform) {
173-
telemetryProperties["targetPlatform"] = projectContext.result.targetPlatform;
107+
if (result.targetPlatform) {
108+
telemetryProperties["targetPlatform"] = result.targetPlatform;
174109
}
175-
if (projectContext.result.targetArchitecture) {
176-
telemetryProperties["targetArchitecture"] = projectContext.result.targetArchitecture;
110+
if (result.targetArchitecture) {
111+
telemetryProperties["targetArchitecture"] = result.targetArchitecture;
177112
}
178-
telemetryMetrics["compilerArgumentCount"] = projectContext.result.fileContext.compilerArguments.length;
179-
result.compilerArguments = filterCompilerArguments(projectContext.result.compiler, projectContext.result.fileContext.compilerArguments, context, telemetryProperties);
180113

181114
return result;
182115
}

0 commit comments

Comments
 (0)