in jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java [208:257]
public static List<MainClassInfo> getMainClasses(List<Object> arguments, IProgressMonitor monitor) throws Exception {
List<PackageNode> projectList = listProjects(arguments, monitor);
final List<MainClassInfo> res = new ArrayList<>();
List<IJavaElement> searchRoots = new ArrayList<>();
if (projectList.size() == 0) {
return res;
}
for (PackageNode project : projectList) {
IJavaProject javaProject = PackageCommand.getJavaProject(project.getUri());
for (IPackageFragmentRoot packageFragmentRoot : javaProject.getAllPackageFragmentRoots()) {
if (!packageFragmentRoot.isArchive()) {
searchRoots.add(packageFragmentRoot);
}
}
}
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);
SearchRequestor requestor = new SearchRequestor() {
@Override
public void acceptSearchMatch(SearchMatch match) {
Object element = match.getElement();
if (!(element instanceof IMethod)) {
return;
}
IMethod method = (IMethod) element;
try {
if (!method.isMainMethod() || method.getResource() == null || method.getJavaProject() == null) {
return;
}
String mainClass = method.getDeclaringType().getFullyQualifiedName();
String filePath = "";
if (match.getResource() instanceof IFile) {
filePath = match.getResource().getLocation().toOSString();
}
res.add(new MainClassInfo(mainClass, filePath));
} catch (JavaModelException e) {
// ignore
}
}
};
SearchEngine searchEngine = new SearchEngine();
try {
searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope,
requestor, new NullProgressMonitor());
} catch (CoreException e) {
// ignore
}
return res;
}