Skip to content

Commit 1ec06e9

Browse files
authored
bugfix: Show JDK 11 classes in project explorer (#295)
1 parent dbd132f commit 1ec06e9

File tree

9 files changed

+144
-113
lines changed

9 files changed

+144
-113
lines changed

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java

Lines changed: 87 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.eclipse.jdt.core.IJarEntryResource;
4242
import org.eclipse.jdt.core.IJavaElement;
4343
import org.eclipse.jdt.core.IJavaProject;
44+
import org.eclipse.jdt.core.IModuleDescription;
4445
import org.eclipse.jdt.core.IPackageFragment;
4546
import org.eclipse.jdt.core.IPackageFragmentRoot;
4647
import org.eclipse.jdt.core.IType;
@@ -125,8 +126,8 @@ public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMon
125126
if (typeRoot != null && typeRoot.findPrimaryType() != null) {
126127
// Add project node:
127128
result.add(PackageNode.createNodeForProject(typeRoot));
128-
IPackageFragment packageFragment = (IPackageFragment) typeRoot.getParent();
129-
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getParent();
129+
IPackageFragment packageFragment = (IPackageFragment) typeRoot.getAncestor(IJavaElement.PACKAGE_FRAGMENT);
130+
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
130131
// TODO: Let the client handle the display instead. Server side should always
131132
// provide the container node.
132133
boolean isClassFile = typeRoot instanceof IClassFile;
@@ -280,6 +281,7 @@ private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IP
280281
displayName = ExtUtils.removeProjectSegment(javaProject.getElementName(), fragmentRoot.getPath()).toPortableString();
281282
}
282283
PackageRootNode node = new PackageRootNode(fragmentRoot, displayName, NodeKind.PACKAGEROOT);
284+
node.setHandlerIdentifier(fragmentRoot.getHandleIdentifier());
283285
children.add(node);
284286
if (fragmentRoot instanceof JrtPackageFragmentRoot) {
285287
node.setModuleName(fragmentRoot.getModuleDescription().getElementName());
@@ -317,117 +319,103 @@ private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IP
317319
}
318320

319321
private static List<PackageNode> getPackages(PackageParams query, IProgressMonitor pm) {
320-
IJavaProject javaProject = getJavaProject(query.getProjectUri());
321-
if (javaProject != null) {
322-
try {
323-
IPackageFragmentRoot packageRoot = javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath()));
324-
if (packageRoot == null) {
325-
throw new CoreException(
326-
new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath())));
327-
}
328-
Object[] result = getPackageFragmentRootContent(packageRoot, pm);
329-
return convertToPackageNode(result, packageRoot);
330-
} catch (CoreException e) {
331-
JdtlsExtActivator.logException("Problem load project package ", e);
322+
try {
323+
IPackageFragmentRoot packageRoot = (IPackageFragmentRoot) JavaCore.create(query.getHandlerIdentifier());
324+
if (packageRoot == null) {
325+
throw new CoreException(
326+
new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath())));
332327
}
328+
Object[] result = getPackageFragmentRootContent(packageRoot, pm);
329+
return convertToPackageNode(result, packageRoot);
330+
} catch (CoreException e) {
331+
JdtlsExtActivator.logException("Problem load project package ", e);
333332
}
334333
return Collections.emptyList();
335334
}
336335

