Skip to content

Commit

Permalink
Added diagnostics and got kondo working again
Browse files Browse the repository at this point in the history
  • Loading branch information
snoe committed Jan 15, 2021
1 parent 66b1ab9 commit eb96b3a
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 87 deletions.
5 changes: 2 additions & 3 deletions src/clojure_lsp/crawler.clj
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@

:always
(->
(assoc-in [:config :output] {:analysis {} :canonical-paths true})
(assoc-in [:config :output] {:analysis {:signatures true} :canonical-paths true})
;; TODO Duplicated linter. Remove after using clj-kondo for all linters
(update-in [:config :linters] merge {:unused-private-var {:level :off}}))

Expand All @@ -199,7 +199,7 @@
(->> vs
(keep
(fn [v]
(when (:col v)
(when (or (:col v) (:name-col v))
(let [result (cond-> v
(= :namespace-usages k)
(assoc :end-row (:row v)
Expand All @@ -215,7 +215,6 @@
(if valid?
result
(do
#_
(log/error "Cannot find position for:" (:name result ) (pr-str result) (some-> (:name result) meta))
nil))))))
(into accum)))
Expand Down
16 changes: 11 additions & 5 deletions src/clojure_lsp/feature/diagnostics.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
[clj-kondo.core :as kondo]
[clojure.string :as string]
[clojure-lsp.db :as db]
[clojure.core.async :as async]
[clojure.tools.logging :as log]
[clojure.set :as set]))

(defn ^:private diagnose-unknown-forward-declarations [usages]
Expand Down Expand Up @@ -91,11 +93,7 @@
(merge extra)

user-config
(update-in [:config] merge user-config)

;; TODO Duplicated linter. Remove after using clj-kondo for all linters
:always
(update-in [:config :linters] merge {:unused-private-var {:level :off}}))))
(update-in [:config] merge user-config))))

(defn run-kondo-on-paths! [paths]
(kondo/run! (kondo-args {:lint [(string/join (System/getProperty "path.separator") paths)]})))
Expand All @@ -116,3 +114,11 @@
unknown-forwards (diagnose-unknown-forward-declarations usages)
result (concat unused unknown-forwards kondo-diagnostics)]
result))

(defn notify [uri {:keys [findings]}]
(when (seq findings)
(async/put! db/diagnostics-chan
{:uri uri
:diagnostics (->> findings
(filter #(= (shared/uri->filename uri) (:filename %)))
(mapv kondo-finding->diagnostic))})))
8 changes: 4 additions & 4 deletions src/clojure_lsp/feature/hover.clj
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,19 @@
(string/join "\n" unindented-lines)))
closing-code)))

(defn hover-documentation [{sym-ns :ns sym-name :name :keys [fixed-arities varargs-min-arity doc filename] :as definition}]
(defn hover-documentation [{sym-ns :ns sym-name :name :keys [fixed-arities varargs-min-arity doc filename signatures] :as definition}]
(let [[content-format] (get-in @db/db [:client-capabilities :text-document :hover :content-format])
show-docs-arity-on-same-line? (get-in @db/db [:settings :show-docs-arity-on-same-line?])
signatures (pr-str [fixed-arities varargs-min-arity])
signatures (some->> signatures (remove nil?) (map #(string/replace % #"\s+" " ")) (string/join "\n"))
sym (cond->> sym-name
sym-ns (str sym-ns "/"))]
(case content-format
"markdown" {:kind "markdown"
:value (cond-> (str opening-code sym " " (when show-docs-arity-on-same-line? signatures) closing-code)
(and (not show-docs-arity-on-same-line?) signatures) (str opening-code signatures closing-code)
filename (str "*" filename "*\n")
(seq doc) (str line-break (docstring->formatted-markdown doc))
:always (str line-break (with-out-str (pprint/pprint definition))))}
filename (str line-break "*" filename "*\n")
#_#_:always (str line-break (with-out-str (pprint/pprint definition))))}
;; Default to plaintext
(cond-> (str sym " " (when show-docs-arity-on-same-line? signatures) "\n")
(and (not show-docs-arity-on-same-line?) signatures) (str signatures "\n")
Expand Down
53 changes: 23 additions & 30 deletions src/clojure_lsp/handlers.clj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
[clojure-lsp.feature.code-actions :as f.code-actions]
[clojure-lsp.feature.completion :as f.completion]
[clojure-lsp.feature.definition :as f.definition]
[clojure-lsp.feature.diagnostics :as f.diagnostic]
[clojure-lsp.feature.document-symbol :as f.document-symbol]
[clojure-lsp.feature.hover :as f.hover]
[clojure-lsp.feature.refactor :as f.refactor]
Expand Down Expand Up @@ -77,17 +78,20 @@
(swap! db/db (fn [state-db]
(-> state-db
(assoc-in [:documents uri] {:v 0 :text text})
(crawler/update-analysis uri (:analysis result))))))
text)
(crawler/update-analysis uri (:analysis result)))))
(f.diagnostic/notify uri result))
nil)

