Skip to content

Commit 6bc4136

Browse files
committed
feat: update
1 parent acb7a99 commit 6bc4136

4 files changed

Lines changed: 225 additions & 153 deletions

File tree

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ public Object executeCommand(String commandId, List<Object> arguments, IProgress
3939
return ProjectCommand.checkImportStatus();
4040
case "java.project.getImportClassContent":
4141
return ProjectCommand.getImportClassContent(arguments, monitor);
42-
case "java.project.getImportClassContentWithReason":
43-
return ProjectCommand.getImportClassContentWithReason(arguments, monitor);
4442
case "java.project.getDependencies":
4543
return ProjectCommand.getProjectDependencies(arguments, monitor);
4644
default:

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java

Lines changed: 36 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,22 @@ public DependencyInfo(String key, String value) {
9999
}
100100

101101
/**
102-
* Error reasons for ImportClassContent operation
102+
* Empty reasons for ImportClassContent operation
103103
*/
104104
public enum ImportClassContentErrorReason {
105-
NULL_ARGUMENTS("Arguments null or empty"),
106-
INVALID_URI("URI invalid or empty"),
107-
URI_PARSE_FAILED("URI parse failed"),
108-
FILE_NOT_FOUND("File not found"),
109-
FILE_NOT_EXISTS("File does not exist"),
110-
NOT_JAVA_PROJECT("Not in Java project"),
111-
PROJECT_NOT_EXISTS("Java project not exists"),
112-
NOT_COMPILATION_UNIT("Not Java compilation unit"),
113-
NO_IMPORTS("No import declarations"),
114-
OPERATION_CANCELLED("Operation cancelled"),
115-
TIME_LIMIT_EXCEEDED("Time limit exceeded"),
116-
NO_RESULTS("No classes resolved"),
117-
PROCESSING_EXCEPTION("Processing exception");
105+
NULL_ARGUMENTS("NullArgs"),
106+
INVALID_URI("InvalidUri"),
107+
URI_PARSE_FAILED("UriParseFail"),
108+
FILE_NOT_FOUND("FileNotFound"),
109+
FILE_NOT_EXISTS("FileNotExists"),
110+
NOT_JAVA_PROJECT("NotJavaProject"),
111+
PROJECT_NOT_EXISTS("ProjectNotExists"),
112+
NOT_COMPILATION_UNIT("NotCompilationUnit"),
113+
NO_IMPORTS("NoImports"),
114+
OPERATION_CANCELLED("Cancelled"),
115+
TIME_LIMIT_EXCEEDED("Timeout"),
116+
NO_RESULTS("NoResults"),
117+
PROCESSING_EXCEPTION("ProcessingError");
118118

119119
private final String message;
120120

@@ -128,17 +128,17 @@ public String getMessage() {
128128
}
129129

130130
/**
131-
* Error reasons for ProjectDependencies operation
131+
* Empty reasons for ProjectDependencies operation
132132
*/
133133
public enum ProjectDependenciesErrorReason {
134-
NULL_ARGUMENTS("Arguments null or empty"),
135-
INVALID_URI("URI invalid or empty"),
136-
URI_PARSE_FAILED("URI parse failed"),
137-
MALFORMED_URI("Malformed URI syntax"),
138-
OPERATION_CANCELLED("Operation cancelled"),
139-
RESOLVER_NULL_RESULT("Resolver returned null"),
140-
NO_DEPENDENCIES("No dependencies resolved"),
141-
PROCESSING_EXCEPTION("Processing exception");
134+
NULL_ARGUMENTS("NullArgs"),
135+
INVALID_URI("InvalidUri"),
136+
URI_PARSE_FAILED("UriParseFail"),
137+
MALFORMED_URI("MalformedUri"),
138+
OPERATION_CANCELLED("Cancelled"),
139+
RESOLVER_NULL_RESULT("ResolverNull"),
140+
NO_DEPENDENCIES("NoDependencies"),
141+
PROCESSING_EXCEPTION("ProcessingError");
142142

143143
private final String message;
144144

@@ -156,19 +156,19 @@ public String getMessage() {
156156
*/
157157
public static class ImportClassContentResult {
158158
public List<ImportClassInfo> classInfoList;
159-
public String errorReason; // Use String for JSON serialization compatibility
160-
public boolean hasError;
159+
public String emptyReason; // Reason why the result is empty
160+
public boolean isEmpty;
161161

162162
public ImportClassContentResult(List<ImportClassInfo> classInfoList) {
163163
this.classInfoList = classInfoList;
164-
this.errorReason = null;
165-
this.hasError = false;
164+
this.emptyReason = null;
165+
this.isEmpty = false;
166166
}
167167

168168
public ImportClassContentResult(ImportClassContentErrorReason errorReason) {
169169
this.classInfoList = Collections.emptyList();
170-
this.errorReason = errorReason.getMessage(); // Use enum message
171-
this.hasError = true;
170+
this.emptyReason = errorReason.getMessage(); // Use enum message
171+
this.isEmpty = true;
172172
}
173173
}
174174

@@ -177,19 +177,19 @@ public ImportClassContentResult(ImportClassContentErrorReason errorReason) {
177177
*/
178178
public static class ProjectDependenciesResult {
179179
public List<DependencyInfo> dependencyInfoList;
180-
public String errorReason; // Use String for JSON serialization compatibility
181-
public boolean hasError;
180+
public String emptyReason; // Reason why the result is empty
181+
public boolean isEmpty;
182182

183183
public ProjectDependenciesResult(List<DependencyInfo> dependencyInfoList) {
184184
this.dependencyInfoList = dependencyInfoList;
185-
this.errorReason = null;
186-
this.hasError = false;
185+
this.emptyReason = null;
186+
this.isEmpty = false;
187187
}
188188

189189
public ProjectDependenciesResult(ProjectDependenciesErrorReason errorReason) {
190190
this.dependencyInfoList = new ArrayList<>();
191-
this.errorReason = errorReason.getMessage(); // Use enum message
192-
this.hasError = true;
191+
this.emptyReason = errorReason.getMessage(); // Use enum message
192+
this.isEmpty = true;
193193
}
194194
}
195195

@@ -445,23 +445,6 @@ public static boolean checkImportStatus() {
445445
return hasError;
446446
}
447447

448-
/**
449-
* Get import class content for Copilot integration (backward compatibility wrapper).
450-
* This method maintains compatibility with the original return type.
451-
*
452-
* @param arguments List containing the file URI as the first element
453-
* @param monitor Progress monitor for cancellation support
454-
* @return List of ImportClassInfo containing class information and JavaDoc
455-
*/
456-
public static List<ImportClassInfo> getImportClassContent(List<Object> arguments, IProgressMonitor monitor) {
457-
ImportClassContentResult result = getImportClassContentWithReason(arguments, monitor);
458-
if (result.hasError) {
459-
// Log the error reason for debugging
460-
JdtlsExtActivator.logError("getImportClassContent failed: " + result.errorReason);
461-
}
462-
return result.classInfoList;
463-
}
464-
465448
/**
466449
* Get import class content for Copilot integration with detailed error reporting.
467450
* This method extracts information about imported classes from a Java file.
@@ -471,7 +454,7 @@ public static List<ImportClassInfo> getImportClassContent(List<Object> arguments
471454
* @param monitor Progress monitor for cancellation support
472455
* @return ImportClassContentResult containing class information and error reason if applicable
473456
*/
474-
public static ImportClassContentResult getImportClassContentWithReason(List<Object> arguments, IProgressMonitor monitor) {
457+
public static ImportClassContentResult getImportClassContent(List<Object> arguments, IProgressMonitor monitor) {
475458
if (arguments == null || arguments.isEmpty()) {
476459
return new ImportClassContentResult(ImportClassContentErrorReason.NULL_ARGUMENTS);
477460
}

src/copilot/contextProvider.ts

Lines changed: 36 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -104,80 +104,48 @@ async function resolveJavaContext(request: ResolveRequest, copilotCancel: vscode
104104
// Check for cancellation before starting
105105
JavaContextProviderUtils.checkCancellation(copilotCancel);
106106

107-
// Get current document and position information
108-
const activeEditor = vscode.window.activeTextEditor;
109-
if (!activeEditor || activeEditor.document.languageId !== 'java') {
110-
return items;
111-
}
112-
113-
const document = activeEditor.document;
114-
115-
const workspaceFolders = vscode.workspace.workspaceFolders;
116-
if (!workspaceFolders || workspaceFolders.length === 0) {
117-
return items;
118-
}
119-
120-
const projectUri = workspaceFolders[0];
121-
122-
// Resolve project dependencies first
123-
const projectDependenciesResult = await CopilotHelper.resolveProjectDependenciesWithReason(projectUri.uri, copilotCancel);
124-
console.dir(projectDependenciesResult);
125-
// Check for cancellation after dependency resolution
126-
JavaContextProviderUtils.checkCancellation(copilotCancel);
127-
128-
// Send telemetry if there was an error resolving project dependencies
129-
if (projectDependenciesResult.hasError && projectDependenciesResult.errorReason) {
130-
sendInfo("", {
131-
"action": "resolveProjectDependencies",
132-
"status": "ContextEmpty",
133-
"ContextEmptyReason": projectDependenciesResult.errorReason
134-
});
135-
}
136-
// Check for cancellation after dependency resolution
137-
JavaContextProviderUtils.checkCancellation(copilotCancel);
138-
139-
// Convert project dependencies to Trait items
140-
if (projectDependenciesResult.dependencyInfoList && projectDependenciesResult.dependencyInfoList.length > 0) {
141-
for (const dep of projectDependenciesResult.dependencyInfoList) {
142-
items.push({
143-
name: dep.key,
144-
value: dep.value,
145-
importance: 70
146-
});
107+
// Resolve project dependencies and convert to context items
108+
const projectDependencyItems = await CopilotHelper.resolveAndConvertProjectDependencies(
109+
vscode.workspace.workspaceFolders,
110+
copilotCancel,
111+
JavaContextProviderUtils.checkCancellation,
112+
(action: string, status: string, reason?: string) => {
113+
const telemetryData: any = {
114+
"action": action,
115+
"status": status
116+
};
117+
if (reason) {
118+
telemetryData.ContextEmptyReason = reason;
119+
}
120+
sendInfo("", telemetryData);
147121
}
148-
}
149-
150-
// Check for cancellation before resolving imports
122+
);
151123
JavaContextProviderUtils.checkCancellation(copilotCancel);
124+
125+
items.push(...projectDependencyItems);
152126

153-
// Resolve imports directly without caching
154-
const importClassResult = await CopilotHelper.resolveLocalImportsWithReason(document.uri, copilotCancel);
155-
console.dir(importClassResult);
156-
// Check for cancellation after resolution
157127
JavaContextProviderUtils.checkCancellation(copilotCancel);
158128

159-
// Send telemetry if there was an error resolving imports
160-
if (importClassResult.hasError && importClassResult.errorReason) {
161-
sendInfo("", {
162-
"action": "resolveLocalImports",
163-
"status": "ContextEmpty",
164-
"ContextEmptyReason": importClassResult.errorReason
165-
});
166-
console.log("Context resolution - local imports error: " + importClassResult.errorReason);
167-
}
168-
169-
// Check for cancellation before processing results
129+
// Resolve local imports and convert to context items
130+
const localImportItems = await CopilotHelper.resolveAndConvertLocalImports(
131+
vscode.window.activeTextEditor,
132+
copilotCancel,
133+
JavaContextProviderUtils.checkCancellation,
134+
(action: string, status: string, reason?: string) => {
135+
const telemetryData: any = {
136+
"action": action,
137+
"status": status
138+
};
139+
if (reason) {
140+
telemetryData.ContextEmptyReason = reason;
141+
}
142+
sendInfo("", telemetryData);
143+
},
144+
JavaContextProviderUtils.createContextItemsFromImports
145+
);
170146
JavaContextProviderUtils.checkCancellation(copilotCancel);
171-
172-
if (importClassResult.classInfoList && importClassResult.classInfoList.length > 0) {
173-
// Process imports in batches to reduce cancellation check overhead
174-
const contextItems = JavaContextProviderUtils.createContextItemsFromImports(importClassResult.classInfoList);
175-
console.dir(contextItems);
176-
// Check cancellation once after creating all items
177-
JavaContextProviderUtils.checkCancellation(copilotCancel);
178-
179-
items.push(...contextItems);
180-
}
147+
148+
items.push(...localImportItems);
181149
} catch (error: any) {
182150
if (error instanceof CopilotCancellationError) {
183151
sendContextTelemetry(request, start, items, "cancelled_by_copilot");

0 commit comments

Comments
 (0)