Skip to content

Commit 6e83b76

Browse files
committed
UpdateClasspath support in jdt.ls plugin side:
* Notification dependency viewer to refresh on updating classpath done * Command to manually trigger classpath refreshing
1 parent b87c7b5 commit 6e83b76

File tree

5 files changed

+45
-3
lines changed

5 files changed

+45
-3
lines changed

jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<plugin>
44
<extension point="org.eclipse.jdt.ls.core.delegateCommandHandler">
55
<delegateCommandHandler class="com.microsoft.jdtls.ext.core.CommandHandler">
6+
<command id="java.project.refreshLib"/>
67
<command id="java.project.list"/>
78
<command id="java.getPackageData"/>
89
<command id="java.resolvePath" />

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ public Object executeCommand(String commandId, List<Object> arguments, IProgress
2424
if (!StringUtils.isBlank(commandId)) {
2525
switch (commandId) {
2626
case "java.project.list":
27-
return ProjectCommand.execute(arguments, monitor);
27+
return ProjectCommand.listProjects(arguments, monitor);
28+
case "java.project.refreshLib":
29+
return ProjectCommand.refreshLibraries(arguments, monitor);
2830
case "java.getPackageData":
2931
return PackageCommand.getChildren(arguments, monitor);
3032
case "java.resolvePath":

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@
1515
import org.eclipse.core.runtime.IStatus;
1616
import org.eclipse.core.runtime.Platform;
1717
import org.eclipse.core.runtime.Status;
18+
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
19+
import org.eclipse.core.runtime.jobs.IJobChangeListener;
20+
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
21+
import org.eclipse.jdt.ls.core.internal.JavaClientConnection;
22+
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
23+
import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob;
1824
import org.osgi.framework.BundleActivator;
1925
import org.osgi.framework.BundleContext;
2026
import org.osgi.framework.ServiceReference;
@@ -25,18 +31,30 @@ public class JdtlsExtActivator implements BundleActivator {
2531

2632
private static BundleContext context;
2733

34+
private static IJobChangeListener updateClasspathListener = new JobChangeAdapter() {
35+
@Override
36+
public void done(IJobChangeEvent event) {
37+
if (event.getJob() instanceof UpdateClasspathJob) {
38+
JavaClientConnection connection = JavaLanguageServerPlugin.getInstance().getClientConnection();
39+
connection.executeClientCommand("java.view.package.refresh", /* debounce = */true);
40+
}
41+
}
42+
};
43+
2844
static BundleContext getContext() {
2945
return context;
3046
}
3147

3248
@Override
3349
public void start(BundleContext bundleContext) throws Exception {
3450
JdtlsExtActivator.context = bundleContext;
51+
UpdateClasspathJob.getInstance().addJobChangeListener(JdtlsExtActivator.updateClasspathListener);
3552
}
3653

3754
@Override
3855
public void stop(BundleContext bundleContext) throws Exception {
3956
JdtlsExtActivator.context = null;
57+
UpdateClasspathJob.getInstance().removeJobChangeListener(JdtlsExtActivator.updateClasspathListener);
4058
}
4159

4260
@SuppressWarnings("unchecked")

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.eclipse.jdt.internal.core.JarEntryResource;
5252
import org.eclipse.jdt.internal.core.JrtPackageFragmentRoot;
5353
import org.eclipse.jdt.ls.core.internal.JDTUtils;
54+
import org.eclipse.jdt.ls.core.internal.ProjectUtils;
5455
import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter;
5556
import org.eclipse.lsp4j.jsonrpc.json.adapters.EnumTypeAdapter;
5657

@@ -246,7 +247,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
246247
.collect(Collectors.toList());
247248
boolean isReferencedLibrariesExist = Arrays.stream(references)
248249
.anyMatch(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE);
249-
if (isReferencedLibrariesExist) {
250+
if (isReferencedLibrariesExist || !ProjectUtils.isVisibleProject(javaProject.getProject())) {
250251
result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER);
251252
}
252253
return result;

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@
2121
import org.eclipse.core.resources.ResourcesPlugin;
2222
import org.eclipse.core.runtime.IPath;
2323
import org.eclipse.core.runtime.IProgressMonitor;
24+
import org.eclipse.jdt.core.JavaCore;
25+
import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin;
26+
import org.eclipse.jdt.ls.core.internal.ProjectUtils;
2427
import org.eclipse.jdt.ls.core.internal.ResourceUtils;
28+
import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob;
29+
import org.eclipse.jdt.ls.core.internal.preferences.Preferences.ReferencedLibraries;
2530

2631
import com.microsoft.jdtls.ext.core.model.NodeKind;
2732
import com.microsoft.jdtls.ext.core.model.PackageNode;
2833

2934
public final class ProjectCommand {
3035

31-
public static List<PackageNode> execute(List<Object> arguments, IProgressMonitor monitor) {
36+
public static List<PackageNode> listProjects(List<Object> arguments, IProgressMonitor monitor) {
3237
String workspaceUri = (String) arguments.get(0);
3338
IPath workspacePath = ResourceUtils.canonicalFilePathFromURI(workspaceUri);
3439
String invisibleProjectName = getWorkspaceInvisibleProjectName(workspacePath);
@@ -47,6 +52,21 @@ public static List<PackageNode> execute(List<Object> arguments, IProgressMonitor
4752
return children;
4853
}
4954

55+
public static boolean refreshLibraries(List<Object> arguments, IProgressMonitor monitor) {
56+
String workspaceUri = (String) arguments.get(0);
57+
IPath workspacePath = ResourceUtils.canonicalFilePathFromURI(workspaceUri);
58+
String projectName = ProjectUtils.getWorkspaceInvisibleProjectName(workspacePath);
59+
IProject project = getWorkspaceRoot().getProject(projectName);
60+
try {
61+
ReferencedLibraries libraries = JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getReferencedLibraries();
62+
UpdateClasspathJob.getInstance().updateClasspath(JavaCore.create(project), libraries);
63+
return true;
64+
} catch (Exception e) {
65+
JavaLanguageServerPlugin.logException("Exception occured during waiting for classpath to be updated", e);
66+
return false;
67+
}
68+
}
69+
5070
private static IWorkspaceRoot getWorkspaceRoot() {
5171
return ResourcesPlugin.getWorkspace().getRoot();
5272
}

0 commit comments

Comments
 (0)