|
1 | 1 | // Copyright (c) Microsoft Corporation. All rights reserved. |
2 | 2 | // Licensed under the MIT license. |
3 | 3 |
|
4 | | -import { commands, Event, Extension, extensions, Uri } from "vscode"; |
| 4 | +import { commands, Disposable, Event, Extension, extensions, Uri } from "vscode"; |
5 | 5 | import { Commands } from "../commands"; |
| 6 | +import { Context, ExtensionName } from "../constants"; |
6 | 7 | import { contextManager } from "../contextManager"; |
| 8 | +import { Settings } from "../settings"; |
| 9 | +import { syncHandler } from "../syncHandler"; |
7 | 10 | import { LanguageServerMode } from "./LanguageServerMode"; |
8 | 11 |
|
9 | | -class LanguageServerApiManager { |
| 12 | +class LanguageServerApiManager implements Disposable { |
| 13 | + /** |
| 14 | + * undefined means a legacy version language server |
| 15 | + * null means the JDT.LS is not activated |
| 16 | + */ |
10 | 17 | private serverMode: LanguageServerMode | null | undefined = null; |
11 | 18 |
|
12 | | - public async isStandardServerReady(): Promise<boolean> { |
| 19 | + private extensionChangeListener: Disposable; |
| 20 | + |
| 21 | + public async ready(): Promise<boolean> { |
13 | 22 | await this.checkServerMode(); |
14 | | - // undefined serverMode indicates an older version language server |
15 | | - if (this.serverMode === undefined) { |
16 | | - return true; |
17 | | - } |
18 | 23 |
|
19 | | - if (this.serverMode !== LanguageServerMode.Standard) { |
| 24 | + if (this.serverMode === null || this.serverMode === LanguageServerMode.LightWeight) { |
20 | 25 | return false; |
21 | 26 | } |
22 | 27 |
|
23 | | - return true; |
24 | | - } |
25 | | - |
26 | | - public async isLightWeightMode(): Promise<boolean> { |
27 | | - await this.checkServerMode(); |
28 | | - return this.serverMode === LanguageServerMode.LightWeight; |
29 | | - } |
30 | | - |
31 | | - public async awaitSwitchingServerFinished(): Promise<void> { |
32 | | - await this.checkServerMode(); |
33 | 28 | if (this.serverMode === LanguageServerMode.Hybrid) { |
34 | 29 | await new Promise<void>((resolve: () => void): void => { |
35 | 30 | extensions.getExtension("redhat.java")!.exports.onDidServerModeChange(resolve); |
36 | 31 | }); |
37 | 32 | } |
38 | | - } |
39 | 33 |
|
40 | | - private async checkServerMode(): Promise<void> { |
41 | | - if (this.serverMode === null) { |
42 | | - await this.initializeJavaLanguageServerApi(); |
43 | | - } |
| 34 | + return true; |
44 | 35 | } |
45 | 36 |
|
46 | | - private async initializeJavaLanguageServerApi(): Promise<void> { |
47 | | - if (this.serverMode !== null) { |
| 37 | + public async initializeJavaLanguageServerApi(forceActivate: boolean = true): Promise<void> { |
| 38 | + if (this.isLanguageServerActivated()) { |
48 | 39 | return; |
49 | 40 | } |
50 | | - const extension: Extension<any> | undefined = extensions.getExtension("redhat.java"); |
| 41 | + |
| 42 | + if (!this.extensionChangeListener) { |
| 43 | + this.extensionChangeListener = extensions.onDidChange(() => { |
| 44 | + if (this.serverMode === null) { |
| 45 | + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); |
| 46 | + } |
| 47 | + }); |
| 48 | + } |
| 49 | + |
| 50 | + const extension: Extension<any> | undefined = extensions.getExtension(ExtensionName.JAVA_LANGUAGE_SUPPORT); |
51 | 51 | if (extension) { |
| 52 | + contextManager.setContextValue(Context.LANGUAGE_SUPPORT_INSTALLED, true); |
| 53 | + if (!forceActivate) { |
| 54 | + return; |
| 55 | + } |
52 | 56 | await extension.activate(); |
53 | 57 | const extensionApi: any = extension.exports; |
54 | 58 | if (!extensionApi) { |
55 | 59 | return; |
56 | 60 | } |
57 | 61 |
|
58 | 62 | this.serverMode = extensionApi.serverMode; |
| 63 | + if (this.serverMode === LanguageServerMode.Standard) { |
| 64 | + syncHandler.updateFileWatcher(Settings.autoRefresh()); |
| 65 | + } |
59 | 66 |
|
60 | 67 | if (extensionApi.onDidClasspathUpdate) { |
61 | 68 | const onDidClasspathUpdate: Event<Uri> = extensionApi.onDidClasspathUpdate; |
62 | | - contextManager.context.subscriptions.push(onDidClasspathUpdate(async () => { |
63 | | - await commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); |
| 69 | + contextManager.context.subscriptions.push(onDidClasspathUpdate(() => { |
| 70 | + commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); |
| 71 | + syncHandler.updateFileWatcher(Settings.autoRefresh()); |
64 | 72 | })); |
65 | 73 | } |
66 | 74 |
|
67 | 75 | if (extensionApi.onDidServerModeChange) { |
68 | 76 | const onDidServerModeChange: Event<string> = extensionApi.onDidServerModeChange; |
69 | | - contextManager.context.subscriptions.push(onDidServerModeChange(async (mode: LanguageServerMode) => { |
| 77 | + contextManager.context.subscriptions.push(onDidServerModeChange((mode: LanguageServerMode) => { |
70 | 78 | if (this.serverMode !== mode) { |
71 | | - let needRefresh: boolean = true; |
72 | | - if (this.serverMode === "Hybrid") { |
73 | | - // Explorer will await when JLS is in Hybrid mode (activating), |
74 | | - needRefresh = false; |
75 | | - } |
76 | | - this.serverMode = mode; |
77 | | - if (needRefresh) { |
| 79 | + if (mode === LanguageServerMode.Hybrid) { |
78 | 80 | commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */false); |
| 81 | + } else if (mode === LanguageServerMode.Standard) { |
| 82 | + syncHandler.updateFileWatcher(Settings.autoRefresh()); |
79 | 83 | } |
| 84 | + this.serverMode = mode; |
80 | 85 | } |
81 | 86 | })); |
82 | 87 | } |
83 | 88 |
|
84 | 89 | if (extensionApi.onDidProjectsImport) { |
85 | 90 | const onDidProjectsImport: Event<Uri[]> = extensionApi.onDidProjectsImport; |
86 | | - contextManager.context.subscriptions.push(onDidProjectsImport(async () => { |
| 91 | + contextManager.context.subscriptions.push(onDidProjectsImport(() => { |
87 | 92 | commands.executeCommand(Commands.VIEW_PACKAGE_REFRESH, /* debounce = */true); |
| 93 | + syncHandler.updateFileWatcher(Settings.autoRefresh()); |
88 | 94 | })); |
89 | 95 | } |
90 | 96 | } |
91 | 97 | } |
| 98 | + |
| 99 | + public dispose() { |
| 100 | + this.extensionChangeListener.dispose(); |
| 101 | + } |
| 102 | + |
| 103 | + private isLanguageServerActivated(): boolean { |
| 104 | + return this.serverMode !== null; |
| 105 | + } |
| 106 | + |
| 107 | + private async checkServerMode(): Promise<void> { |
| 108 | + if (!this.isLanguageServerActivated()) { |
| 109 | + await this.initializeJavaLanguageServerApi(); |
| 110 | + } |
| 111 | + } |
92 | 112 | } |
93 | 113 |
|
94 | 114 | export const languageServerApiManager: LanguageServerApiManager = new LanguageServerApiManager(); |
0 commit comments