Skip to content

Commit

Permalink
[performance] determineIfOnClasspath with last project used #3470
Browse files Browse the repository at this point in the history
Instead of randomly looping over all projects try the last successful
first.

Tested by JavaModelTests.testCreatePkgHandleInDifferentProject()

#3470
  • Loading branch information
jukzi committed Dec 20, 2024
1 parent 6454567 commit fe3554b
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 @@ -980,6 +980,8 @@ public static IJavaElement create(IFile file, IJavaProject project) {
return null;
}

private static volatile String lastProjectNameUsed;

/**
* 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 +1001,15 @@ public static IJavaElement create(IFolder folder, IJavaProject project) {
project = JavaCore.create(folder.getProject());
element = determineIfOnClasspath(folder, project);
if (element == null) {
IJavaProject lastProject = lastProjectNameUsed == null ? null
: JavaModelManager.getJavaModelManager().getJavaModel().getJavaProject(lastProjectNameUsed);
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) {
lastProjectNameUsed = p.getElementName();
return element;
}
}
}
}
} else {
Expand Down

0 comments on commit fe3554b

Please sign in to comment.