337336
private static List<PackageNode> getRootTypes(PackageParams query, IProgressMonitor pm) {
338-
IJavaProject javaProject = getJavaProject(query.getProjectUri());
339-
if (javaProject != null) {
340-
try {
341-
IPackageFragmentRoot packageRoot = javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath()));
342-
if (packageRoot == null) {
343-
throw new CoreException(
344-
new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath())));
345-
}
346-
IPackageFragment packageFragment = packageRoot
347-
.getPackageFragment(PackageNode.DEFAULT_PACKAGE_DISPLAYNAME.equals(query.getPath()) ? "" : query.getPath());
348-
if (packageFragment != null) {
349-
List<IType> primaryTypes = new ArrayList<>();
350-
for (IJavaElement element : packageFragment.getChildren()) {
351-
if (element instanceof ITypeRoot) {
352-
// Filter out the inner class files
353-
if (element instanceof IClassFile && element.getElementName().contains("$")) {
354-
continue;
355-
}
356-
IType primaryType = ((ITypeRoot) element).findPrimaryType();
357-
if (primaryType != null) {
358-
primaryTypes.add(primaryType);
359-
}
337+
try {
338+
IPackageFragment packageFragment = (IPackageFragment) JavaCore.create(query.getHandlerIdentifier());
339+
if (packageFragment != null) {
340+
List<IType> primaryTypes = new ArrayList<>();
341+
for (IJavaElement element : packageFragment.getChildren()) {
342+
if (element instanceof ITypeRoot) {
343+
// Filter out the inner class files
344+
if (element instanceof IClassFile && element.getElementName().contains("$")) {
345+
continue;
346+
}
347+
IType primaryType = ((ITypeRoot) element).findPrimaryType();
348+
if (primaryType != null) {
349+
primaryTypes.add(primaryType);
360350
}
361351
}
362-
Object[] nonJavaResources = packageFragment.getNonJavaResources();
363-
List<PackageNode> rootTypeNodes = primaryTypes.stream()
364-
.map(PackageNode::createNodeForPrimaryType)
365-
.collect(Collectors.toList());
366-
if (nonJavaResources.length == 0) {
367-
return rootTypeNodes;
368-
}
369-
// when .java files and other .properties files are mixed up
370-
rootTypeNodes.addAll(
371-
Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> {
372-
if (resource instanceof IFile) {
373-
IFile file = (IFile) resource;
374-
PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
375-
item.setUri(JDTUtils.getFileURI(file));
376-
return item;
377-
} else {
378-
JarEntryFile file = (JarEntryFile) resource;
379-
PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
380-
entry.setUri(ExtUtils.toUri((JarEntryFile) resource));
381-
return entry;
382-
}
383-
384-
}).collect(Collectors.toList()));
352+
}
353+
Object[] nonJavaResources = packageFragment.getNonJavaResources();
354+
List<PackageNode> rootTypeNodes = primaryTypes.stream()
355+
.map(PackageNode::createNodeForPrimaryType)
356+
.collect(Collectors.toList());
357+
if (nonJavaResources.length == 0) {
385358
return rootTypeNodes;
386359
}
387-
} catch (CoreException e) {
388-
JdtlsExtActivator.logException("Problem load project classfile list ", e);
360+
// when .java files and other .properties files are mixed up
361+
rootTypeNodes.addAll(
362+
Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> {
363+
if (resource instanceof IFile) {
364+
IFile file = (IFile) resource;
365+
PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
366+
item.setUri(JDTUtils.getFileURI(file));
367+
return item;
368+
} else {
369+
JarEntryFile file = (JarEntryFile) resource;
370+
PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
371+
entry.setUri(ExtUtils.toUri((JarEntryFile) resource));
372+
return entry;
373+
}
374+
375+
}).collect(Collectors.toList()));
376+
return rootTypeNodes;
389377
}
378+
} catch (CoreException e) {
379+
JdtlsExtActivator.logException("Problem load project classfile list ", e);
390380
}
391381
return Collections.emptyList();
392382
}
393383

