Skip to content

Commit

Permalink
[performance] determineIfOnClasspath with last project used eclipse-j…
Browse files Browse the repository at this point in the history
…dt#3470

Instead of randomly looping over all projects try the last successful
first.

Tested by JavaModelTests.testCreatePkgHandleInDifferentProject()

eclipse-jdt#3470
  • Loading branch information
jukzi committed Dec 18, 2024
1 parent 07c7cda commit 8697e97
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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",
"<null>", // 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"});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
package org.eclipse.jdt.internal.core;

import java.io.*;
import java.lang.ref.WeakReference;
import java.net.URI;
import java.text.MessageFormat;
import java.time.Instant;
Expand Down Expand Up @@ -980,6 +981,8 @@ public static IJavaElement create(IFile file, IJavaProject project) {
return null;
}

private static volatile WeakReference<IJavaProject> lastProjectUsed = new WeakReference<>(null);

/**
* Returns the package fragment or package fragment root corresponding to the given folder,
* its parent or great parent being the given project.
Expand All @@ -999,6 +1002,14 @@ public static IJavaElement create(IFolder folder, IJavaProject project) {
project = JavaCore.create(folder.getProject());
element = determineIfOnClasspath(folder, project);
if (element == null) {
IJavaProject lastProject = lastProjectUsed.get();
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 {
Expand All @@ -1007,10 +1018,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 = new WeakReference<>(p);
return element;
}
}
}
}
} else {
Expand Down

0 comments on commit 8697e97

Please sign in to comment.