in jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java [120:216]
public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMonitor pm) throws CoreException {
if (arguments == null || arguments.size() < 1) {
throw new IllegalArgumentException("Should have one argument for resolvePath");
}
String typeRootUri = (String) arguments.get(0);
List<PackageNode> result = new ArrayList<>();
URI uri = JDTUtils.toURI(typeRootUri);
ITypeRoot typeRoot = ExtUtils.JDT_SCHEME.equals(uri.getScheme()) ? JDTUtils.resolveClassFile(uri) : JDTUtils.resolveCompilationUnit(uri);
if (typeRoot != null && typeRoot.findPrimaryType() != null) {
// Add project node:
result.add(PackageNode.createNodeForProject(typeRoot));
IPackageFragment packageFragment = (IPackageFragment) typeRoot.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
if (!packageFragment.exists()) {
return Collections.emptyList();
}
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
// TODO: Let the client handle the display instead. Server side should always
// provide the container node.
boolean isClassFile = typeRoot instanceof IClassFile;
if (isClassFile) {
result.add(PackageNode.createNodeForVirtualContainer(pkgRoot));
}
// for invisible project, removing the '_' link name may cause an empty named package root
// in this case, we will avoid that 'empty' node from displaying
PackageNode pkgRootNode = PackageNode.createNodeForPackageFragmentRoot(pkgRoot);
if (StringUtils.isNotBlank(pkgRootNode.getName())) {
result.add(pkgRootNode);
}
if (!packageFragment.isDefaultPackage()) {
result.add(PackageNode.createNodeForPackageFragment(packageFragment));
}
result.add(PackageNode.createNodeForPrimaryType(typeRoot.findPrimaryType()));
} else if (ExtUtils.isJarResourceUri(uri)) {
IJarEntryResource resource = ExtUtils.getJarEntryResource(uri);
IPackageFragmentRoot pkgRoot = resource.getPackageFragmentRoot();
result.add(PackageNode.createNodeForProject(pkgRoot));
result.add(PackageNode.createNodeForVirtualContainer(resource.getPackageFragmentRoot()));
result.add(PackageNode.createNodeForPackageFragmentRoot(pkgRoot));
if (resource.getParent() instanceof IPackageFragment) {
IPackageFragment packageFragment = (IPackageFragment) resource.getParent();
if (!packageFragment.isDefaultPackage()) {
result.add(PackageNode.createNodeForPackageFragment(packageFragment));
}
} else {
int currentSize = result.size();
// visit back from file to the top folder
Object currentNode = resource.getParent();
while (currentNode instanceof JarEntryDirectory) {
JarEntryDirectory jarEntryDirectory = (JarEntryDirectory) currentNode;
PackageNode jarNode = getJarEntryResource(jarEntryDirectory);
if (jarNode != null) {
result.add(currentSize, jarNode);
}
currentNode = jarEntryDirectory.getParent();
}
}
PackageNode item = new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FILE);
item.setUri(ExtUtils.toUri(resource));
result.add(item);
} else {
// this is not a .java/.class file
IResource resource = JDTUtils.findResource(uri, ResourcesPlugin.getWorkspace().getRoot()::findFilesForLocationURI);
if (resource != null) {
IResource parent = resource.getParent();
IJavaElement parentJavaElement = JavaCore.create(parent);
if (parent instanceof IFolder && parentJavaElement instanceof IPackageFragment) {
IPackageFragment packageFragment = (IPackageFragment) parentJavaElement;
result.add(PackageNode.createNodeForProject(packageFragment));
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
// for invisible project, removing the '_' link name may cause an empty named package root
// in this case, we will avoid that 'empty' node from displaying
PackageNode pkgRootNode = PackageNode.createNodeForPackageFragmentRoot(pkgRoot);
if (StringUtils.isNotBlank(pkgRootNode.getName())) {
result.add(pkgRootNode);
}
if (!packageFragment.isDefaultPackage()) {
result.add(PackageNode.createNodeForPackageFragment(packageFragment));
}
PackageNode item = new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FILE);
item.setUri(JDTUtils.getFileURI(resource));
result.add(item);
} else {
return getParentAncestorNodes(resource);
}
} else {
IContainer container = JDTUtils.findFolder(typeRootUri);
IJavaElement element = JavaCore.create(container);
result.add(PackageNode.createNodeForProject(element));
}
}
return result;
}