From c728c6f36608b6d97719e0606312074a4ffd9f99 Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Mon, 19 Nov 2018 12:24:13 +0800 Subject: [PATCH 1/6] Add referenced libraries as reference container --- .../jdtls/ext/core/PackageCommand.java | 117 ++++++++++++------ 1 file changed, 80 insertions(+), 37 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index e45bd645..7bdecda5 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -67,6 +67,8 @@ public class PackageCommand { private static final String DEFAULT_PACKAGE_DISPLAYNAME = "(default package)"; + private static final String REFERENCED_LIBRARIES_PATH = "REFERENCED_LIBRARIES_PATH"; + private static final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new CollectionTypeAdapterFactory()) .registerTypeAdapterFactory(new EnumTypeAdapterFactory()).create(); @@ -154,8 +156,13 @@ public static List resolvePath(List arguments, IProgressMon if (typeRoot instanceof IClassFile) { IClasspathEntry entry = pkgRoot.getRawClasspathEntry(); IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), typeRoot.getJavaProject()); - PackageNode containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, - entry.getEntryKind()); + PackageNode containerNode = null; + if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) { + containerNode = new ContainerNode("ReferencedLibraries", REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); + } else { + containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, + entry.getEntryKind()); + } result.add(containerNode); } result.add(rootNode); @@ -174,28 +181,19 @@ public static List resolvePath(List arguments, IProgressMon */ private static List getContainers(PackageParams query, IProgressMonitor pm) { IJavaProject javaProject = getJavaProject(query.getProjectUri()); - if (javaProject != null) { try { IClasspathEntry[] references = javaProject.getRawClasspath(); - return Arrays.stream(references).map(entry -> { - try { - entry = JavaCore.getResolvedClasspathEntry(entry); - IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), javaProject); - // HACK: There is an initialization issue for the first container. - if (container == null) { - container = JavaCore.getClasspathContainer(entry.getPath(), javaProject); - } - - if (container != null) { - return new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, - entry.getEntryKind()); - } - } catch (CoreException e) { - // Ignore it - } - return null; - }).filter(containerNode -> containerNode != null).collect(Collectors.toList()); + List result = Arrays.stream(references).filter(entry -> entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY) + .map(entry -> getNodeFromClasspathEntry(entry, javaProject, NodeKind.CONTAINER)).filter(containerNode -> containerNode != null) + .collect(Collectors.toList()); + + List referenceLibraries = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) + .collect(Collectors.toList()); + if (referenceLibraries.size() > 0) { + result.add(new ContainerNode("ReferencedLibraries", REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER)); + } + return result; } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project library ", e); } @@ -203,7 +201,46 @@ private static List getContainers(PackageParams query, IProgressMon return Collections.emptyList(); } + /** + * Get the correspond node of classpath, it may be container or a package root + * + * @param classpathEntry + * classpath + * @param javaProject + * correspond java project + * @param nodeKind + * could be CONTAINER or PACKAGEROOT(for referenced libraries) + * @return + */ + private static PackageNode getNodeFromClasspathEntry(IClasspathEntry classpathEntry, IJavaProject javaProject, NodeKind nodeKind) { + try { + IClasspathEntry entry = JavaCore.getResolvedClasspathEntry(classpathEntry); + IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), javaProject); + // HACK: There is an initialization issue for the first container. + if (container == null) { + container = JavaCore.getClasspathContainer(entry.getPath(), javaProject); + } + if (container != null) { + switch (nodeKind) { + case CONTAINER: + return new ContainerNode(container.getDescription(), container.getPath().toPortableString(), nodeKind, entry.getEntryKind()); + case PACKAGEROOT: + // Use package name as package root name + String[] pathSegments = container.getPath().segments(); + return new PackageRootNode(pathSegments[pathSegments.length - 1], container.getPath().toPortableString(), nodeKind, + IClasspathEntry.CPE_PROJECT); + default: + return null; + } + } + } catch (CoreException e) { + // Ignore it + } + return null; + } + private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { + ArrayList children = new ArrayList<>(); IJavaProject javaProject = getJavaProject(query.getProjectUri()); if (javaProject != null) { @@ -217,7 +254,6 @@ private static List getPackageFragmentRoots(PackageParams query, IP } } if (containerEntry != null) { - ArrayList children = new ArrayList<>(); IPackageFragmentRoot[] packageFragmentRoots = javaProject.findPackageFragmentRoots(containerEntry); for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots) { String displayName = fragmentRoot.getElementName(); @@ -232,6 +268,13 @@ private static List getPackageFragmentRoots(PackageParams query, IP } } return children; + } else if (query.getPath().equals(REFERENCED_LIBRARIES_PATH)) { + // Process referenced libraries + List classpaths = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) + .map(classpath -> getNodeFromClasspathEntry(classpath, javaProject, NodeKind.PACKAGEROOT)).filter(entry -> entry != null) + .collect(Collectors.toList()); + children.addAll(classpaths); + return children; } } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project JAR entries ", e); @@ -274,7 +317,7 @@ private static List getRootTypes(PackageParams query, IProgressMoni if (packageFragment != null) { IJavaElement[] types = packageFragment.getChildren(); Object[] nonJavaResources = packageFragment.getNonJavaResources(); - List rootTypeNodes = Arrays.stream(types).filter(typeRoot -> !typeRoot.getElementName().contains("$")).map(typeRoot -> { + List rootTypeNodes = Arrays.stream(types).filter(typeRoot -> !typeRoot.getElementName().contains("$")).map(typeRoot -> { PackageNode item = new TypeRootNode(typeRoot.getElementName(), typeRoot.getPath().toPortableString(), NodeKind.TYPEROOT, typeRoot instanceof IClassFile ? TypeRootNode.K_BINARY : TypeRootNode.K_SOURCE); if (typeRoot instanceof ICompilationUnit) { @@ -289,20 +332,20 @@ private static List getRootTypes(PackageParams query, IProgressMoni } // when .java files and other .properties files are mixed up rootTypeNodes.addAll( - Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> { - if (resource instanceof IFile) { - IFile file = (IFile) resource; - PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - item.setUri(JDTUtils.getFileURI(file)); - return item; - } else { - JarEntryFile file = (JarEntryFile) resource; - PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); - return entry; - } - - }).collect(Collectors.toList())); + Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> { + if (resource instanceof IFile) { + IFile file = (IFile) resource; + PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); + item.setUri(JDTUtils.getFileURI(file)); + return item; + } else { + JarEntryFile file = (JarEntryFile) resource; + PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); + entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); + return entry; + } + + }).collect(Collectors.toList())); return rootTypeNodes; } } catch (CoreException e) { From 1946e301b46ac1bafaffc8c593c9e241cd3b1433 Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Tue, 20 Nov 2018 11:35:10 +0800 Subject: [PATCH 2/6] Add support for Referenced Variable --- .../jdtls/ext/core/PackageCommand.java | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 7bdecda5..ae5e754d 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.microsoft.jdtls.ext.core; +import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -69,6 +70,8 @@ public class PackageCommand { private static final String REFERENCED_LIBRARIES_PATH = "REFERENCED_LIBRARIES_PATH"; + private static final String REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries"; + private static final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new CollectionTypeAdapterFactory()) .registerTypeAdapterFactory(new EnumTypeAdapterFactory()).create(); @@ -99,7 +102,6 @@ public static List getChildren(List arguments, IProgressMon throw new IllegalArgumentException("Should have at least one arugment for getChildren"); } PackageParams params = gson.fromJson(gson.toJson(arguments.get(0)), PackageParams.class); - BiFunction> loader = commands.get(params.getKind()); if (loader == null) { throw new CoreException(new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("Unknown classpath item type: %s", params.getKind()))); @@ -146,7 +148,13 @@ public static List resolvePath(List arguments, IProgressMon IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getParent(); PackageNode rootNode = null; if (typeRoot instanceof IClassFile) { - rootNode = new PackageRootNode(pkgRoot.getElementName(), pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind()); + IClasspathEntry entry = pkgRoot.getRawClasspathEntry(); + // Process Referenced Variable + if (entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { + rootNode = getNodeFromClasspathVariable(entry); + } else { + rootNode = new PackageRootNode(pkgRoot.getElementName(), pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind()); + } } else { rootNode = new PackageRootNode(ExtUtils.removeProjectSegment(typeRoot.getJavaProject().getElementName(), pkgRoot.getPath()).toPortableString(), pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind()); @@ -157,8 +165,9 @@ public static List resolvePath(List arguments, IProgressMon IClasspathEntry entry = pkgRoot.getRawClasspathEntry(); IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), typeRoot.getJavaProject()); PackageNode containerNode = null; - if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) { - containerNode = new ContainerNode("ReferencedLibraries", REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); + if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { + containerNode = new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, + IClasspathEntry.CPE_CONTAINER); } else { containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, entry.getEntryKind()); @@ -184,14 +193,16 @@ private static List getContainers(PackageParams query, IProgressMon if (javaProject != null) { try { IClasspathEntry[] references = javaProject.getRawClasspath(); - List result = Arrays.stream(references).filter(entry -> entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY) + List result = Arrays.stream(references) + .filter(entry -> entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY && entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE) .map(entry -> getNodeFromClasspathEntry(entry, javaProject, NodeKind.CONTAINER)).filter(containerNode -> containerNode != null) .collect(Collectors.toList()); - - List referenceLibraries = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) + List referenceLibraries = Arrays.stream(references) + .filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) .collect(Collectors.toList()); if (referenceLibraries.size() > 0) { - result.add(new ContainerNode("ReferencedLibraries", REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER)); + result.add(new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, + IClasspathEntry.CPE_CONTAINER)); } return result; } catch (CoreException e) { @@ -234,11 +245,23 @@ private static PackageNode getNodeFromClasspathEntry(IClasspathEntry classpathEn } } } catch (CoreException e) { + e.printStackTrace(); // Ignore it } return null; } + private static PackageNode getNodeFromClasspathVariable(IClasspathEntry classpathEntry) { + IClasspathEntry entry = JavaCore.getResolvedClasspathEntry(classpathEntry); + String name = classpathEntry.getPath().toPortableString(); + String path = entry.getPath().toPortableString(); + if (new File(path).isDirectory()) { + return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, IClasspathEntry.CPE_LIBRARY); + } else { + return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, IClasspathEntry.CPE_PROJECT); + } + } + private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { ArrayList children = new ArrayList<>(); IJavaProject javaProject = getJavaProject(query.getProjectUri()); @@ -270,10 +293,13 @@ private static List getPackageFragmentRoots(PackageParams query, IP return children; } else if (query.getPath().equals(REFERENCED_LIBRARIES_PATH)) { // Process referenced libraries - List classpaths = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) + List referLibs = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) .map(classpath -> getNodeFromClasspathEntry(classpath, javaProject, NodeKind.PACKAGEROOT)).filter(entry -> entry != null) .collect(Collectors.toList()); - children.addAll(classpaths); + List referValues = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) + .map(classpath -> getNodeFromClasspathVariable(classpath)).filter(entry -> entry != null).collect(Collectors.toList()); + children.addAll(referLibs); + children.addAll(referValues); return children; } } catch (CoreException e) { @@ -286,9 +312,7 @@ private static List getPackageFragmentRoots(PackageParams query, IP private static List getPackages(PackageParams query, IProgressMonitor pm) { IJavaProject javaProject = getJavaProject(query.getProjectUri()); - if (javaProject != null) { - try { IPackageFragmentRoot packageRoot = javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath())); if (packageRoot == null) { From db123a36b77d268d0de530f5c053d04884f3642e Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Tue, 20 Nov 2018 12:52:05 +0800 Subject: [PATCH 3/6] Resolve comments --- .../jdtls/ext/core/PackageCommand.java | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index ae5e754d..5fb29c3f 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -216,12 +216,12 @@ private static List getContainers(PackageParams query, IProgressMon * Get the correspond node of classpath, it may be container or a package root * * @param classpathEntry - * classpath + * classpath entry * @param javaProject * correspond java project * @param nodeKind * could be CONTAINER or PACKAGEROOT(for referenced libraries) - * @return + * @return correspond PackageNode of classpath entry */ private static PackageNode getNodeFromClasspathEntry(IClasspathEntry classpathEntry, IJavaProject javaProject, NodeKind nodeKind) { try { @@ -245,21 +245,24 @@ private static PackageNode getNodeFromClasspathEntry(IClasspathEntry classpathEn } } } catch (CoreException e) { - e.printStackTrace(); - // Ignore it + JdtlsExtActivator.logException("Problems when convert classpath entry to package node ", e); } return null; } + /** + * Get correspond node of referenced variable + * + * @param classpathEntry + * referenced cariable's classpath entry + * @return correspond package node + */ private static PackageNode getNodeFromClasspathVariable(IClasspathEntry classpathEntry) { IClasspathEntry entry = JavaCore.getResolvedClasspathEntry(classpathEntry); String name = classpathEntry.getPath().toPortableString(); String path = entry.getPath().toPortableString(); - if (new File(path).isDirectory()) { - return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, IClasspathEntry.CPE_LIBRARY); - } else { - return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, IClasspathEntry.CPE_PROJECT); - } + boolean isDirectory = new File(path).isDirectory(); + return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, isDirectory ? IClasspathEntry.CPE_LIBRARY : IClasspathEntry.CPE_PROJECT); } private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { @@ -296,10 +299,10 @@ private static List getPackageFragmentRoots(PackageParams query, IP List referLibs = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) .map(classpath -> getNodeFromClasspathEntry(classpath, javaProject, NodeKind.PACKAGEROOT)).filter(entry -> entry != null) .collect(Collectors.toList()); - List referValues = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) + List referVariables = Arrays.stream(references).filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) .map(classpath -> getNodeFromClasspathVariable(classpath)).filter(entry -> entry != null).collect(Collectors.toList()); children.addAll(referLibs); - children.addAll(referValues); + children.addAll(referVariables); return children; } } catch (CoreException e) { From b13f924cb1dd112b3fdad1af3c77b74e30829150 Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Tue, 20 Nov 2018 13:54:19 +0800 Subject: [PATCH 4/6] Resolve comments --- .../jdtls/ext/core/PackageCommand.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 5fb29c3f..38dc5e6e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -166,8 +166,7 @@ public static List resolvePath(List arguments, IProgressMon IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), typeRoot.getJavaProject()); PackageNode containerNode = null; if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { - containerNode = new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, - IClasspathEntry.CPE_CONTAINER); + containerNode = getReferencedLibrariesContainerNode(); } else { containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, entry.getEntryKind()); @@ -197,12 +196,10 @@ private static List getContainers(PackageParams query, IProgressMon .filter(entry -> entry.getEntryKind() != IClasspathEntry.CPE_LIBRARY && entry.getEntryKind() != IClasspathEntry.CPE_VARIABLE) .map(entry -> getNodeFromClasspathEntry(entry, javaProject, NodeKind.CONTAINER)).filter(containerNode -> containerNode != null) .collect(Collectors.toList()); - List referenceLibraries = Arrays.stream(references) - .filter(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) - .collect(Collectors.toList()); - if (referenceLibraries.size() > 0) { - result.add(new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, - IClasspathEntry.CPE_CONTAINER)); + boolean isReferencedLibrariesExist = Arrays.stream(references) + .anyMatch(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE); + if (isReferencedLibrariesExist) { + result.add(getReferencedLibrariesContainerNode()); } return result; } catch (CoreException e) { @@ -212,6 +209,10 @@ private static List getContainers(PackageParams query, IProgressMon return Collections.emptyList(); } + private static ContainerNode getReferencedLibrariesContainerNode() { + return new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); + } + /** * Get the correspond node of classpath, it may be container or a package root * @@ -239,7 +240,7 @@ private static PackageNode getNodeFromClasspathEntry(IClasspathEntry classpathEn // Use package name as package root name String[] pathSegments = container.getPath().segments(); return new PackageRootNode(pathSegments[pathSegments.length - 1], container.getPath().toPortableString(), nodeKind, - IClasspathEntry.CPE_PROJECT); + IPackageFragmentRoot.K_BINARY); default: return null; } @@ -262,7 +263,7 @@ private static PackageNode getNodeFromClasspathVariable(IClasspathEntry classpat String name = classpathEntry.getPath().toPortableString(); String path = entry.getPath().toPortableString(); boolean isDirectory = new File(path).isDirectory(); - return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, isDirectory ? IClasspathEntry.CPE_LIBRARY : IClasspathEntry.CPE_PROJECT); + return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, isDirectory ? IPackageFragmentRoot.K_SOURCE : IPackageFragmentRoot.K_BINARY); } private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { From 2f72289698738f2f92af203dc3592117229a905d Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Tue, 20 Nov 2018 14:11:52 +0800 Subject: [PATCH 5/6] Set entry kind to BINARY for referenced variable which refers to folder --- .../src/com/microsoft/jdtls/ext/core/PackageCommand.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 38dc5e6e..e86deb9c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -10,7 +10,6 @@ *******************************************************************************/ package com.microsoft.jdtls.ext.core; -import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -209,6 +208,9 @@ private static List getContainers(PackageParams query, IProgressMon return Collections.emptyList(); } + /** + * Get container node of referenced libraries + */ private static ContainerNode getReferencedLibrariesContainerNode() { return new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); } @@ -262,8 +264,7 @@ private static PackageNode getNodeFromClasspathVariable(IClasspathEntry classpat IClasspathEntry entry = JavaCore.getResolvedClasspathEntry(classpathEntry); String name = classpathEntry.getPath().toPortableString(); String path = entry.getPath().toPortableString(); - boolean isDirectory = new File(path).isDirectory(); - return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, isDirectory ? IPackageFragmentRoot.K_SOURCE : IPackageFragmentRoot.K_BINARY); + return new PackageRootNode(name, path, NodeKind.PACKAGEROOT, IPackageFragmentRoot.K_BINARY); } private static List getPackageFragmentRoots(PackageParams query, IProgressMonitor pm) { From 35efcfda35aa455575490f6b8d87b16d2bca45f4 Mon Sep 17 00:00:00 2001 From: Hanxiao Liu Date: Tue, 20 Nov 2018 14:26:30 +0800 Subject: [PATCH 6/6] Resolve comments --- .../microsoft/jdtls/ext/core/PackageCommand.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index e86deb9c..7353d02a 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -71,6 +71,9 @@ public class PackageCommand { private static final String REFERENCED_LIBRARIES_CONTAINER_NAME = "Referenced Libraries"; + private static final ContainerNode REFERENCED_LIBRARIES_CONTAINER = new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, + NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); + private static final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new CollectionTypeAdapterFactory()) .registerTypeAdapterFactory(new EnumTypeAdapterFactory()).create(); @@ -165,7 +168,7 @@ public static List resolvePath(List arguments, IProgressMon IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), typeRoot.getJavaProject()); PackageNode containerNode = null; if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE) { - containerNode = getReferencedLibrariesContainerNode(); + containerNode = REFERENCED_LIBRARIES_CONTAINER; } else { containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, entry.getEntryKind()); @@ -198,7 +201,7 @@ private static List getContainers(PackageParams query, IProgressMon boolean isReferencedLibrariesExist = Arrays.stream(references) .anyMatch(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE); if (isReferencedLibrariesExist) { - result.add(getReferencedLibrariesContainerNode()); + result.add(REFERENCED_LIBRARIES_CONTAINER); } return result; } catch (CoreException e) { @@ -208,13 +211,6 @@ private static List getContainers(PackageParams query, IProgressMon return Collections.emptyList(); } - /** - * Get container node of referenced libraries - */ - private static ContainerNode getReferencedLibrariesContainerNode() { - return new ContainerNode(REFERENCED_LIBRARIES_CONTAINER_NAME, REFERENCED_LIBRARIES_PATH, NodeKind.CONTAINER, IClasspathEntry.CPE_CONTAINER); - } - /** * Get the correspond node of classpath, it may be container or a package root *