From 15605e313eebd3494aad1cf25fa719831721a91a Mon Sep 17 00:00:00 2001 From: Snjezana Peco Date: Sun, 20 Jul 2025 21:01:49 +0200 Subject: [PATCH] Improve ProjectCommand.getMainClasses --- .../jdtls/ext/core/ProjectCommand.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index 1c89a202..3f10d3e6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -65,6 +66,7 @@ import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob; import org.eclipse.jdt.ls.core.internal.preferences.Preferences.ReferencedLibraries; +import org.eclipse.jdt.ls.core.internal.preferences.Preferences.SearchScope; import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; import org.eclipse.lsp4j.jsonrpc.json.adapters.EnumTypeAdapter; @@ -232,23 +234,32 @@ private static boolean exportJarExecution(String mainClass, Classpath[] classpat } public static List getMainClasses(List arguments, IProgressMonitor monitor) throws Exception { - List projectList = listProjects(arguments, monitor); - final List res = new ArrayList<>(); - List searchRoots = new ArrayList<>(); + List args = new ArrayList<>(arguments); + if (args.size() <= 1) { + args.add(Boolean.TRUE); + } else { + args.set(1, Boolean.TRUE); + } + List projectList = listProjects(args, monitor); if (projectList.size() == 0) { - return res; + return Collections.emptyList(); } - for (PackageNode project : projectList) { + final List res = new ArrayList<>(); + List javaProjects = new ArrayList<>(); + for (PackageNode project: projectList) { IJavaProject javaProject = PackageCommand.getJavaProject(project.getUri()); - for (IPackageFragmentRoot packageFragmentRoot : javaProject.getAllPackageFragmentRoots()) { - if (!packageFragmentRoot.isArchive()) { - searchRoots.add(packageFragmentRoot); - } + if (javaProject != null && javaProject.exists()) { + javaProjects.add(javaProject); } } - IJavaSearchScope scope = SearchEngine.createJavaSearchScope(searchRoots.toArray(new IJavaElement[0])); - SearchPattern pattern = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, - IJavaSearchConstants.DECLARATIONS, SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE); + int includeMask = IJavaSearchScope.SOURCES; + IJavaSearchScope scope = SearchEngine.createJavaSearchScope(javaProjects.toArray(new IJavaProject[0]), + includeMask); + SearchPattern pattern1 = SearchPattern.createPattern("main(String[]) void", IJavaSearchConstants.METHOD, + IJavaSearchConstants.DECLARATIONS, SearchPattern.R_CASE_SENSITIVE | SearchPattern.R_EXACT_MATCH); + SearchPattern pattern2 = SearchPattern.createPattern("main() void", IJavaSearchConstants.METHOD, + IJavaSearchConstants.DECLARATIONS, SearchPattern.R_CASE_SENSITIVE | SearchPattern.R_EXACT_MATCH); + SearchPattern pattern = SearchPattern.createOrPattern(pattern1, pattern2); SearchRequestor requestor = new SearchRequestor() { @Override public void acceptSearchMatch(SearchMatch match) { @@ -275,7 +286,7 @@ public void acceptSearchMatch(SearchMatch match) { SearchEngine searchEngine = new SearchEngine(); try { searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, - requestor, new NullProgressMonitor()); + requestor, monitor); } catch (CoreException e) { // ignore }