diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradlePreferenceChangeListener.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradlePreferenceChangeListener.java index 43473482e9..96f787a2a3 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradlePreferenceChangeListener.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/GradlePreferenceChangeListener.java @@ -27,6 +27,8 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.apt.core.util.AptConfig; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; @@ -48,6 +50,7 @@ public void preferencesChange(Preferences oldPreferences, Preferences newPrefere if (projectsManager != null) { boolean gradleJavaHomeChanged = !Objects.equals(oldPreferences.getGradleJavaHome(), newPreferences.getGradleJavaHome()); if (gradleJavaHomeChanged || hasAllowedChecksumsChanged(oldPreferences, newPreferences)) { + waitForGradleJobs(); for (IProject project : ProjectUtils.getGradleProjects()) { if (newPreferences.isGradleWrapperEnabled() || gradleJavaHomeChanged) { updateProject(projectsManager, project, gradleJavaHomeChanged); @@ -57,16 +60,17 @@ public void preferencesChange(Preferences oldPreferences, Preferences newPrefere boolean protobufSupportChanged = !Objects.equals(oldPreferences.isProtobufSupportEnabled(), newPreferences.isProtobufSupportEnabled()); if (protobufSupportChanged) { - for (IProject project : ProjectUtils.getGradleProjects()) { - projectsManager.updateProject(project, true); - } + updateProjects(projectsManager); } boolean androidSupportChanged = !Objects.equals(oldPreferences.isAndroidSupportEnabled(), newPreferences.isAndroidSupportEnabled()); if (androidSupportChanged) { - for (IProject project : ProjectUtils.getGradleProjects()) { - projectsManager.updateProject(project, true); - } + updateProjects(projectsManager); + } + + boolean aspectjSupportChanged = !Objects.equals(oldPreferences.isAspectjSupportEnabled(), newPreferences.isAspectjSupportEnabled()); + if (aspectjSupportChanged) { + updateProjects(projectsManager); } boolean annotationProcessingChanged = !Objects.equals(oldPreferences.isGradleAnnotationProcessingEnabled(), newPreferences.isGradleAnnotationProcessingEnabled()); @@ -84,6 +88,7 @@ public void preferencesChange(Preferences oldPreferences, Preferences newPrefere } boolean updateBuildConfigurationChanged = !Objects.equals(oldPreferences.getUpdateBuildConfigurationStatus(), newPreferences.getUpdateBuildConfigurationStatus()); if (updateBuildConfigurationChanged) { + waitForGradleJobs(); for (IProject project : ProjectUtils.getGradleProjects()) { String projectPath = project.getLocation().toFile().getAbsolutePath(); BuildConfiguration buildConfiguration = GradleProjectImporter.getBuildConfiguration(Paths.get(projectPath)); @@ -94,6 +99,21 @@ public void preferencesChange(Preferences oldPreferences, Preferences newPrefere } } + private void waitForGradleJobs() { + try { + Job.getJobManager().join(CorePlugin.GRADLE_JOB_FAMILY, new NullProgressMonitor()); + } catch (OperationCanceledException | InterruptedException e) { + // ignore + } + } + + private void updateProjects(ProjectsManager projectsManager) { + waitForGradleJobs(); + for (IProject project : ProjectUtils.getGradleProjects()) { + projectsManager.updateProject(project, true); + } + } + private void updateProject(ProjectsManager projectsManager, IProject project, boolean gradleJavaHomeChanged) { String projectDir = project.getLocation().toFile().getAbsolutePath(); Path projectPath = Paths.get(projectDir);