|
20 | 20 | [com.redhat.devtools.lsp4ij LSPIJUtils ServerStatus]
|
21 | 21 | [com.redhat.devtools.lsp4ij.client LanguageClientImpl]
|
22 | 22 | [com.redhat.devtools.lsp4ij.client.features LSPClientFeatures LSPProgressFeature]
|
| 23 | + [com.redhat.devtools.lsp4ij.installation LanguageServerInstallerBase] |
23 | 24 | [com.redhat.devtools.lsp4ij.server OSProcessStreamConnectionProvider]
|
24 | 25 | [java.io File]
|
25 | 26 | [java.util List]
|
26 | 27 | [org.eclipse.lsp4j InitializeParams]))
|
27 | 28 |
|
28 | 29 | (set! *warn-on-reflection* true)
|
29 | 30 |
|
30 |
| -(defonce ^:private server (atom {:status :not-found |
31 |
| - :path nil})) |
| 31 | +(defonce ^:private server-path* (atom nil)) |
| 32 | +(defonce ^:private server-installing* (atom false)) |
32 | 33 |
|
33 | 34 | (defn -createConnectionProvider [_ ^Project _project]
|
34 |
| - (let [server-path (loop [] |
35 |
| - (Thread/sleep 100) |
36 |
| - (or (settings/server-path) |
37 |
| - (some-> ^File (:path @server) .getCanonicalPath) |
38 |
| - (recur))) |
39 |
| - command [server-path "listen"]] |
| 35 | + (let [path (loop [] |
| 36 | + (Thread/sleep 100) |
| 37 | + (or (settings/server-path) |
| 38 | + (some-> ^File @server-path* .getCanonicalPath) |
| 39 | + (recur))) |
| 40 | + command [path "listen"]] |
40 | 41 | (doto (proxy+
|
41 | 42 | []
|
42 | 43 | OSProcessStreamConnectionProvider)
|
|
48 | 49 | (defn -getServerInterface [_]
|
49 | 50 | com.github.clojure_lsp.intellij.ClojureLanguageServer)
|
50 | 51 |
|
51 |
| -(defn ^:private install-server [project] |
52 |
| - (swap! server assoc :status :installing) |
53 |
| - (server/install-server |
54 |
| - project |
55 |
| - (fn [{:keys [status path]}] |
56 |
| - (swap! server assoc :status status :path path) |
57 |
| - (server/start! project)))) |
58 |
| - |
59 | 52 | (defn ^:private create-temp-file ^VirtualFile
|
60 | 53 | [^Project project ^String path ^String text]
|
61 | 54 | (let [temp-file (io/file (config/project-cache-path project) path)]
|
|
96 | 89 | (defn -createClientFeatures [_]
|
97 | 90 | (doto
|
98 | 91 | (proxy+ [] LSPClientFeatures
|
99 |
| - (isEnabled [_this ^VirtualFile file] |
100 |
| - (case (:status @server) |
101 |
| - :installing |
102 |
| - false |
103 |
| - |
104 |
| - :installed |
105 |
| - true |
106 |
| - |
107 |
| - :not-found |
108 |
| - (do (install-server (editor/guess-project-for file)) |
109 |
| - false))) |
| 92 | + (keepServerAlive [_] true) |
110 | 93 | (initializeParams [_ ^InitializeParams params]
|
111 | 94 | (.setWorkDoneToken params "clojure-lsp-startup")
|
112 | 95 | (.setInitializationOptions params {"dependency-scheme" "jar"
|
113 | 96 | "hover" {"arity-on-same-line?" true}}))
|
114 | 97 | (findFileByUri ^VirtualFile [_ ^String uri]
|
115 | 98 | (find-file-by-uri uri))
|
116 |
| - (keepServerAlive [_] true) |
117 | 99 | (handleServerStatusChanged [^LSPClientFeatures this ^ServerStatus server-status]
|
118 | 100 | (let [status (keyword (.toString server-status))]
|
119 | 101 | (db/assoc-in (.getProject this) [:status] status)
|
120 | 102 | (run! #(% status) (db/get-in (.getProject this) [:on-status-changed-fns])))))
|
121 | 103 | (.setProgressFeature (proxy+ [] LSPProgressFeature
|
122 | 104 | (updateMessage [_ ^String message ^ProgressIndicator indicator]
|
123 |
| - (.setText indicator (str "LSP: " message))))))) |
| 105 | + (.setText indicator (str "LSP: " message))))) |
| 106 | + (.setServerInstaller (proxy+ [] LanguageServerInstallerBase |
| 107 | + (checkServerInstalled [_ _indicator] |
| 108 | + (let [{:keys [status path]} (server/server-install-status)] |
| 109 | + (if (identical? :installed status) |
| 110 | + (do |
| 111 | + (when-not @server-path* (reset! server-path* path)) |
| 112 | + true) |
| 113 | + false))) |
| 114 | + (install [^LSPClientFeatures this indicator] |
| 115 | + (when-not @server-installing* |
| 116 | + (reset! server-installing* true) |
| 117 | + (reset! server-path* (server/install-server! (.getProject this) indicator)) |
| 118 | + (reset! server-installing* false))))))) |
0 commit comments