in jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java [283:344]
private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) {
ArrayList<PackageNode> children = new ArrayList<>();
IJavaProject javaProject = getJavaProject(query.getProjectUri());
if (javaProject != null) {
try {
IClasspathEntry[] references = javaProject.getRawClasspath();
IClasspathEntry containerEntry = null;
for (IClasspathEntry reference : references) {
if (reference.getPath().equals(Path.fromPortableString(query.getPath()))) {
containerEntry = reference;
break;
}
}
if (containerEntry != null) {
IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(containerEntry);
for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots) {
PackageRootNode node = PackageNode.createNodeForPackageFragmentRoot(fragmentRoot);
if (StringUtils.isNotBlank(node.getName())) {
node.setHandlerIdentifier(fragmentRoot.getHandleIdentifier());
if (fragmentRoot instanceof JrtPackageFragmentRoot) {
node.setModuleName(fragmentRoot.getModuleDescription().getElementName());
}
IClasspathEntry resolvedClasspathEntry = fragmentRoot.getResolvedClasspathEntry();
if (resolvedClasspathEntry != null) {
for (IClasspathAttribute attribute : resolvedClasspathEntry.getExtraAttributes()) {
node.setMetaDataValue(attribute.getName(), attribute.getValue());
}
}
children.add(node);
} else {
// for invisible project, the package root name may become empty after removing the '_',
// in this case, we skip this root node from showing in the explorer and keep finding its children.
PackageParams subQuery = new PackageParams(NodeKind.PACKAGEROOT, query.getProjectUri(),
query.getPath(), fragmentRoot.getHandleIdentifier());
List<PackageNode> packageNodes = getPackages(subQuery, pm);
children.addAll(packageNodes);
}
}
return children;
} else if (query.getPath().equals(PackageNode.REFERENCED_LIBRARIES_PATH)) {
// Process referenced libraries
List<PackageNode> referLibs = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY)
.map(classpath -> PackageNode.createNodeForClasspathEntry(classpath, javaProject, NodeKind.PACKAGEROOT))
.filter(entry -> entry != null)
.collect(Collectors.toList());
List<PackageNode> referVariables = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE)
.map(classpath -> PackageNode.createNodeForClasspathVariable(classpath)).filter(entry -> entry != null)
.collect(Collectors.toList());
children.addAll(referLibs);
children.addAll(referVariables);
return children;
}
} catch (CoreException e) {
JdtlsExtActivator.logException("Problem load project JAR entries ", e);
}
}
return Collections.emptyList();
}