394384
private static List<PackageNode> getFolderChildren(PackageParams query, IProgressMonitor pm) {
395-
IJavaProject javaProject = getJavaProject(query.getProjectUri());
396-
if (javaProject != null) {
397-
try {
398-
IPackageFragmentRoot packageRoot = javaProject.findPackageFragmentRoot(Path.fromPortableString(query.getRootPath()));
399-
if (packageRoot == null) {
400-
throw new CoreException(
401-
new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath())));
402-
}
403-
if (packageRoot.getKind() == IPackageFragmentRoot.K_BINARY) {
404-
Object[] resources = packageRoot.getNonJavaResources();
405-
for (Object resource : resources) {
406-
if (pm.isCanceled()) {
407-
throw new OperationCanceledException();
408-
}
409-
if (resource instanceof JarEntryDirectory) {
410-
JarEntryDirectory directory = (JarEntryDirectory) resource;
411-
Object[] children = findJarDirectoryChildren(directory, query.getPath());
412-
if (children != null) {
413-
return convertToPackageNode(children, null);
414-
}
415-
}
385+
try {
386+
IPackageFragmentRoot packageRoot = (IPackageFragmentRoot) JavaCore.create(query.getHandlerIdentifier());
387+
if (packageRoot == null) {
388+
throw new CoreException(
389+
new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath())));
390+
}
391+
if (packageRoot.getKind() == IPackageFragmentRoot.K_BINARY) {
392+
Object[] resources = packageRoot.getNonJavaResources();
393+
for (Object resource : resources) {
394+
if (pm.isCanceled()) {
395+
throw new OperationCanceledException();
416396
}
417-
} else {
418-
IFolder folder = javaProject.getProject().getFolder(new Path(query.getPath()).makeRelativeTo(javaProject.getProject().getFullPath()));
419-
if (folder != null && folder.exists()) {
420-
Object[] children = JavaCore.create(folder) != null ? Arrays.stream(folder.members()).filter(t -> t instanceof IFile).toArray()
421-
: folder.members();
397+
if (resource instanceof JarEntryDirectory) {
398+
JarEntryDirectory directory = (JarEntryDirectory) resource;
399+
Object[] children = findJarDirectoryChildren(directory, query.getPath());
422400
if (children != null) {
423401
return convertToPackageNode(children, null);
424402
}
425403
}
426404
}
427-
428-
} catch (CoreException e) {
429-
JdtlsExtActivator.logException("Problem load project classfile list ", e);
405+
} else {
406+
IJavaProject javaProject = packageRoot.getJavaProject();
407+
IFolder folder = javaProject.getProject().getFolder(new Path(query.getPath()).makeRelativeTo(javaProject.getProject().getFullPath()));
408+
if (folder != null && folder.exists()) {
409+
Object[] children = JavaCore.create(folder) != null ? Arrays.stream(folder.members()).filter(t -> t instanceof IFile).toArray()
410+
: folder.members();
411+
if (children != null) {
412+
return convertToPackageNode(children, null);
413+
}
414+
}
430415
}
416+
417+
} catch (CoreException e) {
418+
JdtlsExtActivator.logException("Problem load project classfile list ", e);
431419
}
432420
return Collections.emptyList();
433421
}
@@ -446,6 +434,14 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root,
446434
}
447435
Object[] nonJavaResources = root.getNonJavaResources();
448436
Collections.addAll(result, nonJavaResources);
437+
438+
IModuleDescription moduleDescription = root.getModuleDescription();
439+
if (moduleDescription != null) {
440+
IClassFile moduleInfo = moduleDescription.getClassFile();
441+
if (moduleInfo != null) {
442+
result.add(moduleDescription.getClassFile());
443+
}
444+
}
449445
return result.toArray();
450446
}
451447

