Skip to content

Commit 46a3235

Browse files
committed
Fix status bar
1 parent b29789d commit 46a3235

24 files changed

+132
-276
lines changed

.lsp/config.edn

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
{:cljfmt {:indents {proxy+ [[:block 2] [:inner 1]]}}}
1+
{:cljfmt {:indents {proxy+ [[:block 2] [:inner 1]]}}
2+
:project-specs [{:classpath-cmd ["./gradlew" "-q" "classpath"]
3+
:project-path "build.gradle.kts"}
4+
{:classpath-cmd ["clojure" "-Spath"]
5+
:project-path "deps.edn"}]}

build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ java {
7474
sourceCompatibility = JavaVersion.VERSION_17
7575
}
7676

77+
tasks.register("classpath") {
78+
doFirst {
79+
println(sourceSets["main"].compileClasspath.asPath)
80+
}
81+
}
82+
7783
tasks {
7884
compileKotlin {
7985
kotlinOptions {

deps.edn

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,5 @@
11
{:paths ["src/main/clojure"]
2-
:mvn/repos {"intellij-1" {:url "https://cache-redirector.jetbrains.com/intellij-dependencies"}
3-
"intellij-2" {:url "https://www.jetbrains.com/intellij-repository/releases"}}
4-
:deps {org.clojure/clojure {:mvn/version "1.11.1"}
5-
com.github.ericdallo/clj4intellij {:mvn/version "0.5.4"}
6-
seesaw/seesaw {:mvn/version "1.5.0"}
7-
camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.3"}
8-
com.github.clojure-lsp/clojure-lsp {:mvn/version "2024.03.01-11.37.51"}
9-
markdown-clj/markdown-clj {:mvn/version "1.12.1"}
10-
com.rpl/proxy-plus {:mvn/version "0.0.9"}}
11-
:aliases {:dev {:deps {nrepl/nrepl {:mvn/version "1.0.0"}
12-
com.jetbrains.intellij.platform/ide-impl {:mvn/version "213.7172.48"
13-
:exclusions [org.jetbrains.kotlin/kotlin-stdlib-jdk8
14-
org.jetbrains.kotlin/kotlin-reflect
15-
org.jetbrains.kotlinx/kotlinx-coroutines-jdk8
16-
org.jetbrains.kotlinx/kotlinx-serialization-json-jvm
17-
org.jetbrains.kotlinx/kotlinx-serialization-core-jvm
18-
19-
com.jetbrains.intellij.platform/external-system-impl
20-
com.jetbrains.intellij.platform/service-container
21-
com.jetbrains.intellij.platform/statistics-devkit
22-
com.jetbrains.infra/download-pgp-verifier]}}}
23-
:build {:extra-paths ["src/main/resources"]
2+
:aliases {:build {:extra-paths ["src/main/resources"]
243
:deps {io.github.clojure/tools.build {:git/tag "v0.8.1"
254
:git/sha "7d40500"}
265
slipset/deps-deploy {:mvn/version "0.2.0"}}

src/main/clojure/com/github/clojure_lsp/intellij/action/implementations.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
(set! *warn-on-reflection* true)
2525

2626
(defn show-implementations [^Editor editor line character]
27-
(if-let [client (lsp-client/connected-client (.getProject editor))]
27+
(if-let [client (lsp-client/connected-server (.getProject editor))]
2828
(let [implementations @(lsp-client/request! client [:textDocument/implementation
2929
{:text-document {:uri (editor/editor->uri editor)}
3030
:position {:line line

src/main/clojure/com/github/clojure_lsp/intellij/action/refactors.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
(defn execute-refactor-action [command-name ^AnActionEvent event]
1616
(when-let [editor ^Editor (.getData event CommonDataKeys/EDITOR)]
17-
(if-let [client (lsp-client/connected-client (.getProject editor))]
17+
(if-let [client (lsp-client/connected-server (.getProject editor))]
1818
(let [[line character] (util/editor->cursor-position editor)]
1919
(tasks/run-background-task!
2020
(.getProject editor)

src/main/clojure/com/github/clojure_lsp/intellij/action/references.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
(defn find-references-action [^AnActionEvent event]
5959
(when-let [editor ^Editor (.getData event CommonDataKeys/EDITOR)]
60-
(if-let [client (lsp-client/connected-client (.getProject editor))]
60+
(if-let [client (lsp-client/connected-server (.getProject editor))]
6161
(let [[line character] (util/editor->cursor-position editor)]
6262
(show-references editor line character client))
6363
(.showErrorHint (HintManager/getInstance) ^Editor editor "LSP not connected" HintManager/RIGHT))))

src/main/clojure/com/github/clojure_lsp/intellij/client.clj

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
[lsp4clj.lsp.responses :as lsp.responses]
1111
[lsp4clj.protocols.endpoint :as protocols.endpoint])
1212
(:import
13-
[com.intellij.openapi.project Project]))
13+
[com.intellij.openapi.project Project]
14+
[com.redhat.devtools.lsp4ij LanguageServerManager]))
1415

1516
(set! *warn-on-reflection* true)
1617

@@ -145,6 +146,10 @@
145146
(defn notify! [client [method body]]
146147
(protocols.endpoint/send-notification client (subs (str method) 1) body))
147148

148-
(defn connected-client [^Project project]
149-
(when (identical? :connected (db/get-in project [:status]))
150-
(db/get-in project [:client])))
149+
(defn connected-server [^Project project]
150+
(when-let [manager (LanguageServerManager/getInstance project)]
151+
@(.getLanguageServer manager "clojure-lsp")))
152+
153+
(defn server-status [^Project project]
154+
(when-let [manager (LanguageServerManager/getInstance project)]
155+
(keyword (.toString (.getServerStatus manager "clojure-lsp")))))

src/main/clojure/com/github/clojure_lsp/intellij/db.clj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@
1111
(def ^:private empty-project
1212
{:status :disconnected
1313
:downloaded-server-path nil
14-
:client nil
1514
:server-process nil
15+
:server nil
1616
:project nil
1717
:diagnostics {}
1818
:settings {:trace-level "off"
19-
:server-path nil}})
19+
:server-path nil}
20+
:on-status-changed-fns []})
2021

21-
(defonce db* (atom {:projects {}
22-
:on-status-changed-fns []}))
22+
(defonce db* (atom {:projects {}}))
2323

2424
(defn empty-db? []
2525
(empty? (:projects @db*)))
@@ -38,9 +38,9 @@
3838

3939
(defn init-db-for-project [^Project project]
4040
(swap! db* update :projects (fn [projects]
41-
(if (clojure.core/get projects (.getBasePath project))
41+
(if (clojure.core/get-in projects [(.getBasePath project) :project])
4242
projects
43-
(assoc projects (.getBasePath project) (assoc empty-project :project project))))))
43+
(update projects (.getBasePath project) #(merge (assoc empty-project :project project) %))))))
4444

4545
(defn await-field [project field fn]
4646
(async/thread

src/main/clojure/com/github/clojure_lsp/intellij/extension/code_action.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
(defonce code-action-name->title* (atom {}))
1616

1717
(defn ^:private req-code-actions [project uri [line character]]
18-
(when-let [client (lsp-client/connected-client project)]
18+
(when-let [client (lsp-client/connected-server project)]
1919
(let [diagnostics (->> (db/get-in project [:diagnostics uri])
2020
(filterv (fn [{{:keys [start end]} :range}]
2121
(and (<= (:line start) line (:line end))

src/main/clojure/com/github/clojure_lsp/intellij/extension/code_lens.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595

9696
(defn -getCollectorFor [_ _file ^Editor editor _settings ^InlayHintsSink sink]
9797
(let [uri (editor/editor->uri editor)]
98-
(when-let [client (lsp-client/connected-client (.getProject editor))]
98+
(when-let [client (lsp-client/connected-server (.getProject editor))]
9999
;; For some reason `(PresentationFactory. editor)` does not work
100100
(proxy+ [editor] FactoryInlayHintsCollector
101101
(collect [^FactoryInlayHintsCollector this _ _ _]

src/main/clojure/com/github/clojure_lsp/intellij/extension/completion.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
(.withAutoCompletionPolicy AutoCompletionPolicy/SETTINGS_DEPENDENT)))))
8787

8888
(defn -fillCompletionVariants [_ ^CompletionParameters params ^CompletionResultSet result]
89-
(when-let [client (lsp-client/connected-client (.getProject (.getEditor params)))]
89+
(when-let [client (lsp-client/connected-server (.getProject (.getEditor params)))]
9090
(try
9191
(let [file (.getOriginalFile params)
9292
uri (.getUrl (.getVirtualFile file))

src/main/clojure/com/github/clojure_lsp/intellij/extension/definition.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
(let [[line character] (:start (editor/text-range->range (.getTextRange element) editor))
5252
project ^Project (.getProject editor)
5353
current-v-file (some-> element .getContainingFile .getVirtualFile)]
54-
(when-let [client (lsp-client/connected-client project)]
54+
(when-let [client (lsp-client/connected-server project)]
5555
(when-let [definition @(lsp-client/request! client [:textDocument/definition
5656
{:text-document {:uri (editor/editor->uri editor)}
5757
:position {:line line

src/main/clojure/com/github/clojure_lsp/intellij/extension/file_manager.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@
2121

2222
(defn -beforeDocumentSaving [_ ^Document document]
2323
(let [vfile (.getFile (FileDocumentManager/getInstance) document)]
24-
(when-let [client (some-> vfile editor/v-file->project lsp-client/connected-client)]
24+
(when-let [client (some-> vfile editor/v-file->project lsp-client/connected-server)]
2525
(lsp-client/notify! client [:textDocument/didSave
2626
{:textDocument {:uri (.getUrl vfile)}}]))))

src/main/clojure/com/github/clojure_lsp/intellij/extension/formatting.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
(defn -canFormat [_ ^PsiFile psi-file]
1919
(and (instance? ClojureFileType (.getFileType psi-file))
20-
(boolean (lsp-client/connected-client (.getProject psi-file)))))
20+
(boolean (lsp-client/connected-server (.getProject psi-file)))))
2121

2222
(defn -getName [_]
2323
"LSP format")
@@ -29,7 +29,7 @@
2929
(let [context (.getContext request)
3030
file (.getContainingFile context)
3131
uri (.getUrl (.getVirtualFile file))]
32-
(when-let [client (lsp-client/connected-client (.getProject file))]
32+
(when-let [client (lsp-client/connected-server (.getProject file))]
3333
(reify AsyncDocumentFormattingService$FormattingTask
3434
(run [_]
3535
(try

src/main/clojure/com/github/clojure_lsp/intellij/extension/general_settings.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@
8989
:listen [:action (fn [_]
9090
(doseq [project (db/all-projects)]
9191
(server/shutdown! project)
92-
#_(server/start-server! project)))]) "wrap"]]) "span"]
92+
(server/start-server! project)))]) "wrap"]]) "span"]
9393
[(s/label :text "* requires LSP restart"
9494
:font (s.font/font :size 14)
9595
:foreground (s.color/color 110 110 110)) "wrap"]]
9696
(remove nil?)))))
9797

9898
(defn ^:private server-info! [^Project project]
99-
(some-> (lsp-client/connected-client project)
99+
(some-> (lsp-client/connected-server project)
100100
(lsp-client/request! [":clojure/serverInfo/raw" {}])
101101
deref
102102
walk/keywordize-keys))

src/main/clojure/com/github/clojure_lsp/intellij/extension/init_db_startup.clj

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,30 @@
55
com.intellij.openapi.project.DumbAware])
66
(:require
77
[com.github.clojure-lsp.intellij.db :as db]
8-
[com.github.ericdallo.clj4intellij.logger :as logger])
8+
[com.github.ericdallo.clj4intellij.logger :as logger]
9+
[com.rpl.proxy-plus :refer [proxy+]])
910
(:import
1011
[com.github.clojure_lsp.intellij.extension SettingsState]
1112
[com.intellij.openapi.project Project]
12-
[com.redhat.devtools.lsp4ij LanguageServerManager LanguageServerManager$StartOptions]))
13+
[com.redhat.devtools.lsp4ij LanguageServerManager LanguageServerWrapper]
14+
[com.redhat.devtools.lsp4ij.lifecycle LanguageServerLifecycleListener LanguageServerLifecycleManager]))
1315

1416
(set! *warn-on-reflection* true)
1517

1618
(defn -runActivity [_this ^Project project]
1719
(db/init-db-for-project project)
1820
(db/load-settings-from-state! project (SettingsState/get))
19-
#_(.start (LanguageServerManager/getInstance (first (db/all-projects))) "clojure-lsp" )
20-
(logger/info "Loaded settings to memory:" (db/get-in project [:settings])))
21+
(logger/info "Loaded settings to memory:" (db/get-in project [:settings]))
22+
(.addLanguageServerLifecycleListener
23+
(LanguageServerLifecycleManager/getInstance project)
24+
(proxy+ [] LanguageServerLifecycleListener
25+
(handleStatusChanged [_ ^LanguageServerWrapper server-wrapper]
26+
(let [status (keyword (.toString (.getServerStatus server-wrapper)))]
27+
(db/assoc-in project [:status] status)
28+
(when (= :started status)
29+
(db/assoc-in project [:server] (.getLanguageServer (LanguageServerManager/getInstance project)
30+
"clojure-lsp")))
31+
(run! #(% status) (db/get-in project [:on-status-changed-fns]))))
32+
(handleLSPMessage [_ _ _ _])
33+
(handleError [_ _ _])
34+
(dispose [_]))))

src/main/clojure/com/github/clojure_lsp/intellij/extension/language_server_factory.clj

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,28 @@
33
:name com.github.clojure_lsp.intellij.extension.LanguageServerFactory
44
:implements [com.redhat.devtools.lsp4ij.LanguageServerFactory])
55
(:require
6-
[com.github.ericdallo.clj4intellij.logger :as logger]
76
[com.rpl.proxy-plus :refer [proxy+]])
87
(:import
98
[com.intellij.execution.configurations GeneralCommandLine]
109
[com.intellij.openapi.project Project]
11-
[com.redhat.devtools.lsp4ij.server OSProcessStreamConnectionProvider]))
10+
[com.redhat.devtools.lsp4ij.client LanguageClientImpl]
11+
[com.redhat.devtools.lsp4ij.client.features LSPClientFeatures]
12+
[com.redhat.devtools.lsp4ij.server OSProcessStreamConnectionProvider]
13+
[org.eclipse.lsp4j.services LanguageServer]))
1214

1315
(defn -createConnectionProvider [_ ^Project project]
14-
(logger/info "------->")
1516
(doto (proxy+
16-
[]
17-
OSProcessStreamConnectionProvider)
17+
[]
18+
OSProcessStreamConnectionProvider)
1819
(.setCommandLine (GeneralCommandLine. ["/home/greg/dev/clojure-lsp/clojure-lsp" "listen"]))))
1920

2021
;; TODO custom commands
21-
;; (defn -createLanguageClient [_ ^Project project]
22-
;; )
22+
(defn -createLanguageClient [_ ^Project project]
23+
(LanguageClientImpl. project))
2324

24-
;; TODO customer server methods
25-
;; (defn -getServerInterface [_]
26-
;; )
25+
;; TODO custom server methods
26+
(defn -getServerInterface [_] LanguageServer)
27+
28+
;; TODO client features
29+
(defn -createClientFeatures [_]
30+
(LSPClientFeatures.))

src/main/clojure/com/github/clojure_lsp/intellij/extension/rename.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
([_this ^Project _project ^"[Lcom.intellij.psi.PsiElement;" _elements ^DataContext _data-context])
4646
;; rename a element in a editor
4747
([_ ^Project project ^Editor editor ^PsiFile _psi-file ^DataContext _data-context]
48-
(when-let [client (lsp-client/connected-client project)]
48+
(when-let [client (lsp-client/connected-server project)]
4949
(let [[line character] (util/editor->cursor-position editor)]
5050
(when-let [current-name ^String (prepare-rename-current-name client editor line character)]
5151
(when-let [new-name (Messages/showInputDialog project "Enter new name: " "Rename" (Messages/getQuestionIcon) current-name (NonEmptyInputValidator.))]
Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
(ns com.github.clojure-lsp.intellij.extension.status-bar-factory
22
(:gen-class
3-
:post-init post-init
43
:name com.github.clojure_lsp.intellij.extension.StatusBarFactory
54
:implements [com.intellij.openapi.wm.StatusBarWidgetFactory])
65
(:require
@@ -24,7 +23,8 @@
2423
[com.intellij.ui.awt RelativePoint]
2524
[com.intellij.util Consumer]
2625
[java.awt Point]
27-
[java.awt.event MouseEvent]))
26+
[java.awt.event MouseEvent]
27+
[kotlinx.coroutines CoroutineScope]))
2828

2929
(set! *warn-on-reflection* true)
3030

@@ -50,46 +50,47 @@
5050
(.updateWidget status-bar widget-id)
5151
(.updateWidget ^StatusBarWidgetsManager (.getService project StatusBarWidgetsManager) factory)))
5252

53-
(defn -post-init [this]
54-
(swap! db/db* update :on-status-changed-fns conj (fn [project _status]
55-
(refresh-status-bar this project))))
56-
5753
(defn ^:private restart-lsp-action [^Project project]
5854
(proxy+
5955
["Restart server"]
6056
DumbAwareAction
6157
(actionPerformed [_ _event]
6258
(server/shutdown! project)
63-
#_(server/start-server! project))))
59+
(server/start-server! project))))
6460

6561
(defn ^:private status-bar-title [project]
66-
(str "Clojure LSP: " (name (db/get-in project [:status] "disconnected"))))
62+
(str "Clojure LSP: " (name (lsp-client/server-status project))))
6763

68-
(defn -createWidget ^StatusBarWidget [_this ^Project project]
69-
(proxy+
70-
[]
71-
StatusBarWidget
72-
(ID [_] widget-id)
73-
(dispose [_])
74-
(install [_ _])
75-
(getPresentation [this] this)
76-
StatusBarWidget$IconPresentation
77-
(getClickConsumer [_]
78-
(reify Consumer
79-
(consume [_ e]
80-
(let [component (.getComponent ^MouseEvent e)
81-
popup (.createActionGroupPopup
82-
(JBPopupFactory/getInstance)
83-
(status-bar-title project)
84-
(doto (DefaultActionGroup.)
85-
(.add (restart-lsp-action project)))
86-
(.getDataContext (DataManager/getInstance) component)
87-
JBPopupFactory$ActionSelectionAid/SPEEDSEARCH
88-
true)]
89-
(.show popup (RelativePoint. component (Point. 0 (-> popup .getContent .getPreferredSize .getHeight -)))))
90-
true)))
91-
(getTooltipText [_] (status-bar-title project))
92-
(getIcon [_]
93-
(if (lsp-client/connected-client project)
94-
Icons/STATUS_CONNECTED
95-
Icons/STATUS_DISCONNECTED))))
64+
(defn -createWidget ^StatusBarWidget
65+
([this ^Project project ^CoroutineScope _]
66+
(-createWidget this project))
67+
([this ^Project project]
68+
(db/update-in project [:on-status-changed-fns] #(conj % (fn [_status]
69+
(refresh-status-bar this project))))
70+
(proxy+
71+
[]
72+
StatusBarWidget
73+
(ID [_] widget-id)
74+
(dispose [_])
75+
(install [_ _])
76+
(getPresentation [this] this)
77+
StatusBarWidget$IconPresentation
78+
(getClickConsumer [_]
79+
(reify Consumer
80+
(consume [_ e]
81+
(let [component (.getComponent ^MouseEvent e)
82+
popup (.createActionGroupPopup
83+
(JBPopupFactory/getInstance)
84+
(status-bar-title project)
85+
(doto (DefaultActionGroup.)
86+
(.add (restart-lsp-action project)))
87+
(.getDataContext (DataManager/getInstance) component)
88+
JBPopupFactory$ActionSelectionAid/SPEEDSEARCH
89+
true)]
90+
(.show popup (RelativePoint. component (Point. 0 (-> popup .getContent .getPreferredSize .getHeight -)))))
91+
true)))
92+
(getTooltipText [_] (status-bar-title project))
93+
(getIcon [_]
94+
(if (= :started (lsp-client/server-status project))
95+
Icons/STATUS_CONNECTED
96+
Icons/STATUS_DISCONNECTED)))))

0 commit comments

Comments
 (0)