(defn did-change [uri text version]
;; Ensure we are only accepting newer changes
(loop [state-db @db/db]
(when (> version (get-in state-db [:documents uri :v] -1))
(when-let [result (crawler/run-kondo-on-text! text uri)]
(when-not (compare-and-set! db/db state-db (-> state-db
(assoc-in [:documents uri] {:v version :text text})
(crawler/update-analysis uri (:analysis result))))

(if (compare-and-set! db/db state-db (-> state-db
(assoc-in [:documents uri] {:v version :text text})
(crawler/update-analysis uri (:analysis result))))
(f.diagnostic/notify uri result)
(recur @db/db))))))

(defn initialize [project-root client-capabilities client-settings]
Expand All @@ -100,9 +104,8 @@
:settings (-> (merge client-settings project-settings)
(update :cljfmt cljfmt.main/merge-default-options))
:client-capabilities client-capabilities)
#_(crawler/determine-dependencies project-root))
nil)
)
(crawler/determine-dependencies project-root))
nil))

(defn completion [doc-id line column]
(let [{:keys [text]} (get-in @db/db [:documents doc-id])
Expand Down Expand Up @@ -159,23 +162,23 @@
can-rename? (and (not= :namespace-definitions (:bucket definition))
(string/starts-with? (:filename definition) "/Users/case/dev/lsp"))] ;;nocommit
(when (and (seq references) can-rename?)
(let [changes
(mapv
(fn [r]
(let [name-start (- (:name-end-col r) (count (name (:name r))))
ref-doc-id (shared/filename->uri (:filename r))
version (get-in @db/db [:documents ref-doc-id :v] 0)]
{:range (shared/->range (assoc r :name-col name-start))
:new-text new-name
:text-document {:version version :uri ref-doc-id}}))
references)
doc-changes (->> changes
(let [changes (mapv
(fn [r]
(let [name-start (- (:name-end-col r) (count (name (:name r))))
ref-doc-id (shared/filename->uri (:filename r))
version (get-in @db/db [:documents ref-doc-id :v] 0)]
{:range (shared/->range (assoc r :name-col name-start))
:new-text new-name
:text-document {:version version :uri ref-doc-id}}))
references)
doc-changes (->> changes
(group-by :text-document)
(remove (comp empty? val))
(map (fn [[text-document edits]]
{:text-document text-document
:edits edits})))]
(f.refactor/client-changes doc-changes))))
;; TODO rename documents for namespace rename
(f.refactor/client-changes doc-changes))))
#_
(let [file-envs (:file-envs @db/db)
project-root (:project-root @db/db)
Expand Down Expand Up @@ -246,9 +249,6 @@
{:range r}))

(defn document-highlight [doc-id line column]

[]
#_
(let [file-envs (:file-envs @db/db)
local-env (get file-envs doc-id)
cursor (f.references/find-under-cursor line column local-env (shared/uri->file-type doc-id))
Expand Down Expand Up @@ -358,7 +358,6 @@
(defn code-actions
[doc-id diagnostics line character]
[]
#_
(let [db @db/db
row (inc (int line))
col (inc (int character))
Expand All @@ -372,7 +371,6 @@
(defn code-lens
[doc-id]
[]
#_
(let [db @db/db
usages (get-in db [:file-envs doc-id])]
(->> usages
Expand All @@ -387,7 +385,6 @@
(defn code-lens-resolve
[range [doc-id row col]]
nil
#_
{:range range
:command {:title (-> doc-id
(f.references/reference-usages row col)
Expand All @@ -398,30 +395,26 @@

(defn semantic-tokens-full
[doc-id]
#_
(let [db @db/db
usages (get-in db [:file-envs doc-id])
data (f.semantic-tokens/full-tokens usages)]
{:data data}))

(defn semantic-tokens-range
[doc-id range]
#_
(let [db @db/db
usages (get-in db [:file-envs doc-id])
data (f.semantic-tokens/range-tokens usages range)]
{:data data}))

(defn prepare-call-hierarchy
[doc-id row col]
#_
(let [{:keys [project-root file-envs]} @db/db
local-env (get file-envs doc-id)]
(f.call-hierarchy/prepare doc-id row col local-env project-root)))

(defn call-hierarchy-incoming
[item]
#_
(let [uri (.getUri item)
row (inc (-> item .getRange .getStart .getLine))
col (inc (-> item .getRange .getStart .getCharacter))
Expand Down
45 changes: 8 additions & 37 deletions src/clojure_lsp/main.clj
Original file line number Diff line number Diff line change
Expand Up @@ -314,15 +314,13 @@
(CompletableFuture/supplyAsync
(reify Supplier
(get [this]
[]
#_
(end
(try
(let [doc-id (interop/document->decoded-uri (.getTextDocument params))
pos (.getPosition params)
line (inc (.getLine pos))
column (inc (.getCharacter pos))]
(log/spy (interop/conform-or-log ::interop/document-highlights (log/spy (#'handlers/document-highlight doc-id line column)))))
(interop/conform-or-log ::interop/document-highlights (#'handlers/document-highlight doc-id line column)))
(catch Exception e
(log/error e)))))))))

Expand Down Expand Up @@ -446,29 +444,17 @@
(CompletableFuture/completedFuture
(InitializeResult. (doto (ServerCapabilities.)
(.setDocumentHighlightProvider true)
#_
(.setHoverProvider true)
#_
(.setCallHierarchyProvider true)
#_
(.setCodeActionProvider true)
#_
(.setCodeLensProvider (CodeLensOptions. true))
#_
(.setReferencesProvider true)
#_
(.setRenameProvider true)
#_
(.setDefinitionProvider true)
#_
(.setDocumentFormattingProvider (:document-formatting? settings))
#_
(.setDocumentRangeFormattingProvider (:document-range-formatting? settings))
#_
(.setDocumentSymbolProvider true)
#_
(.setWorkspaceSymbolProvider true)
#_
(.setSemanticTokensProvider (when (or (not (contains? settings :semantic-tokens?))
(:semantic-tokens? settings))
(doto (SemanticTokensWithRegistrationOptions.)
Expand All @@ -477,14 +463,12 @@
semantic-tokens/token-modifiers)))
(.setRange true)
(.setFull true))))
#_
(.setExecuteCommandProvider (doto (ExecuteCommandOptions.)
(.setCommands f.refactor/available-refactors)))
(.setTextDocumentSync (doto (TextDocumentSyncOptions.)
(.setOpenClose true)
(.setChange TextDocumentSyncKind/Full)
(.setSave (SaveOptions. true))))
#_
(.setCompletionProvider (CompletionOptions. true []))))))))))

(^void initialized [^InitializedParams params]
Expand Down Expand Up @@ -515,63 +499,50 @@
b2 (byte-array buffer-size)
os (java.io.PipedOutputStream.)
is (java.io.PipedInputStream. os)]
(log/warn "hello")

(async/thread
(try
(let [
buffer (byte-array buffer-size)]

(log/warn "thread start")
(let [buffer (byte-array buffer-size)]
(loop [chs (.read system-in buffer 0 buffer-size)]
(when (pos? chs)
(log/warn "FROM STDIN" chs (String. (java.util.Arrays/copyOfRange buffer 0 chs)))
(.write os buffer 0 chs)
(recur (.read system-in buffer 0 buffer-size)))))
(catch Exception e
(log/error e "in thread"))))
is
is))

))
(defn tee-system-out [system-out]
(let [buffer-size 1024
b2 (byte-array buffer-size)
is (java.io.PipedInputStream. )
is (java.io.PipedInputStream.)
os (java.io.PipedOutputStream. is)]

(async/thread
(try
(let [
buffer (byte-array buffer-size)]

(let [buffer (byte-array buffer-size)]
(loop [chs (.read is buffer 0 buffer-size)]
(when (pos? chs)
(log/warn "FROM STDOUT" chs (String. (java.util.Arrays/copyOfRange buffer 0 chs)))
(.write system-out buffer)
(recur (.read is buffer 0 buffer-size)))))
(catch Exception e
(log/error e "in thread"))))
os

))
os))

(defn- run []
(log/info "Starting server...")
(let [is (tee-system-in System/in)
os (tee-system-out System/out)
(let [is (or System/in (tee-system-in System/in))
os (or System/out (tee-system-out System/out))
launcher (LSPLauncher/createServerLauncher server is os)
repl-server (nrepl.server/start-server)
port (:port repl-server)]
(log/info "====== LSP nrepl server started on port" port)
(swap! db/db assoc
:client ^LanguageClient (.getRemoteProxy launcher)
:port port)
#_
(async/go
(loop [edit (async/<! db/edits-chan)]
(log/info "edit applied?" (.get (.applyEdit (:client @db/db) (ApplyWorkspaceEditParams. (interop/conform-or-log ::interop/workspace-edit edit)))))
(recur (async/<! db/edits-chan))))
#_
(async/go
(loop [diagnostic (async/<! db/diagnostics-chan)]
(.publishDiagnostics (:client @db/db) (interop/conform-or-log ::interop/publish-diagnostics-params diagnostic))
Expand Down
12 changes: 7 additions & 5 deletions src/clojure_lsp/queries.clj
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,17 @@

(defn find-element-under-cursor
[analysis filename line column]
(find-first (fn [{:keys [name-row name-col name-end-row name-end-col] :as v}]
(and (<= name-row line name-end-row)
(<= name-col column name-end-col)))
(get analysis filename)))
(let [local-analysis (get analysis filename)]
(find-first (fn [{:keys [name-row name-col name-end-row name-end-col] :as v}]
(and (<= name-row line name-end-row)
(<= name-col column name-end-col)))
local-analysis)))


(defn find-definition-from-cursor [analysis filename line column]
(try
(let [{:keys [bucket] :as element} (find-element-under-cursor analysis filename line column)]
(when (log/spy element)
(when element
(find-definition analysis element)))
(catch Throwable e
(log/error e "can't find definition"))))
Expand Down
6 changes: 3 additions & 3 deletions src/clojure_lsp/shared.clj
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@
(defn uri->project-related-path [uri project-root]
(string/replace uri project-root ""))

(defn ->range [{:keys [name-row name-end-row name-col name-end-col]}]
{:start {:line (max 0 (dec name-row)) :character (max 0 (dec name-col))}
:end {:line (max 0 (dec name-end-row)) :character (max 0 (dec name-end-col))}})
(defn ->range [{:keys [name-row name-end-row name-col name-end-col row end-row col end-col]}]
{:start {:line (max 0 (dec (or name-row row))) :character (max 0 (dec (or name-col col)))}
:end {:line (max 0 (dec (or name-end-row end-row))) :character (max 0 (dec (or name-end-col end-col)))}})

(defn range->clj [^Range range]
{:start {:line (.getLine (.getStart range))
Expand Down

0 comments on commit eb96b3a

Please sign in to comment.