diff --git a/extension.bundle.ts b/extension.bundle.ts index 3ae2f6ac..c7b02d99 100644 --- a/extension.bundle.ts +++ b/extension.bundle.ts @@ -20,4 +20,4 @@ export { WorkspaceNode } from "./src/views/workspaceNode"; export { contextManager } from "./src/contextManager"; export { DependencyExplorer } from "./src/views/dependencyExplorer"; export { Commands } from "./src/commands"; -export { LanguageServerMode } from "./src/extension"; +export { LanguageServerMode } from "./src/languageServerApi/LanguageServerMode"; diff --git a/gulpfile.js b/gulpfile.js index be47f6c8..679e1f31 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -16,7 +16,6 @@ gulp.task('build_server', () => { return gulp.src([ server_dir + '/com.microsoft.jdtls.ext.core/target/com.microsoft.jdtls.ext.core*.jar', - server_dir + '/com.microsoft.jdtls.ext.activator/target/com.microsoft.jdtls.ext.activator*.jar', ]) .pipe(gulp.dest('./server')) }); diff --git a/package.json b/package.json index 1bf3f7b4..7857bc93 100644 --- a/package.json +++ b/package.json @@ -21,18 +21,15 @@ "homepage": "https://github.com/Microsoft/vscode-java-dependency/blob/master/README.md", "icon": "logo.png", "activationEvents": [ - "onLanguage:java", - "workspaceContains:pom.xml", - "workspaceContains:.classpath", - "workspaceContains:build.gradle", - "onCommand:java.project.create" + "onCommand:java.project.create", + "onCommand:_java.project.open", + "onView:javaProjectExplorer" ], "license": "MIT", "main": "./main.js", "contributes": { "javaExtensions": [ - "./server/com.microsoft.jdtls.ext.core-0.15.0.jar", - "./server/com.microsoft.jdtls.ext.activator-0.15.0.jar" + "./server/com.microsoft.jdtls.ext.core-0.15.0.jar" ], "commands": [ { @@ -216,56 +213,56 @@ "key": "ctrl+alt+r", "win": "shift+alt+r", "mac": "cmd+alt+r", - "when": "java:projectManagerActivated && focusedView == javaProjectExplorer" + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer" }, { "command": "java.view.package.copyFilePath", "key": "ctrl+alt+c", "win": "shift+alt+c", "mac": "cmd+alt+c", - "when": "java:projectManagerActivated && focusedView == javaProjectExplorer" + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer" }, { "command": "java.view.package.copyRelativeFilePath", "key": "ctrl+shift+alt+c", "win": "ctrl+k ctrl+shift+c", "mac": "cmd+shift+alt+c", - "when": "java:projectManagerActivated && focusedView == javaProjectExplorer" + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer" }, { "command": "java.view.package.renameFile", "key": "F2", "mac": "enter", - "when": "java:projectManagerActivated && focusedView == javaProjectExplorer" + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer" }, { "command": "java.view.package.moveFileToTrash", "key": "delete", "mac": "cmd+backspace", - "when": "java:projectManagerActivated && focusedView == javaProjectExplorer" + "when": "java:serverMode == Standard && focusedView == javaProjectExplorer" } ], "menus": { "commandPalette": [ { "command": "java.view.package.refresh", - "when": "java:projectManagerActivated && java:serverMode == Standard" + "when": "java:serverMode == Standard" }, { "command": "java.view.package.changeToHierarchicalPackageView", - "when": "java:projectManagerActivated && java:serverMode == Standard" + "when": "java:serverMode == Standard" }, { "command": "java.view.package.changeToFlatPackageView", - "when": "java:projectManagerActivated && java:serverMode == Standard" + "when": "java:serverMode == Standard" }, { "command": "java.view.package.linkWithFolderExplorer", - "when": "java:projectManagerActivated && java:serverMode == Standard" + "when": "java:serverMode == Standard" }, { "command": "java.view.package.unlinkWithFolderExplorer", - "when": "java:projectManagerActivated && java:serverMode == Standard" + "when": "java:serverMode == Standard" }, { "command": "java.view.package.revealFileInOS", @@ -273,7 +270,7 @@ }, { "command": "java.view.package.exportJar", - "when": "java:projectManagerActivated && java:serverMode == Standard" + "when": "java:serverMode == Standard" }, { "command": "java.view.package.copyFilePath", @@ -331,71 +328,71 @@ "explorer/context": [ { "command": "java.view.package.revealInProjectExplorer", - "when": "resourceFilename in java:supportedBuildFiles && java:projectManagerActivated && java:serverMode == Standard", + "when": "resourceFilename in java:supportedBuildFiles && java:serverMode == Standard", "group": "navigation@100" }, { "command": "java.view.package.revealInProjectExplorer", - "when": "resourceExtname == .java && java:projectManagerActivated && java:serverMode == Standard", + "when": "resourceExtname == .java && java:serverMode == Standard", "group": "navigation@100" } ], "editor/title/context": [ { "command": "java.view.package.revealInProjectExplorer", - "when": "resourceFilename in java:supportedBuildFiles && java:projectManagerActivated && java:serverMode == Standard", + "when": "resourceFilename in java:supportedBuildFiles && java:serverMode == Standard", "group": "2_files@100" }, { "command": "java.view.package.revealInProjectExplorer", - "when": "resourceExtname == .java && java:projectManagerActivated && java:serverMode == Standard", + "when": "resourceExtname == .java && java:serverMode == Standard", "group": "2_files@100" } ], "view/title": [ { "command": "java.project.create", - "when": "view == javaProjectExplorer && java:projectManagerActivated && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard", "group": "navigation@10" }, { "command": "java.view.package.exportJar", - "when": "view == javaProjectExplorer && java:projectManagerActivated && java:serverMode == Standard && workspaceFolderCount != 0", + "when": "view == javaProjectExplorer && java:serverMode == Standard && workspaceFolderCount != 0", "group": "navigation@20" }, { "command": "java.view.package.refresh", - "when": "view == javaProjectExplorer && java:projectManagerActivated && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard", "group": "navigation@30" }, { "command": "java.view.package.changeToHierarchicalPackageView", - "when": "view == javaProjectExplorer && java:projectManagerActivated && config.java.dependency.packagePresentation == flat && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.dependency.packagePresentation == flat", "group": "overflow_10@10" }, { "command": "java.view.package.changeToFlatPackageView", - "when": "view == javaProjectExplorer && java:projectManagerActivated && config.java.dependency.packagePresentation != flat && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.dependency.packagePresentation != flat", "group": "overflow_10@10" }, { "command": "java.view.package.linkWithFolderExplorer", - "when": "view == javaProjectExplorer && java:projectManagerActivated && config.java.dependency.syncWithFolderExplorer != true && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.dependency.syncWithFolderExplorer != true", "group": "overflow_10@20" }, { "command": "java.view.package.unlinkWithFolderExplorer", - "when": "view == javaProjectExplorer && java:projectManagerActivated && config.java.dependency.syncWithFolderExplorer == true && java:serverMode == Standard", + "when": "view == javaProjectExplorer && java:serverMode == Standard && config.java.dependency.syncWithFolderExplorer == true", "group": "overflow_10@20" }, { "command": "java.project.build.workspace", - "when": "view == javaProjectExplorer && java:projectManagerActivated && java:serverMode == Standard && workspaceFolderCount != 0", + "when": "view == javaProjectExplorer && java:serverMode == Standard && workspaceFolderCount != 0", "group": "overflow_20@10" }, { "command": "java.project.clean.workspace", - "when": "view == javaProjectExplorer && java:projectManagerActivated && java:serverMode == Standard && workspaceFolderCount != 0", + "when": "view == javaProjectExplorer && java:serverMode == Standard && workspaceFolderCount != 0", "group": "overflow_20@20" } ], @@ -496,20 +493,21 @@ "explorer": [ { "id": "javaProjectExplorer", - "name": "Java Projects" + "name": "Java Projects", + "when": "java:serverMode" } ] }, "viewsWelcome": [ { - "view": "javaProjectExplorer", - "contents": "No projects are listed because the Java Language Server is currently running in [LightWeight Mode](https://aka.ms/vscode-java-lightweight). To show projects, click on the button to switch to Standard Mode.\n[Switch to Standard Mode](command:java.server.mode.switch?%5B%22Standard%22,true%5D)", - "when": "java:serverMode == LightWeight" + "view": "explorer", + "contents": "%viewsWelcome.workbench.createNewJavaProject%", + "when": "workspaceFolderCount == 0" }, { "view": "javaProjectExplorer", - "contents": "You can create a new Java project by clicking the below button.\n[Create new Java project](command:java.project.create)", - "when": "!java:projectManagerActivated || java:serverMode != Standard" + "contents": "%viewsWelcome.workbench.inLightWeightMode%", + "when": "java:serverMode == LightWeight" } ], "taskDefinitions": [ diff --git a/package.nls.json b/package.nls.json index af72d7c7..8f347e43 100644 --- a/package.nls.json +++ b/package.nls.json @@ -35,5 +35,7 @@ "taskDefinitions.java.project.exportJar.compileOutput": "The folders containing output class files in the runtime scope.", "taskDefinitions.java.project.exportJar.testCompileOutput": "The folders containing output class files in the test scope.", "taskDefinitions.java.project.exportJar.dependencies": "The artifact dependencies in the runtime scope.", - "taskDefinitions.java.project.exportJar.testDependencies": "The artifact dependencies in the test scope." + "taskDefinitions.java.project.exportJar.testDependencies": "The artifact dependencies in the test scope.", + "viewsWelcome.workbench.createNewJavaProject": "You can also [open a Java project](command:_java.project.open), or create a new Java project by clicking the below button.\n[Create Java Project](command:java.project.create)", + "viewsWelcome.workbench.inLightWeightMode": "No projects are listed because the Java Language Server is currently running in [LightWeight Mode](https://aka.ms/vscode-java-lightweight). To show projects, click on the button to switch to Standard Mode.\n[Switch to Standard Mode](command:java.server.mode.switch?%5B%22Standard%22,true%5D)" } diff --git a/package.nls.zh.json b/package.nls.zh.json index 4a27090b..3ca4e1fe 100644 --- a/package.nls.zh.json +++ b/package.nls.zh.json @@ -35,5 +35,7 @@ "taskDefinitions.java.project.exportJar.compileOutput": "在 runtime scope 内包含输出的 class 文件的文件夹。", "taskDefinitions.java.project.exportJar.testCompileOutput": "在 test scope 内包含输出的 class 文件的文件夹。", "taskDefinitions.java.project.exportJar.dependencies": "在 runtime scope 内的依赖。", - "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 内的依赖。" + "taskDefinitions.java.project.exportJar.testDependencies": "在 test scope 内的依赖。", + "viewsWelcome.workbench.createNewJavaProject": "您也可以[打开一个 Java 项目](command:_java.project.open),或点击下方按钮创建一个新的 Java 项目。\n[创建 Java 项目](command:java.project.create)", + "viewsWelcome.workbench.inLightWeightMode": "由于 Java 语言服务正运行在 [LightWeight 模式](https://aka.ms/vscode-java-lightweight)下,因此项目将不会展示在该视图中。如果您需要展示项目信息,可以点击下方按钮将 Java 语言服务切换至 Standard 模式。\n[切换至 Standard 模式](command:java.server.mode.switch?%5B%22Standard%22,true%5D)" } diff --git a/src/commands.ts b/src/commands.ts index c715ad59..3d311f98 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -42,6 +42,8 @@ export namespace Commands { export const VIEW_PACKAGE_REVEAL_IN_PROJECT_EXPLORER = "java.view.package.revealInProjectExplorer"; + export const JAVA_PROJECT_OPEN = "_java.project.open"; + export const JAVA_PROJECT_CREATE = "java.project.create"; export const JAVA_PROJECT_ADD_LIBRARIES = "java.project.addLibraries"; @@ -58,10 +60,6 @@ export namespace Commands { export const JAVA_PROJECT_EXPLORER_FOCUS = "javaProjectExplorer.focus"; - export const JAVA_PROJECT_ACTIVATE = "java.project.activate"; - - export const JAVA_MAVEN_CREATE_PROJECT = "maven.archetype.generate"; - export const JAVA_PROJECT_LIST = "java.project.list"; export const JAVA_PROJECT_REFRESH_LIB_SERVER = "java.project.refreshLib"; @@ -74,10 +72,6 @@ export namespace Commands { export const JAVA_PROJECT_GENERATEJAR = "java.project.generateJar"; - export const VSCODE_OPEN_FOLDER = "vscode.openFolder"; - - export const VSCODE_OPEN = "vscode.open"; - export const JAVA_BUILD_WORKSPACE = "java.workspace.compile"; export const JAVA_CLEAN_WORKSPACE = "java.clean.workspace"; @@ -85,6 +79,17 @@ export namespace Commands { export const JAVA_PROJECT_CONFIGURATION_UPDATE = "java.projectConfiguration.update"; export const JAVA_RESOLVE_BUILD_FILES = "vscode.java.resolveBuildFiles"; + + /** + * Commands from Visual Studio Code + */ + export const VSCODE_OPEN_FOLDER = "vscode.openFolder"; + + export const VSCODE_OPEN = "vscode.open"; + + export const WORKBENCH_ACTION_FILES_OPENFOLDER = "workbench.action.files.openFolder"; + + export const WORKBENCH_ACTION_FILES_OPENFILEFOLDER = "workbench.action.files.openFileFolder"; } export function executeJavaLanguageServerCommand(...rest) { diff --git a/src/controllers/projectController.ts b/src/controllers/projectController.ts index 7109ad1c..fc25104f 100644 --- a/src/controllers/projectController.ts +++ b/src/controllers/projectController.ts @@ -16,6 +16,7 @@ export class ProjectController implements Disposable { public constructor(public readonly context: ExtensionContext) { this.disposable = Disposable.from( instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_CREATE, () => this.createJavaProject()), + instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_OPEN, () => this.openJavaProject()), ); } @@ -23,6 +24,14 @@ export class ProjectController implements Disposable { this.disposable.dispose(); } + public async openJavaProject() { + const availableCommands: string[] = await commands.getCommands(); + if (availableCommands.includes(Commands.WORKBENCH_ACTION_FILES_OPENFOLDER)) { + return commands.executeCommand(Commands.WORKBENCH_ACTION_FILES_OPENFOLDER); + } + return commands.executeCommand(Commands.WORKBENCH_ACTION_FILES_OPENFILEFOLDER); + } + public async createJavaProject() { const items: IProjectTypeQuickPick[] = projectTypes.map((type: IProjectType) => { return { diff --git a/src/exportJarSteps/ExportJarTaskProvider.ts b/src/exportJarSteps/ExportJarTaskProvider.ts index 1f853553..d191237d 100644 --- a/src/exportJarSteps/ExportJarTaskProvider.ts +++ b/src/exportJarSteps/ExportJarTaskProvider.ts @@ -11,9 +11,9 @@ import { TaskProvider, TaskRevealKind, tasks, TerminalDimensions, Uri, workspace, WorkspaceFolder, } from "vscode"; import { buildWorkspace } from "../build"; -import { isStandardServerReady } from "../extension"; import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; +import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; import { Settings } from "../settings"; import { IUriData, Trie, TrieNode } from "../views/nodeCache/Trie"; import { IClasspathResult } from "./GenerateJarExecutor"; @@ -31,7 +31,7 @@ interface IExportJarTaskDefinition extends TaskDefinition { let isExportingJar: boolean = false; export async function executeExportJarTask(node?: INodeData): Promise { - if (!isStandardServerReady() || isExportingJar || await buildWorkspace() === false) { + if (!await languageServerApiManager.isStandardServerReady() || isExportingJar || await buildWorkspace() === false) { return; } isExportingJar = true; diff --git a/src/extension.ts b/src/extension.ts index 8d00c479..fe76d3b8 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,10 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import { commands, Event, Extension, ExtensionContext, extensions, tasks, Uri } from "vscode"; -import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper"; +import { ExtensionContext, tasks } from "vscode"; +import { dispose as disposeTelemetryWrapper, initializeFromJsonFile, instrumentOperation } from "vscode-extension-telemetry-wrapper"; import { contextManager } from "../extension.bundle"; -import { Commands } from "./commands"; import { Build, Context } from "./constants"; import { LibraryController } from "./controllers/libraryController"; import { ProjectController } from "./controllers/projectController"; @@ -14,92 +13,26 @@ import { Settings } from "./settings"; import { syncHandler } from "./syncHandler"; import { DependencyExplorer } from "./views/dependencyExplorer"; -export async function activate(context: ExtensionContext): Promise { +export async function activate(context: ExtensionContext): Promise { + contextManager.initialize(context); await initializeFromJsonFile(context.asAbsolutePath("./package.json"), { firstParty: true }); - return instrumentOperation("activation", activateExtension)(context); + await instrumentOperation("activation", activateExtension)(context); + contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); + contextManager.setContextValue(Context.SUPPORTED_BUILD_FILES, Build.FILE_NAMES); } async function activateExtension(_operationId: string, context: ExtensionContext): Promise { context.subscriptions.push(new ProjectController(context)); - context.subscriptions.push(instrumentOperationAsVsCodeCommand(Commands.JAVA_PROJECT_ACTIVATE, async () => { - const extension: Extension | undefined = extensions.getExtension("redhat.java"); - if (extension) { - await extension.activate(); - const extensionApi: any = extension.exports; - if (!extensionApi) { - return; - } - - serverMode = extensionApi.serverMode; - - if (extensionApi.onDidClasspathUpdate) { - const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; - context.subscriptions.push(onDidClasspathUpdate(async () => { - await commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); - })); - } - - if (extensionApi.onDidServerModeChange) { - const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; - context.subscriptions.push(onDidServerModeChange(async (mode: string) => { - serverMode = mode; - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); - })); - } - - if (extensionApi.onDidProjectsImport) { - const onDidProjectsImport: Event = extensionApi.onDidProjectsImport; - context.subscriptions.push(onDidProjectsImport(async () => { - commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); - })); - } - } - - Settings.initialize(context); - contextManager.initialize(context); - - context.subscriptions.push(new LibraryController(context)); - context.subscriptions.push(DependencyExplorer.getInstance(context)); - context.subscriptions.push(contextManager); - context.subscriptions.push(syncHandler); - context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); - contextManager.setContextValue(Context.EXTENSION_ACTIVATED, true); - contextManager.setContextValue(Context.SUPPORTED_BUILD_FILES, Build.FILE_NAMES); - - initExpService(context); - })); + Settings.initialize(context); + context.subscriptions.push(new LibraryController(context)); + context.subscriptions.push(DependencyExplorer.getInstance(context)); + context.subscriptions.push(contextManager); + context.subscriptions.push(syncHandler); + context.subscriptions.push(tasks.registerTaskProvider(ExportJarTaskProvider.exportJarType, new ExportJarTaskProvider())); + initExpService(context); } // this method is called when your extension is deactivated export async function deactivate() { await disposeTelemetryWrapper(); } - -export function isStandardServerReady(): boolean { - // undefined serverMode indicates an older version language server - if (serverMode === undefined) { - return true; - } - - if (serverMode !== LanguageServerMode.Standard) { - return false; - } - - return true; -} - -export function isLightWeightMode(): boolean { - return serverMode === LanguageServerMode.LightWeight; -} - -export function isSwitchingServer(): boolean { - return serverMode === LanguageServerMode.Hybrid; -} - -let serverMode: string | undefined; - -export const enum LanguageServerMode { - LightWeight = "LightWeight", - Standard = "Standard", - Hybrid = "Hybrid", -} diff --git a/src/languageServerApi/LanguageServerMode.ts b/src/languageServerApi/LanguageServerMode.ts new file mode 100644 index 00000000..87c75471 --- /dev/null +++ b/src/languageServerApi/LanguageServerMode.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +export const enum LanguageServerMode { + LightWeight = "LightWeight", + Standard = "Standard", + Hybrid = "Hybrid", +} diff --git a/src/languageServerApi/languageServerApiManager.ts b/src/languageServerApi/languageServerApiManager.ts new file mode 100644 index 00000000..90bc2fe5 --- /dev/null +++ b/src/languageServerApi/languageServerApiManager.ts @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { commands, Event, Extension, extensions, Uri } from "vscode"; +import { Commands } from "../commands"; +import { contextManager } from "../contextManager"; +import { LanguageServerMode } from "./LanguageServerMode"; + +class LanguageServerApiManager { + private serverMode: LanguageServerMode | null | undefined = null; + + public async isStandardServerReady(): Promise { + await this.checkServerMode(); + // undefined serverMode indicates an older version language server + if (this.serverMode === undefined) { + return true; + } + + if (this.serverMode !== LanguageServerMode.Standard) { + return false; + } + + return true; + } + + public async isLightWeightMode(): Promise { + await this.checkServerMode(); + return this.serverMode === LanguageServerMode.LightWeight; + } + + public async isSwitchingServer(): Promise { + await this.checkServerMode(); + return this.serverMode === LanguageServerMode.Hybrid; + } + + private async checkServerMode(): Promise { + if (this.serverMode === null) { + await this.initializeJavaLanguageServerApi(); + } + } + + private async initializeJavaLanguageServerApi(): Promise { + if (this.serverMode !== null) { + return; + } + const extension: Extension | undefined = extensions.getExtension("redhat.java"); + if (extension) { + await extension.activate(); + const extensionApi: any = extension.exports; + if (!extensionApi) { + return; + } + + this.serverMode = extensionApi.serverMode; + + if (extensionApi.onDidClasspathUpdate) { + const onDidClasspathUpdate: Event = extensionApi.onDidClasspathUpdate; + contextManager.context.subscriptions.push(onDidClasspathUpdate(async () => { + await commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + })); + } + + if (extensionApi.onDidServerModeChange) { + const onDidServerModeChange: Event = extensionApi.onDidServerModeChange; + contextManager.context.subscriptions.push(onDidServerModeChange(async (mode: LanguageServerMode) => { + this.serverMode = mode; + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); + })); + } + + if (extensionApi.onDidProjectsImport) { + const onDidProjectsImport: Event = extensionApi.onDidProjectsImport; + contextManager.context.subscriptions.push(onDidProjectsImport(async () => { + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); + })); + } + } + } +} + +export const languageServerApiManager: LanguageServerApiManager = new LanguageServerApiManager(); diff --git a/src/views/dataNode.ts b/src/views/dataNode.ts index f239d391..fff6b03c 100644 --- a/src/views/dataNode.ts +++ b/src/views/dataNode.ts @@ -9,6 +9,8 @@ import { ExplorerNode } from "./explorerNode"; export abstract class DataNode extends ExplorerNode { + protected _childrenNodes: ExplorerNode[]; + protected _lock: Lock = new Lock(); constructor(protected _nodeData: INodeData, parent: DataNode) { @@ -67,9 +69,10 @@ export abstract class DataNode extends ExplorerNode { if (!this._nodeData.children) { const data = await this.loadData(); this._nodeData.children = data; - return this.createChildNodeList(); + this._childrenNodes = this.createChildNodeList(); + return this._childrenNodes; } - return this.createChildNodeList(); + return this._childrenNodes; } finally { this._lock.release(); } diff --git a/src/views/dependencyDataProvider.ts b/src/views/dependencyDataProvider.ts index a948a64a..406ee0d3 100644 --- a/src/views/dependencyDataProvider.ts +++ b/src/views/dependencyDataProvider.ts @@ -10,9 +10,9 @@ import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode- import { Commands } from "../commands"; import { newJavaClass, newPackage } from "../explorerCommands/new"; import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider"; -import { isLightWeightMode, isSwitchingServer } from "../extension"; import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; +import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; import { Settings } from "../settings"; import { Lock } from "../utils/Lock"; import { DataNode } from "./dataNode"; @@ -99,11 +99,11 @@ export class DependencyDataProvider implements TreeDataProvider { } public async getChildren(element?: ExplorerNode): Promise { - if (isLightWeightMode()) { + if (await languageServerApiManager.isLightWeightMode()) { return []; } - if (isSwitchingServer()) { + if (await languageServerApiManager.isSwitchingServer()) { await new Promise((resolve: () => void): void => { extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve); }); diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index 4b4c2e19..e04939b8 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -10,9 +10,9 @@ import { Build } from "../constants"; import { deleteFiles } from "../explorerCommands/delete"; import { renameFile } from "../explorerCommands/rename"; import { getCmdNode } from "../explorerCommands/utility"; -import { isStandardServerReady } from "../extension"; import { Jdtls } from "../java/jdtls"; import { INodeData } from "../java/nodeData"; +import { languageServerApiManager } from "../languageServerApi/languageServerApiManager"; import { Settings } from "../settings"; import { DataNode } from "./dataNode"; import { DependencyDataProvider } from "./dependencyDataProvider"; @@ -133,7 +133,7 @@ export class DependencyExplorer implements Disposable { } public async reveal(uri: Uri): Promise { - if (!isStandardServerReady()) { + if (!await languageServerApiManager.isStandardServerReady()) { return; } diff --git a/src/views/hierarchicalPackageNode.ts b/src/views/hierarchicalPackageNode.ts index 5f3c31af..ed27fcdf 100644 --- a/src/views/hierarchicalPackageNode.ts +++ b/src/views/hierarchicalPackageNode.ts @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. +import * as _ from "lodash"; import { TreeItem, TreeItemCollapsibleState } from "vscode"; import { HierarchicalPackageNodeData } from "../java/hierarchicalPackageNodeData"; import { INodeData, NodeKind } from "../java/nodeData"; @@ -33,6 +34,7 @@ export class HierarchicalPackageNode extends PackageNode { if (data) { if (this.nodeData?.children) { this.nodeData.children.push(...data); + this.nodeData.children = _.uniqBy(this.nodeData.children, "path"); } else { this.nodeData.children = data; } diff --git a/test/shared.ts b/test/shared.ts index 488cf640..28a20352 100644 --- a/test/shared.ts +++ b/test/shared.ts @@ -2,8 +2,8 @@ // Licensed under the MIT license. import * as path from "path"; -import { commands, extensions, Uri } from "vscode"; -import { Commands, DataNode, LanguageServerMode } from "../extension.bundle"; +import { extensions, Uri } from "vscode"; +import { DataNode } from "../extension.bundle"; export namespace Uris { // Simple Project @@ -39,16 +39,6 @@ export function truePath(...paths: string[]) { } export async function setupTestEnv() { - await new Promise(async (resolve) => { - const extensionApi: any = extensions.getExtension("redhat.java")!.exports; - extensionApi.onDidServerModeChange(async (mode: string) => { - if (mode === LanguageServerMode.Standard) { - resolve(); - } - }); - - await extensions.getExtension("vscjava.vscode-java-dependency")!.activate(); - // context would be initialized after this command - await commands.executeCommand(Commands.JAVA_PROJECT_ACTIVATE); - }); + await extensions.getExtension("redhat.java")!.activate(); + await extensions.getExtension("vscjava.vscode-java-dependency")!.activate(); }