|
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