From 8cd13526a3c5fab89c521cb0637b8df14c429928 Mon Sep 17 00:00:00 2001 From: Gayan Perera Date: Wed, 16 Oct 2024 18:21:19 +0200 Subject: [PATCH] wait for build after refresh. Fix #2998 --- .../eval/EvaluationContextWrapperTest.java | 1 + .../jdt/core/tests/eval/EvaluationTest.java | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationContextWrapperTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationContextWrapperTest.java index 439a6d09ee4..45b22282938 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationContextWrapperTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationContextWrapperTest.java @@ -182,6 +182,7 @@ private Map compileAndDeploy15(String source, String className, private void refreshProject() throws Exception { this.project.getProject().refreshLocal(IResource.DEPTH_INFINITE, null); + waitForAutoBuild(); // wait for builds to complete. } private void removeTempClass(String className) { diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationTest.java index e94b70531ad..f7e826b0ad5 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/eval/EvaluationTest.java @@ -20,6 +20,13 @@ import java.util.Map; import junit.framework.Test; import junit.framework.TestSuite; + +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.jobs.ISchedulingRule; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.core.compiler.CategorizedProblem; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.tests.junit.extension.StopableTestCase; @@ -40,6 +47,7 @@ import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory; +import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.internal.eval.EvaluationContext; import org.eclipse.jdt.internal.eval.EvaluationResult; import org.eclipse.jdt.internal.eval.GlobalVariable; @@ -569,4 +577,40 @@ public void stop() { } } } + + public void waitForAutoBuild() { + if (isWorkspaceRuleAlreadyInUse(getWorkspaceRoot())) { + // Don't wait holding workspace lock on FAMILY_AUTO_BUILD, because + // we might deadlock with AutoBuildOffJob + System.out.println("\n\nAborted waitForAutoBuild() because running with the workspace rule\n\n"); + return; + } + boolean wasInterrupted = false; + do { + try { + Job.getJobManager().wakeUp(ResourcesPlugin.FAMILY_AUTO_BUILD); + Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null); + JavaModelManager.getIndexManager().waitForIndex(isIndexDisabledForTest(), null); + wasInterrupted = false; + } catch (OperationCanceledException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + wasInterrupted = true; + } + } while (wasInterrupted); + } + + private static boolean isWorkspaceRuleAlreadyInUse(ISchedulingRule rule) { + ISchedulingRule currentJobRule = Job.getJobManager().currentRule(); + boolean workspaceRuleActive = currentJobRule != null && rule.contains(currentJobRule); + return workspaceRuleActive; + } + + private IWorkspaceRoot getWorkspaceRoot() { + return getWorkspace().getRoot(); + } + + private IWorkspace getWorkspace() { + return ResourcesPlugin.getWorkspace(); + } }