public static List resolvePath()

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;
    }