diff --git a/images/dark/icon-add.svg b/images/dark/icon-add.svg new file mode 100644 index 00000000..4d938933 --- /dev/null +++ b/images/dark/icon-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/dark/icon-remove.svg b/images/dark/icon-remove.svg new file mode 100644 index 00000000..4c5a9c1e --- /dev/null +++ b/images/dark/icon-remove.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/light/icon-add.svg b/images/light/icon-add.svg new file mode 100644 index 00000000..01a9de7d --- /dev/null +++ b/images/light/icon-add.svg @@ -0,0 +1,3 @@ + + + diff --git a/images/light/icon-remove.svg b/images/light/icon-remove.svg new file mode 100644 index 00000000..d12a8ee3 --- /dev/null +++ b/images/light/icon-remove.svg @@ -0,0 +1,3 @@ + + + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml index 6c2356c5..5148ec64 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/plugin.xml @@ -3,6 +3,7 @@ + diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java index df09f90c..1e1fdef9 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/CommandHandler.java @@ -24,7 +24,9 @@ public Object executeCommand(String commandId, List arguments, IProgress if (!StringUtils.isBlank(commandId)) { switch (commandId) { case "java.project.list": - return ProjectCommand.execute(arguments, monitor); + return ProjectCommand.listProjects(arguments, monitor); + case "java.project.refreshLib": + return ProjectCommand.refreshLibraries(arguments, monitor); case "java.getPackageData": return PackageCommand.getChildren(arguments, monitor); case "java.resolvePath": diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JdtlsExtActivator.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JdtlsExtActivator.java index b75bf5e8..62f8a716 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JdtlsExtActivator.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JdtlsExtActivator.java @@ -15,6 +15,12 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.IJobChangeListener; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; +import org.eclipse.jdt.ls.core.internal.JavaClientConnection; +import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; +import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; @@ -25,6 +31,16 @@ public class JdtlsExtActivator implements BundleActivator { private static BundleContext context; + private static IJobChangeListener updateClasspathListener = new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + if (event.getJob() instanceof UpdateClasspathJob) { + JavaClientConnection connection = JavaLanguageServerPlugin.getInstance().getClientConnection(); + connection.executeClientCommand("java.view.package.refresh", /* debounce = */true); + } + } + }; + static BundleContext getContext() { return context; } @@ -32,11 +48,13 @@ static BundleContext getContext() { @Override public void start(BundleContext bundleContext) throws Exception { JdtlsExtActivator.context = bundleContext; + UpdateClasspathJob.getInstance().addJobChangeListener(JdtlsExtActivator.updateClasspathListener); } @Override public void stop(BundleContext bundleContext) throws Exception { JdtlsExtActivator.context = null; + UpdateClasspathJob.getInstance().removeJobChangeListener(JdtlsExtActivator.updateClasspathListener); } @SuppressWarnings("unchecked") 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 b3cb3e8b..88b96f78 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 @@ -51,6 +51,7 @@ import org.eclipse.jdt.internal.core.JarEntryResource; import org.eclipse.jdt.internal.core.JrtPackageFragmentRoot; import org.eclipse.jdt.ls.core.internal.JDTUtils; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.lsp4j.jsonrpc.json.adapters.CollectionTypeAdapter; import org.eclipse.lsp4j.jsonrpc.json.adapters.EnumTypeAdapter; @@ -246,7 +247,7 @@ private static List getContainers(PackageParams query, IProgressMon .collect(Collectors.toList()); boolean isReferencedLibrariesExist = Arrays.stream(references) .anyMatch(entry -> entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY || entry.getEntryKind() == IClasspathEntry.CPE_VARIABLE); - if (isReferencedLibrariesExist) { + if (isReferencedLibrariesExist || !ProjectUtils.isVisibleProject(javaProject.getProject())) { result.add(PackageNode.REFERENCED_LIBRARIES_CONTAINER); } return result; diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java index ad6c6af3..7ddec5a1 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/ProjectCommand.java @@ -21,14 +21,19 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; +import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.ResourceUtils; +import org.eclipse.jdt.ls.core.internal.managers.UpdateClasspathJob; +import org.eclipse.jdt.ls.core.internal.preferences.Preferences.ReferencedLibraries; import com.microsoft.jdtls.ext.core.model.NodeKind; import com.microsoft.jdtls.ext.core.model.PackageNode; public final class ProjectCommand { - public static List execute(List arguments, IProgressMonitor monitor) { + public static List listProjects(List arguments, IProgressMonitor monitor) { String workspaceUri = (String) arguments.get(0); IPath workspacePath = ResourceUtils.canonicalFilePathFromURI(workspaceUri); String invisibleProjectName = getWorkspaceInvisibleProjectName(workspacePath); @@ -47,6 +52,21 @@ public static List execute(List arguments, IProgressMonitor return children; } + public static boolean refreshLibraries(List arguments, IProgressMonitor monitor) { + String workspaceUri = (String) arguments.get(0); + IPath workspacePath = ResourceUtils.canonicalFilePathFromURI(workspaceUri); + String projectName = ProjectUtils.getWorkspaceInvisibleProjectName(workspacePath); + IProject project = getWorkspaceRoot().getProject(projectName); + try { + ReferencedLibraries libraries = JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getReferencedLibraries(); + UpdateClasspathJob.getInstance().updateClasspath(JavaCore.create(project), libraries); + return true; + } catch (Exception e) { + JavaLanguageServerPlugin.logException("Exception occured during waiting for classpath to be updated", e); + return false; + } + } + private static IWorkspaceRoot getWorkspaceRoot() { return ResourcesPlugin.getWorkspace().getRoot(); } diff --git a/package-lock.json b/package-lock.json index d96c79ac..dea8c0b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -976,8 +976,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1080,7 +1079,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1645,8 +1643,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -5933,7 +5930,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -8015,9 +8011,9 @@ "dev": true }, "terser": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", - "integrity": "sha512-lH9zLIbX8PRBEFCTvfHGCy0s9HEKnNso1Dx9swSopF3VUnFLB8DpQ61tHxoofovNC/sG0spajJM3EIIRSTByiQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.1.tgz", + "integrity": "sha512-w0f2OWFD7ka3zwetgVAhNMeyzEbj39ht2Tb0qKflw9PmW9Qbo5tjTh01QJLkhO9t9RDDQYvk+WXqpECI2C6i2A==", "dev": true, "requires": { "commander": "^2.20.0", diff --git a/package.json b/package.json index 6fa1eadd..ae6742bd 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,33 @@ "title": "%contributes.commands.java.project.create%", "category": "Java" }, + { + "command": "java.project.addLibraries", + "title": "%contributes.commands.java.project.addLibraries%", + "category": "Java", + "icon": { + "dark": "images/dark/icon-add.svg", + "light": "images/light/icon-add.svg" + } + }, + { + "command": "java.project.removeLibrary", + "title": "%contributes.commands.java.project.removeLibrary%", + "category": "Java", + "icon": { + "dark": "images/dark/icon-remove.svg", + "light": "images/light/icon-remove.svg" + } + }, + { + "command": "java.project.refreshLibraries", + "title": "%contributes.commands.java.view.package.refresh%", + "category": "Java", + "icon": { + "dark": "images/dark/icon-refresh.svg", + "light": "images/light/icon-refresh.svg" + } + }, { "command": "java.view.package.refresh", "title": "%contributes.commands.java.view.package.refresh%", @@ -148,6 +175,14 @@ { "command": "java.view.package.copyRelativeFilePath", "when": "never" + }, + { + "command": "java.project.removeLibrary", + "when": "never" + }, + { + "command": "java.project.refreshLibraries", + "when": "never" } ], "view/title": [ @@ -192,6 +227,21 @@ "command": "java.view.package.copyRelativeFilePath", "when": "view == javaDependencyExplorer && viewItem =~ /java:.*?\\+uri/", "group": "@2" + }, + { + "command": "java.project.addLibraries", + "when": "view == javaDependencyExplorer && viewItem =~ /java:container\/referenced-libraries/", + "group": "inline@0" + }, + { + "command": "java.project.removeLibrary", + "when": "view == javaDependencyExplorer && viewItem =~ /java:jar\/referenced-libraries/", + "group": "inline" + }, + { + "command": "java.project.refreshLibraries", + "when": "view == javaDependencyExplorer && viewItem =~ /java:container\/referenced-libraries/", + "group": "inline@1" } ] }, @@ -219,6 +269,7 @@ "@types/fs-extra": "^5.0.4", "@types/glob": "^7.1.1", "@types/lodash": "^4.14.139", + "@types/minimatch": "^3.0.3", "@types/mocha": "^5.2.5", "@types/node": "^8.10.36", "@types/vscode": "1.30.0", @@ -241,6 +292,7 @@ "find-java-home": "^0.2.0", "fs-extra": "^7.0.1", "lodash": "^4.17.15", + "minimatch": "^3.0.4", "vscode-extension-telemetry-wrapper": "^0.4.0", "xml2js": "^0.4.19" } diff --git a/package.nls.json b/package.nls.json index a0dccd40..b2b20182 100644 --- a/package.nls.json +++ b/package.nls.json @@ -1,6 +1,8 @@ { "description": "Manage Java Dependencies in VSCode", "contributes.commands.java.project.create": "Create Java Project", + "contributes.commands.java.project.addLibraries": "Add a jar file or a folder to project classpath", + "contributes.commands.java.project.removeLibrary": "Remove jar file from project classpath", "contributes.commands.java.view.package.refresh": "Refresh", "contributes.commands.java.view.package.changeRepresentation": "Change package representation", "contributes.commands.java.view.package.changeToFlatPackageView":"Change to flat package representation", @@ -14,6 +16,6 @@ "configuration.java.dependency.showOutline": "Enable show outline in the Java Dependency explorer", "configuration.java.dependency.syncWithFolderExplorer": "Synchronize dependency viewer selection with folder explorer", "configuration.java.dependency.autoRefresh": "Synchronize dependency viewer with changes", - "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected.", + "configuration.java.dependency.refreshDelay": "The delay time (ms) the auto refresh is invoked when changes are detected", "configuration.java.dependency.packagePresentation": "Package presentation mode: flat or hierarchical" } diff --git a/package.nls.zh.json b/package.nls.zh.json index ee0f600d..65b85944 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -1,6 +1,8 @@ { "description": "在 VSCode 中管理 Java 依赖项", "contributes.commands.java.project.create": "创建 Java 项目", + "contributes.commands.java.project.addLibraries": "将一个 Jar 文件或一个目录添加到 Java 项目类路径中", + "contributes.commands.java.project.removeLibrary": "将该 Jar 文件从 Java 项目类路径中移除", "contributes.commands.java.view.package.refresh": "刷新", "contributes.commands.java.view.package.changeRepresentation": "更改包展示形式", "contributes.commands.java.view.package.changeToFlatPackageView":"将 Java 包显示方式切换为平行显示", @@ -14,6 +16,6 @@ "configuration.java.dependency.showOutline": "在 Java 依赖项资源管理器中显示类成员大纲", "configuration.java.dependency.syncWithFolderExplorer": "在 Java 依赖项资源管理器中同步关联当前打开的文件", "configuration.java.dependency.autoRefresh": "在 Java 依赖项资源管理器中自动同步修改", - "configuration.java.dependency.refreshDelay": "控制Java 依赖项资源管理器刷新的延迟时间 (毫秒)。", + "configuration.java.dependency.refreshDelay": "控制Java 依赖项资源管理器刷新的延迟时间 (毫秒)", "configuration.java.dependency.packagePresentation": "Java 包显示方式: 平行显示或者分层显示" } diff --git a/src/commands.ts b/src/commands.ts index 1e49effe..877c584b 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -32,8 +32,16 @@ export namespace Commands { export const JAVA_PROJECT_CREATE = "java.project.create"; + export const JAVA_PROJECT_ADD_LIBRARIES = "java.project.addLibraries"; + + export const JAVA_PROJECT_REMOVE_LIBRARY = "java.project.removeLibrary"; + + export const JAVA_PROJECT_REFRESH_LIBRARIES = "java.project.refreshLibraries"; + export const JAVA_PROJECT_LIST = "java.project.list"; + export const JAVA_PROJECT_REFRESH_LIB_SERVER = "java.project.refreshLib"; + export const JAVA_GETPACKAGEDATA = "java.getPackageData"; export const JAVA_RESOLVEPATH = "java.resolvePath"; diff --git a/src/controllers/libraryController.ts b/src/controllers/libraryController.ts new file mode 100644 index 00000000..e0cff3b6 --- /dev/null +++ b/src/controllers/libraryController.ts @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as fse from "fs-extra"; +import * as _ from "lodash"; +import * as minimatch from "minimatch"; +import { commands, Disposable, ExtensionContext, Uri, window, workspace, WorkspaceFolder } from "vscode"; +import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; +import { Commands } from "../commands"; +import { Jdtls } from "../java/jdtls"; +import { Settings } from "../settings"; +import { Utility } from "../utility"; +import { DataNode } from "../views/dataNode"; + +export class LibraryController implements Disposable { + + private disposable: Disposable; + + public constructor(public readonly context: ExtensionContext) { + this.disposable = Disposable.from( + commands.registerCommand(Commands.JAVA_PROJECT_ADD_LIBRARIES, + instrumentOperation(Commands.JAVA_PROJECT_ADD_LIBRARIES, (operationId: string, node: DataNode) => this.addLibraries())), + commands.registerCommand(Commands.JAVA_PROJECT_REMOVE_LIBRARY, + instrumentOperation(Commands.JAVA_PROJECT_REMOVE_LIBRARY, (operationId: string, node: DataNode) => + this.removeLibrary(Uri.parse(node.uri).fsPath))), + commands.registerCommand(Commands.JAVA_PROJECT_REFRESH_LIBRARIES, + instrumentOperation(Commands.JAVA_PROJECT_REFRESH_LIBRARIES, (operationId: string, node: DataNode) => this.refreshLibraries())), + ); + } + + public dispose() { + this.disposable.dispose(); + } + + public async addLibraries(libraryGlobs?: string[]) { + if (!libraryGlobs) { + libraryGlobs = []; + const workspaceFolder: WorkspaceFolder | undefined = Utility.getDefaultWorkspaceFolder(); + const isWindows = process.platform.indexOf("win") === 0; + const results: Uri[] | undefined = await window.showOpenDialog({ + defaultUri: workspaceFolder && workspaceFolder.uri, + canSelectFiles: true, + canSelectFolders: isWindows ? false : true, + canSelectMany: true, + openLabel: isWindows ? "Select jar files" : "Select jar files or directories", + filters: { Library: ["jar"] }, + }); + if (!results) { + return; + } + libraryGlobs = await Promise.all(results.map(async (uri: Uri) => { + // keep the param: `includeWorkspaceFolder` to false here + // since the multi-root is not supported well for invisible projects + const uriPath = workspace.asRelativePath(uri, false); + return (await fse.stat(uri.fsPath)).isDirectory() ? `${uriPath}/**/*.jar` : uriPath; + })); + } + + const setting = Settings.referencedLibraries(); + setting.exclude = this.dedupAlreadyCoveredPattern(libraryGlobs, ...setting.exclude); + setting.include = this.updatePatternArray(setting.include, ...libraryGlobs); + Settings.updateReferencedLibraries(setting); + } + + public async removeLibrary(library: string) { + const setting = Settings.referencedLibraries(); + setting.exclude = this.updatePatternArray(setting.exclude, workspace.asRelativePath(library, false)); + Settings.updateReferencedLibraries(setting); + } + + public async refreshLibraries(): Promise { + const workspaceFolder = Utility.getDefaultWorkspaceFolder(); + if (workspaceFolder) { + await Jdtls.refreshLibraries(workspaceFolder.uri.toString()); + } + } + + /** + * Check if the `update` patterns are already covered by `origin` patterns and return those uncovered + */ + private dedupAlreadyCoveredPattern(origin: string[], ...update: string[]): string[] { + return update.filter((newPattern) => { + return !origin.some((originPattern) => { + return minimatch(newPattern, originPattern); + }); + }); + } + + private updatePatternArray(origin: string[], ...update: string[]): string[] { + update = this.dedupAlreadyCoveredPattern(origin, ...update); + origin.push(...update); + return _.uniq(origin); + } +} diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 2f562b17..03a3da8e 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -4,12 +4,25 @@ import * as fse from "fs-extra"; import * as _ from "lodash"; import * as path from "path"; -import { commands, ExtensionContext, Uri, window, workspace } from "vscode"; +import { commands, Disposable, ExtensionContext, Uri, window, workspace } from "vscode"; +import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; import * as xml2js from "xml2js"; +import { Commands } from "../commands"; import { Utility } from "../utility"; -export class ProjectController { - constructor(public readonly context: ExtensionContext) { +export class ProjectController implements Disposable { + + private disposable: Disposable; + + public constructor(public readonly context: ExtensionContext) { + this.disposable = Disposable.from( + commands.registerCommand(Commands.JAVA_PROJECT_CREATE, + instrumentOperation(Commands.JAVA_PROJECT_CREATE, () => this.createJavaProject())), + ); + } + + public dispose() { + this.disposable.dispose(); } public async createJavaProject() { diff --git a/src/extension.ts b/src/extension.ts index 8e410178..7c89d74e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -4,6 +4,7 @@ import { commands, ExtensionContext } from "vscode"; import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation } from "vscode-extension-telemetry-wrapper"; import { Commands } from "./commands"; +import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; import { Services } from "./services"; import { Settings } from "./settings"; @@ -20,10 +21,8 @@ function activateExtension(operationId: string, context: ExtensionContext) { Services.initialize(context); Settings.initialize(context); - const projectController: ProjectController = new ProjectController(context); - const instrumented = instrumentOperation(Commands.JAVA_PROJECT_CREATE, () => projectController.createJavaProject()); - context.subscriptions.push(commands.registerCommand(Commands.JAVA_PROJECT_CREATE, instrumented)); - + context.subscriptions.push(new ProjectController(context)); + context.subscriptions.push(new LibraryController(context)); context.subscriptions.push(new DependencyExplorer(context)); } diff --git a/src/java/jdtls.ts b/src/java/jdtls.ts index 8329079d..a1b60955 100644 --- a/src/java/jdtls.ts +++ b/src/java/jdtls.ts @@ -10,6 +10,10 @@ export namespace Jdtls { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_LIST, params); } + export function refreshLibraries(params): Thenable { + return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_PROJECT_REFRESH_LIB_SERVER, params); + } + export function getPackageData(params): Thenable { return commands.executeCommand(Commands.EXECUTE_WORKSPACE_COMMAND, Commands.JAVA_GETPACKAGEDATA, params); } diff --git a/src/settings.ts b/src/settings.ts index 6f3bcb87..3ae5de89 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -2,8 +2,8 @@ // Licensed under the MIT license. import { - commands, ConfigurationChangeEvent, Disposable, DocumentHighlight, ExtensionContext, - window, workspace, WorkspaceConfiguration, + commands, ConfigurationChangeEvent, ExtensionContext, + workspace, WorkspaceConfiguration, } from "vscode"; import { instrumentOperation } from "vscode-extension-telemetry-wrapper"; import { Commands } from "./commands"; @@ -73,6 +73,28 @@ export class Settings { workspace.getConfiguration().update("java.dependency.packagePresentation", PackagePresentation.Hierarchical, false); } + public static updateReferencedLibraries(libraries: IReferencedLibraries): void { + let updateSetting: string[] | Partial = { + include: libraries.include, + exclude: libraries.exclude.length > 0 ? libraries.exclude : undefined, + sources: Object.keys(libraries.sources).length > 0 ? libraries.sources : undefined, + }; + if (!updateSetting.exclude && !updateSetting.sources) { + updateSetting = libraries.include; + } + workspace.getConfiguration().update("java.project.referencedLibraries", updateSetting); + } + + public static referencedLibraries(): IReferencedLibraries { + const setting = workspace.getConfiguration("java.project").get>("referencedLibraries"); + const defaultSetting: IReferencedLibraries = { include: [], exclude: [], sources: {} }; + if (Array.isArray(setting)) { + return { ...defaultSetting, include: setting }; + } else { + return { ...defaultSetting, ...setting }; + } + } + public static showOutline(): boolean { return this._dependencyConfig.get("showOutline"); } @@ -104,3 +126,9 @@ enum PackagePresentation { } type Listener = (updatedConfig: WorkspaceConfiguration, oldConfig: WorkspaceConfiguration) => void; + +export interface IReferencedLibraries { + include: string[]; + exclude: string[]; + sources: { [binary: string]: string }; +} diff --git a/webpack.config.js b/webpack.config.js index 830c9516..718042cd 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -37,4 +37,4 @@ const config = { }] }, } -module.exports = config; \ No newline at end of file +module.exports = config;