@@ -463,7 +459,7 @@ private static List<PackageNode> convertToPackageNode(Object[] rootContent, IPac
463459
result.add(entry);
464460
} else if (root instanceof IClassFile) {
465461
IClassFile classFile = (IClassFile) root;
466-
PackageNode entry = new PackageNode(classFile.getElementName(), null, NodeKind.PRIMARYTYPE);
462+
PackageNode entry = new PackageNode(classFile.getElementName(), null, NodeKind.FILE);
467463
entry.setUri(JDTUtils.toUri(classFile));
468464
result.add(entry);
469465
} else if (root instanceof JarEntryResource) {

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageParams.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,21 @@ public class PackageParams {
2525

2626
private String path;
2727

28+
private String handlerIdentifier;
29+
2830
private String rootPath;
2931

3032
public PackageParams() {
3133
}
3234

35+
public String getHandlerIdentifier() {
36+
return handlerIdentifier;
37+
}
38+
39+
public void setHandlerIdentifier(String handlerIdentifier) {
40+
this.handlerIdentifier = handlerIdentifier;
41+
}
42+
3343
public PackageParams(NodeKind kind, String projectUri) {
3444
this.kind = kind;
3545
this.projectUri = projectUri;

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public MainClassInfo(String name, String path) {
8686
public static List<PackageNode> listProjects(List<Object> arguments, IProgressMonitor monitor) {
8787
String workspaceUri = (String) arguments.get(0);
8888
IPath workspacePath = ResourceUtils.canonicalFilePathFromURI(workspaceUri);
89-
String invisibleProjectName = getWorkspaceInvisibleProjectName(workspacePath);
89+
String invisibleProjectName = ProjectUtils.getWorkspaceInvisibleProjectName(workspacePath);
9090

9191
IProject[] projects = getWorkspaceRoot().getProjects();
9292
ArrayList<PackageNode> children = new ArrayList<>();
@@ -96,12 +96,10 @@ public static List<PackageNode> listProjects(List<Object> arguments, IProgressMo
9696
continue;
9797
}
9898
if (project.exists() && (ResourceUtils.isContainedIn(project.getLocation(), paths) || Objects.equals(project.getName(), invisibleProjectName))) {
99-
PackageNode projectNode = new PackageNode(project.getName(), project.getFullPath().toPortableString(), NodeKind.PROJECT);
100-
projectNode.setUri(project.getLocationURI().toString());
99+
PackageNode projectNode = PackageNode.createNodeForProject(JavaCore.create(project));
101100
children.add(projectNode);
102101
}
103102
}
104-
105103
return children;
106104
}
107105

@@ -115,7 +113,7 @@ public static boolean refreshLibraries(List<Object> arguments, IProgressMonitor
115113
UpdateClasspathJob.getInstance().updateClasspath(JavaCore.create(project), libraries);
116114
return true;
117115
} catch (Exception e) {
118-
JavaLanguageServerPlugin.logException("Exception occured during waiting for classpath to be updated", e);
116+
JavaLanguageServerPlugin.logException("Exception occurred during waiting for classpath to be updated", e);
119117
return false;
120118
}
121119
}
@@ -124,12 +122,6 @@ private static IWorkspaceRoot getWorkspaceRoot() {
124122
return ResourcesPlugin.getWorkspace().getRoot();
125123
}
126124

127-
// TODO Use ProjectUtils.getWorkspaceInvisibleProjectName directly when the language server is released.
128-
private static String getWorkspaceInvisibleProjectName(IPath workspacePath) {
129-
String fileName = workspacePath.toFile().getName();
130-
return fileName + "_" + Integer.toHexString(workspacePath.toPortableString().hashCode());
131-
}
132-
133125
public static boolean exportJar(List<Object> arguments, IProgressMonitor monitor) {
134126
if (arguments.size() < 3) {
135127
return false;

jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/PackageNode.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ public class PackageNode {
8383
*/
8484
private String path;
8585

86+
/**
87+
* The handlerIdentifier
88+
*/
89+
private String handlerIdentifier;
90+
8691
/**
8792
* The URI value of the PackageNode
8893
*/
@@ -107,6 +112,20 @@ public PackageNode() {
107112

108113
}
109114

115+
public PackageNode(String name, String path, NodeKind kind) {
116+
this.name = name;
117+
this.path = path;
118+
this.kind = kind;
119+
}
120+
121+
public String getHandlerIdentifier() {
122+
return handlerIdentifier;
123+
}
124+
125+
public void setHandlerIdentifier(String handlerIdentifier) {
126+
this.handlerIdentifier = handlerIdentifier;
127+
}
128+
110129
public Map<String, Object> getMetaData() {
111130
return metaData;
112131
}
@@ -118,12 +137,6 @@ public void setMetaDataValue(String key, Object value) {
118137
this.metaData.put(key, value);
119138
}
120139

121-
public PackageNode(String name, String path, NodeKind kind) {
122-
this.name = name;
123-
this.path = path;
124-
this.kind = kind;
125-
}
126-
127140
public static PackageNode createNodeForProject(IJavaElement javaElement) {
128141
IProject proj = javaElement.getJavaProject().getProject();
129142
PackageNode projectNode = new PackageNode(proj.getName(), proj.getFullPath().toPortableString(), NodeKind.PROJECT);
@@ -148,7 +161,9 @@ public static PackageNode createNodeForResource(IResource resource) {
148161

149162
public static PackageNode createNodeForPackageFragment(IPackageFragment packageFragment) {
150163
String packageName = packageFragment.isDefaultPackage() ? DEFAULT_PACKAGE_DISPLAYNAME : packageFragment.getElementName();
151-
return new PackageNode(packageName, packageFragment.getPath().toPortableString(), NodeKind.PACKAGE);
164+
PackageNode fragmentNode = new PackageNode(packageName, packageFragment.getPath().toPortableString(), NodeKind.PACKAGE);
165+
fragmentNode.setHandlerIdentifier(packageFragment.getHandleIdentifier());
166+
return fragmentNode;
152167
}
153168

154169
public static PackageNode createNodeForVirtualContainer(IPackageFragmentRoot pkgRoot) throws JavaModelException {

src/java/hierarchicalPackageNodeData.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ export class HierarchicalPackageNodeData implements INodeData {
3737
return this.nodeData !== null;
3838
}
3939

40+
public get handlerIdentifier() {
41+
return this.nodeData.handlerIdentifier;
42+
}
43+
4044
private constructor(displayName: string, parentName: string) {
4145
this.displayName = displayName;
4246
this.name = parentName === "" ? displayName : parentName + "." + displayName;

0 commit comments

Comments
 (0)