Skip to content

Commit 40f90b1

Browse files
Vigilansjdneo
authored andcommitted
Support managing referenced libraries (#213)
1 parent 8478c02 commit 40f90b1

20 files changed

+276
-24
lines changed

images/dark/icon-add.svg

Lines changed: 3 additions & 0 deletions
Loading

images/dark/icon-remove.svg

Lines changed: 3 additions & 0 deletions
Loading

images/light/icon-add.svg

Lines changed: 3 additions & 0 deletions
Loading

images/light/icon-remove.svg

Lines changed: 3 additions & 0 deletions
Loading

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
}

package-lock.json

Lines changed: 5 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,33 @@
3939
"title": "%contributes.commands.java.project.create%",
4040
"category": "Java"
4141
},
42+
{
43+
"command": "java.project.addLibraries",
44+
"title": "%contributes.commands.java.project.addLibraries%",
45+
"category": "Java",
46+
"icon": {
47+
"dark": "images/dark/icon-add.svg",
48+
"light": "images/light/icon-add.svg"
49+
}
50+
},
51+
{
52+
"command": "java.project.removeLibrary",
53+
"title": "%contributes.commands.java.project.removeLibrary%",
54+
"category": "Java",
55+
"icon": {
56+
"dark": "images/dark/icon-remove.svg",
57+
"light": "images/light/icon-remove.svg"
58+
}
59+
},
60+
{
61+
"command": "java.project.refreshLibraries",
62+
"title": "%contributes.commands.java.view.package.refresh%",
63+
"category": "Java",
64+
"icon": {
65+
"dark": "images/dark/icon-refresh.svg",
66+
"light": "images/light/icon-refresh.svg"
67+
}
68+
},
4269
{
4370
"command": "java.view.package.refresh",
4471
"title": "%contributes.commands.java.view.package.refresh%",
@@ -148,6 +175,14 @@
148175
{
149176
"command": "java.view.package.copyRelativeFilePath",
150177
"when": "never"
178+
},
179+
{
180+
"command": "java.project.removeLibrary",
181+
"when": "never"
182+
},
183+
{
184+
"command": "java.project.refreshLibraries",
185+
"when": "never"
151186
}
152187
],
153188
"view/title": [
@@ -192,6 +227,21 @@
192227
"command": "java.view.package.copyRelativeFilePath",
193228
"when": "view == javaDependencyExplorer && viewItem =~ /java:.*?\\+uri/",
194229
"group": "@2"
230+
},
231+
{
232+
"command": "java.project.addLibraries",
233+
"when": "view == javaDependencyExplorer && viewItem =~ /java:container\/referenced-libraries/",
234+
"group": "inline@0"
235+
},
236+
{
237+
"command": "java.project.removeLibrary",
238+
"when": "view == javaDependencyExplorer && viewItem =~ /java:jar\/referenced-libraries/",
239+
"group": "inline"
240+
},
241+
{
242+
"command": "java.project.refreshLibraries",
243+
"when": "view == javaDependencyExplorer && viewItem =~ /java:container\/referenced-libraries/",
244+
"group": "inline@1"
195245
}
196246
]
197247
},
@@ -219,6 +269,7 @@
219269
"@types/fs-extra": "^5.0.4",
220270
"@types/glob": "^7.1.1",
221271
"@types/lodash": "^4.14.139",
272+
"@types/minimatch": "^3.0.3",
222273
"@types/mocha": "^5.2.5",
223274
"@types/node": "^8.10.36",
224275
"@types/vscode": "1.30.0",
@@ -241,6 +292,7 @@
241292
"find-java-home": "^0.2.0",
242293
"fs-extra": "^7.0.1",
243294
"lodash": "^4.17.15",
295+
"minimatch": "^3.0.4",
244296
"vscode-extension-telemetry-wrapper": "^0.4.0",
245297
"xml2js": "^0.4.19"
246298
}

package.nls.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{
22
"description": "Manage Java Dependencies in VSCode",
33
"contributes.commands.java.project.create": "Create Java Project",
4+
"contributes.commands.java.project.addLibraries": "Add a jar file or a folder to project classpath",
5+
"contributes.commands.java.project.removeLibrary": "Remove jar file from project classpath",
46
"contributes.commands.java.view.package.refresh": "Refresh",
57
"contributes.commands.java.view.package.changeRepresentation": "Change package representation",
68
"contributes.commands.java.view.package.changeToFlatPackageView":"Change to flat package representation",
@@ -14,6 +16,6 @@
1416
"configuration.java.dependency.showOutline": "Enable show outline in the Java Dependency explorer",
1517
"configuration.java.dependency.syncWithFolderExplorer": "Synchronize dependency viewer selection with folder explorer",
1618
"configuration.java.dependency.autoRefresh": "Synchronize dependency viewer with changes",
17-
"configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected.",
19+
"configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected",
1820
"configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical"
1921
}

package.nls.zh.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{
22
"description": "在 VSCode 中管理 Java 依赖项",
33
"contributes.commands.java.project.create": "创建 Java 项目",
4+
"contributes.commands.java.project.addLibraries": "将一个 Jar 文件或一个目录添加到 Java 项目类路径中",
5+
"contributes.commands.java.project.removeLibrary": "将该 Jar 文件从 Java 项目类路径中移除",
46
"contributes.commands.java.view.package.refresh": "刷新",
57
"contributes.commands.java.view.package.changeRepresentation": "更改包展示形式",
68
"contributes.commands.java.view.package.changeToFlatPackageView":"将 Java 包显示方式切换为平行显示",
@@ -14,6 +16,6 @@
1416
"configuration.java.dependency.showOutline": "在 Java 依赖项资源管理器中显示类成员大纲",
1517
"configuration.java.dependency.syncWithFolderExplorer": "在 Java 依赖项资源管理器中同步关联当前打开的文件",
1618
"configuration.java.dependency.autoRefresh": "在 Java 依赖项资源管理器中自动同步修改",
17-
"configuration.java.dependency.refreshDelay": "控制Java 依赖项资源管理器刷新的延迟时间 (毫秒)",
19+
"configuration.java.dependency.refreshDelay": "控制Java 依赖项资源管理器刷新的延迟时间 (毫秒)",
1820
"configuration.java.dependency.packagePresentation": "Java 包显示方式: 平行显示或者分层显示"
1921
}

src/commands.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,16 @@ export namespace Commands {
3232

3333
export const JAVA_PROJECT_CREATE = "java.project.create";
3434

35+
export const JAVA_PROJECT_ADD_LIBRARIES = "java.project.addLibraries";
36+
37+
export const JAVA_PROJECT_REMOVE_LIBRARY = "java.project.removeLibrary";
38+
39+
export const JAVA_PROJECT_REFRESH_LIBRARIES = "java.project.refreshLibraries";
40+
3541
export const JAVA_PROJECT_LIST = "java.project.list";
3642

43+
export const JAVA_PROJECT_REFRESH_LIB_SERVER = "java.project.refreshLib";
44+
3745
export const JAVA_GETPACKAGEDATA = "java.getPackageData";
3846

3947
export const JAVA_RESOLVEPATH = "java.resolvePath";

0 commit comments

Comments
 (0)