diff --git a/extension/src/languageServer/languageServer.ts b/extension/src/languageServer/languageServer.ts index 8aab6e7ef..a9077be82 100644 --- a/extension/src/languageServer/languageServer.ts +++ b/extension/src/languageServer/languageServer.ts @@ -96,7 +96,6 @@ function getGradleSettings(): unknown { async function syncSingleProject(project: GradleProject): Promise { if (isLanguageServerStarted) { const projectPath = vscode.Uri.file(project.getProjectpath()).fsPath; - await vscode.commands.executeCommand("gradle.setPlugins", project.getProjectpath(), project.getPluginsList()); const closures = project.getPluginclosuresList().map((value) => { const JSONMethod = value.getMethodsList().map((method) => { return { @@ -117,20 +116,21 @@ async function syncSingleProject(project: GradleProject): Promise { fields: JSONField, }; }); - await vscode.commands.executeCommand("gradle.setClosures", projectPath, closures); - await vscode.commands.executeCommand( - "gradle.setScriptClasspaths", - projectPath, - project.getScriptclasspathsList() - ); + await Promise.all([ + vscode.commands.executeCommand("gradle.setPlugins", project.getProjectpath(), project.getPluginsList()), + vscode.commands.executeCommand("gradle.setClosures", projectPath, closures), + vscode.commands.executeCommand( + "gradle.setScriptClasspaths", + projectPath, + project.getScriptclasspathsList() + ), + ]); } } async function syncProject(project: GradleProject): Promise { await syncSingleProject(project); - for (const subProject of project.getProjectsList()) { - await syncProject(subProject); - } + await Promise.all(project.getProjectsList().map((subProject) => syncProject(subProject))); } export async function syncGradleBuild(gradleBuild: GradleBuild): Promise { @@ -138,6 +138,7 @@ export async function syncGradleBuild(gradleBuild: GradleBuild): Promise { if (rootProject && rootProject.getIsRoot()) { try { await syncProject(rootProject); + await vscode.commands.executeCommand("gradle.recompile"); } catch (e) { // Log but don't propagate - sync failures should not block task discovery const message = e instanceof Error ? e.message : String(e); @@ -160,11 +161,9 @@ async function handleLanguageServerStart( return; } // when language server starts, it knows nothing about the project - // here to asynchronously sync the project content (plugins, closures) with language server - const gradleBuild = await contentProvider.getGradleBuild(rootProject); - if (gradleBuild) { - await syncGradleBuild(gradleBuild); - } + // getGradleBuild internally calls syncGradleBuild to sync plugins, closures + // and classpaths with the language server on first fetch + await contentProvider.getGradleBuild(rootProject); } } } diff --git a/gradle-language-server/src/main/java/com/microsoft/gradle/GradleServices.java b/gradle-language-server/src/main/java/com/microsoft/gradle/GradleServices.java index b2b623dc0..625ca2d8c 100644 --- a/gradle-language-server/src/main/java/com/microsoft/gradle/GradleServices.java +++ b/gradle-language-server/src/main/java/com/microsoft/gradle/GradleServices.java @@ -80,7 +80,8 @@ public class GradleServices implements TextDocumentService, WorkspaceService, LanguageClientAware { public static final List supportedCommands = Arrays.asList("gradle.getDependencies", - "gradle.distributionChanged", "gradle.setPlugins", "gradle.setClosures", "gradle.setScriptClasspaths"); + "gradle.distributionChanged", "gradle.setPlugins", "gradle.setClosures", "gradle.setScriptClasspaths", + "gradle.recompile"); private LanguageClient client; private GradleFilesManager gradleFilesManager; @@ -376,6 +377,7 @@ public CompletableFuture executeCommand(ExecuteCommandParams params) { String projectPath = new Gson().fromJson((JsonElement) arguments.get(0), String.class); String[] scriptClasspaths = new Gson().fromJson((JsonElement) arguments.get(1), String[].class); this.gradleFilesManager.setScriptClasspaths(projectPath, Arrays.asList(scriptClasspaths)); + } else if (command.equals("gradle.recompile")) { this.recompileAll(); } return CompletableFuture.completedFuture(null);