Skip to content

Commit 4799002

Browse files
committed
1. Add logic to read common file from a jar package.
2. Provide sync to .class files
1 parent 311d09f commit 4799002

File tree

2 files changed

+66
-15
lines changed

2 files changed

+66
-15
lines changed

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

+21
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,16 @@
1515
import java.io.InputStream;
1616
import java.net.URI;
1717
import java.nio.charset.StandardCharsets;
18+
import java.util.Arrays;
1819

1920
import org.apache.commons.io.IOUtils;
21+
import org.apache.commons.lang3.StringUtils;
2022
import org.eclipse.core.runtime.CoreException;
2123
import org.eclipse.core.runtime.IProgressMonitor;
2224
import org.eclipse.core.runtime.IStatus;
2325
import org.eclipse.core.runtime.Status;
2426
import org.eclipse.jdt.core.IJarEntryResource;
27+
import org.eclipse.jdt.core.IPackageFragment;
2528
import org.eclipse.jdt.core.IPackageFragmentRoot;
2629
import org.eclipse.jdt.core.JavaCore;
2730
import org.eclipse.jdt.internal.core.JarEntryDirectory;
@@ -64,6 +67,24 @@ private String getContent(String rootId, String path, IProgressMonitor pm) {
6467
}
6568
}
6669
}
70+
// if the file exists in the java packages
71+
String[] segments = StringUtils.split(path, "/");
72+
String packageName = StringUtils.join(Arrays.asList(segments).subList(0, segments.length - 1), '.');
73+
IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName);
74+
if (packageFragment != null && packageFragment.exists()) {
75+
76+
Object[] objs = packageFragment.getNonJavaResources();
77+
for (Object obj : objs) {
78+
if (obj instanceof IJarEntryResource) {
79+
IJarEntryResource child = (IJarEntryResource) obj;
80+
if (child instanceof JarEntryFile && child.getFullPath().toPortableString().equals(path)) {
81+
return readFileContent((JarEntryFile) child);
82+
}
83+
}
84+
85+
}
86+
}
87+
6788
}
6889
} catch (CoreException e) {
6990
JavaLanguageServerPlugin.logException("Problem get JarEntryFile content ", e);

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

+45-15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
*******************************************************************************/
1111
package com.microsoft.jdtls.ext.core;
1212

13+
import java.net.URI;
1314
import java.util.ArrayList;
1415
import java.util.Arrays;
1516
import java.util.Collections;
@@ -42,6 +43,7 @@
4243
import org.eclipse.jdt.core.IJavaProject;
4344
import org.eclipse.jdt.core.IPackageFragment;
4445
import org.eclipse.jdt.core.IPackageFragmentRoot;
46+
import org.eclipse.jdt.core.ITypeRoot;
4547
import org.eclipse.jdt.core.JavaCore;
4648
import org.eclipse.jdt.core.JavaModelException;
4749
import org.eclipse.jdt.internal.core.JarEntryDirectory;
@@ -122,26 +124,45 @@ public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMon
122124

123125
List<PackageNode> result = new ArrayList<>();
124126

125-
ICompilationUnit cu = JDTUtils.resolveCompilationUnit(typeRootUri);
126-
if (cu != null) {
127+
URI uri = JDTUtils.toURI(typeRootUri);
128+
ITypeRoot typeRoot = null;
129+
if ("jdt".equals(uri.getScheme())) {
130+
typeRoot = JDTUtils.resolveClassFile(uri);
131+
} else {
132+
typeRoot = JDTUtils.resolveCompilationUnit(uri);
133+
}
134+
if (typeRoot != null) {
127135
// Add project node:
128-
IProject proj = cu.getJavaProject().getProject();
136+
IProject proj = typeRoot.getJavaProject().getProject();
129137
PackageNode projectNode = new PackageNode(proj.getName(), proj.getFullPath().toPortableString(), NodeKind.PROJECT);
130138
projectNode.setUri(proj.getLocationURI().toString());
131139
result.add(projectNode);
132140

133-
IPackageFragment packageFragment = (IPackageFragment) cu.getParent();
141+
IPackageFragment packageFragment = (IPackageFragment) typeRoot.getParent();
134142
String packageName = packageFragment.isDefaultPackage() ? DEFAULT_PACKAGE_DISPLAYNAME : packageFragment.getElementName();
135143
PackageNode packageNode = new PackageNode(packageName, packageFragment.getPath().toPortableString(), NodeKind.PACKAGE);
136144
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getParent();
137-
PackageNode rootNode = new PackageRootNode(
138-
ExtUtils.removeProjectSegment(cu.getJavaProject().getElementName(), pkgRoot.getPath()).toPortableString(),
139-
pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind());
145+
PackageNode rootNode = null;
146+
if (typeRoot instanceof IClassFile) {
147+
rootNode = new PackageRootNode(pkgRoot.getElementName(), pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind());
148+
} else {
149+
rootNode = new PackageRootNode(ExtUtils.removeProjectSegment(typeRoot.getJavaProject().getElementName(), pkgRoot.getPath()).toPortableString(),
150+
pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind());
151+
}
152+
// TODO: Let the client handle the display instead. Server side should always
153+
// provide the container node.
154+
if (typeRoot instanceof IClassFile) {
155+
IClasspathEntry entry = pkgRoot.getRawClasspathEntry();
156+
IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), typeRoot.getJavaProject());
157+
PackageNode containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER,
158+
entry.getEntryKind());
159+
result.add(containerNode);
160+
}
140161
result.add(rootNode);
141162
result.add(packageNode);
142163

143-
PackageNode item = new TypeRootNode(cu.getElementName(), cu.getPath().toPortableString(), NodeKind.TYPEROOT, TypeRootNode.K_SOURCE);
144-
item.setUri(JDTUtils.toURI(cu));
164+
PackageNode item = new TypeRootNode(typeRoot.getElementName(), typeRoot.getPath().toPortableString(), NodeKind.TYPEROOT, TypeRootNode.K_SOURCE);
165+
item.setUri(JDTUtils.toUri(typeRoot));
145166
result.add(item);
146167
}
147168

@@ -267,11 +288,20 @@ private static List<PackageNode> getRootTypes(PackageParams query, IProgressMoni
267288
return rootTypeNodes;
268289
}
269290
// when .java files and other .properties files are mixed up
270-
rootTypeNodes.addAll(Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile).map(resource -> {
271-
IFile file = (IFile) resource;
272-
PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
273-
item.setUri(JDTUtils.getFileURI(file));
274-
return item;
291+
rootTypeNodes.addAll(
292+
Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> {
293+
if (resource instanceof IFile) {
294+
IFile file = (IFile) resource;
295+
PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
296+
item.setUri(JDTUtils.getFileURI(file));
297+
return item;
298+
} else {
299+
JarEntryFile file = (JarEntryFile) resource;
300+
PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE);
301+
entry.setUri(ExtUtils.toUri((JarEntryFile) resource));
302+
return entry;
303+
}
304+
275305
}).collect(Collectors.toList()));
276306
return rootTypeNodes;
277307
}
@@ -330,7 +360,7 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root,
330360
if (fragment.hasChildren()) {
331361
result.add(child);
332362
} else if (fragment.getNonJavaResources().length > 0) { // some package has non-java files
333-
result.add(fragment.getResource());
363+
result.add(fragment);
334364
}
335365
}
336366
Object[] nonJavaResources = root.getNonJavaResources();

0 commit comments

Comments
 (0)