diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaModelTests.java index 29349ed9976..324b602d2b7 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaModelTests.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaModelTests.java @@ -310,13 +310,31 @@ public void testCreatePkgHandleInDifferentProject() throws CoreException { try { createJavaProject("P1", new String[] {}, "bin"); IFolder folder = createFolder("/P1/lib/x/y"); - createJavaProject("P2", new String[] {}, new String[] {"/P1/lib"}, ""); + IJavaProject p2 = createJavaProject("P2", new String[] {}, new String[] {"/P1/lib"}, ""); IJavaElement element = JavaCore.create(folder); assertElementEquals( "Unexpected element", "x.y [in /P1/lib [in P2]]", element ); + IFolder folder2 = createFolder("/P1/lib/x/z"); + assertElementEquals( + "Unexpected element", + "x.z [in /P1/lib [in P2]]", + JavaCore.create(folder2) + ); + p2.getProject().close(null); + assertElementEquals( + "Unexpected element", + "", // closed + JavaCore.create(folder2) + ); + p2.getProject().open(null); + assertElementEquals( + "Unexpected element", + "x.z [in /P1/lib [in P2]]", // open again + JavaCore.create(folder2) + ); } finally { deleteProjects(new String[] {"P1", "P2"}); } diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java index 6cfbdc3a809..7ff36a780b7 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java @@ -979,7 +979,7 @@ public static IJavaElement create(IFile file, IJavaProject project) { } return null; } - + private static volatile IJavaProject lastProjectUsed; /** * Returns the package fragment or package fragment root corresponding to the given folder, * its parent or great parent being the given project. @@ -999,6 +999,14 @@ public static IJavaElement create(IFolder folder, IJavaProject project) { project = JavaCore.create(folder.getProject()); element = determineIfOnClasspath(folder, project); if (element == null) { + IJavaProject lastProject = lastProjectUsed; + if (lastProject != null) { + // try to avoid searching through all projects + element = determineIfOnClasspath(folder, lastProject); + if (element != null) { + return element; + } + } // walk all projects and find one that have the given folder on its classpath IJavaProject[] projects; try { @@ -1007,10 +1015,13 @@ public static IJavaElement create(IFolder folder, IJavaProject project) { return null; } for (IJavaProject p : projects) { - project = p; - element = determineIfOnClasspath(folder, project); - if (element != null) - break; + if (!p.equals(lastProject)) { + element = determineIfOnClasspath(folder, p); + if (element != null) { + lastProjectUsed = p; + return element; + } + } } } } else {