|
13 | 13 |
|
14 | 14 | (use judge)
|
15 | 15 |
|
16 |
| -(def version "0.0.7") |
| 16 | +(def version "0.0.9") |
17 | 17 | (def commit
|
18 | 18 | (with [proc (os/spawn ["git" "rev-parse" "--short" "HEAD"] :xp {:out :pipe})]
|
19 |
| - (let [[out] (ev/gather |
20 |
| - (ev/read (proc :out) :all) |
21 |
| - (os/proc-wait proc))] |
22 |
| - (if out (string/trimr out) "")))) |
| 19 | + (let [[out] (ev/gather |
| 20 | + (ev/read (proc :out) :all) |
| 21 | + (os/proc-wait proc))] |
| 22 | + (if out (string/trimr out) "")))) |
23 | 23 |
|
24 | 24 | (def jpm-defs (require "../libs/jpm-defs"))
|
25 | 25 |
|
|
34 | 34 | [diagnostics env]
|
35 | 35 | (eval/eval-buffer content
|
36 | 36 | (path/relpath
|
37 |
| - (os/cwd) |
38 |
| - (if (string/has-prefix? "file:" uri) |
39 |
| - (string/slice uri 5) uri)))] |
40 |
| - |
| 37 | + (os/cwd) |
| 38 | + (if (string/has-prefix? "file:" uri) |
| 39 | + (string/slice uri 5) uri)))] |
| 40 | + |
41 | 41 | (logging/info (string/format "`eval-buffer` returned: %m" diagnostics) [:evaluation])
|
42 | 42 |
|
43 | 43 | (each res diagnostics
|
|
77 | 77 | :semi :equals :question :at :lbracket
|
78 | 78 | :rbracket '1)))})
|
79 | 79 |
|
80 |
| -(test (peg/match uri-percent-encoding-peg "file:///c%3A/Users/pete/Desktop/code/libmpsse") |
81 |
| - @["file:///c:/Users/pete/Desktop/code/libmpsse"]) |
82 |
| - |
83 | 80 | (defn on-document-change
|
84 | 81 | ``
|
85 | 82 | Handler for the ["textDocument/didChange"](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_didChange) event.
|
|
89 | 86 | [state params]
|
90 | 87 | (let [content (get-in params ["contentChanges" 0 "text"])
|
91 | 88 | uri (first (peg/match uri-percent-encoding-peg
|
92 |
| - (get-in params ["textDocument" "uri"])))] |
| 89 | + (get-in params ["textDocument" "uri"])))] |
93 | 90 | (put-in state [:documents uri :content] content)
|
94 | 91 |
|
95 | 92 | (if (dyn :push-diagnostics)
|
|
104 | 101 |
|
105 | 102 | (defn on-document-diagnostic [state params]
|
106 | 103 | (let [uri (first (peg/match uri-percent-encoding-peg
|
107 |
| - (get-in params ["textDocument" "uri"]))) |
| 104 | + (get-in params ["textDocument" "uri"]))) |
108 | 105 | content (get-in state [:documents uri :content])
|
109 | 106 | [diagnostics env] (run-diagnostics uri content)
|
110 | 107 | message {:kind "full"
|
|
115 | 112 |
|
116 | 113 | (defn on-document-formatting [state params]
|
117 | 114 | (let [uri (first (peg/match uri-percent-encoding-peg
|
118 |
| - (get-in params ["textDocument" "uri"]))) |
| 115 | + (get-in params ["textDocument" "uri"]))) |
119 | 116 | content (get-in state [:documents uri :content])
|
120 | 117 | new-content (freeze (fmt/format (string/slice content)))]
|
121 | 118 | (logging/info (string/format "old content: %m" content) [:formatting] 2)
|
|
125 | 122 | (do
|
126 | 123 | (logging/info "No changes" [:formatting])
|
127 | 124 | [:ok state :json/null])
|
128 |
| - (do |
| 125 | + (do |
129 | 126 | (put-in state [:documents uri] @{:content new-content})
|
130 | 127 | (let [message [{:range {:start {:line 0 :character 0}
|
131 | 128 | :end {:line 1000000 :character 1000000}}
|
|
136 | 133 | (defn on-document-open [state params]
|
137 | 134 | (let [content (get-in params ["textDocument" "text"])
|
138 | 135 | uri (first (peg/match uri-percent-encoding-peg
|
139 |
| - (get-in params ["textDocument" "uri"]))) |
| 136 | + (get-in params ["textDocument" "uri"]))) |
140 | 137 | [diagnostics env] (run-diagnostics uri content)]
|
141 | 138 | (put-in state [:documents uri] @{:content content
|
142 | 139 | :eval-env env})
|
|
171 | 168 |
|
172 | 169 | (defn on-completion [state params]
|
173 | 170 | (let [uri (first (peg/match uri-percent-encoding-peg
|
174 |
| - (get-in params ["textDocument" "uri"]))) |
| 171 | + (get-in params ["textDocument" "uri"]))) |
175 | 172 | eval-env (get-in state [:documents uri :eval-env])
|
176 |
| - bindings (seq [bind :in (all-bindings eval-env)] |
| 173 | + bindings (seq [bind :in (all-bindings eval-env)] |
177 | 174 | (binding-to-lsp-item bind eval-env))
|
178 | 175 | message {:isIncomplete true
|
179 | 176 | :items bindings}]
|
|
185 | 182 | (def lbl (get params "label"))
|
186 | 183 | (def envs (seq [docu :in (state :documents)]
|
187 | 184 | (docu :eval-env)))
|
188 |
| - |
| 185 | + |
189 | 186 | (each env envs
|
190 | 187 | (when (env (symbol lbl))
|
191 | 188 | (set eval-env env)
|
192 | 189 | (break)))
|
193 |
| - |
| 190 | + |
194 | 191 | (let [message {:label lbl
|
195 | 192 | :documentation
|
196 | 193 | {:kind "markdown"
|
197 | 194 | :value (doc/my-doc*
|
198 |
| - (symbol lbl) |
199 |
| - (or eval-env (make-env root-env)))}}] |
| 195 | + (symbol lbl) |
| 196 | + (or eval-env (make-env root-env)))}}] |
200 | 197 | (logging/message message [:completion] 1)
|
201 | 198 | [:ok state message]))
|
202 | 199 |
|
203 | 200 | (defn on-document-hover [state params]
|
204 | 201 | (let [uri (first (peg/match uri-percent-encoding-peg
|
205 |
| - (get-in params ["textDocument" "uri"]))) |
| 202 | + (get-in params ["textDocument" "uri"]))) |
206 | 203 | content (get-in state [:documents uri :content])
|
207 | 204 | eval-env (get-in state [:documents uri :eval-env])
|
208 | 205 | {"line" line "character" character} (get params "position")
|
|
224 | 221 | (logging/info (string "on-signature-help params: ") [:signature])
|
225 | 222 | (logging/info (string/format "%q" params) [:signature])
|
226 | 223 | (let [uri (first (peg/match uri-percent-encoding-peg
|
227 |
| - (get-in params ["textDocument" "uri"]))) |
| 224 | + (get-in params ["textDocument" "uri"]))) |
228 | 225 | content (get-in state [:documents uri :content])
|
229 | 226 | eval-env (get-in state [:documents uri :eval-env])
|
230 | 227 | {"line" line "character" character} (get params "position")
|
231 | 228 | {:source sexp-text :range [start end]} (lookup/sexp-at {:line line :character character} content)
|
232 | 229 | function-symbol (or (first (peg/match '(* "(" (any :s) (<- (to " "))) sexp-text)) "none")
|
233 | 230 | signature (or (doc/get-signature (symbol function-symbol) eval-env) "not found")]
|
234 | 231 | (case signature
|
235 |
| - "not found" |
| 232 | + "not found" |
236 | 233 | (do (logging/info "No signature found" [:signature]) [:ok state :json/null])
|
237 |
| - (let [message {:signatures [{:label signature}]}] |
| 234 | + (let [message {:signatures [{:label signature}]}] |
238 | 235 | (logging/message message [:signature])
|
239 | 236 | [:ok state message]))))
|
240 | 237 |
|
|
292 | 289 | [state params]
|
293 | 290 | (let [message {:server-info {:name "janet-lsp"
|
294 | 291 | :version version
|
295 |
| - :commit commit}}] |
| 292 | + :commit commit}}] |
296 | 293 | (logging/message message [:info] 1)
|
297 | 294 | [:ok state message]))
|
298 | 295 |
|
|
302 | 299 | ``
|
303 | 300 | [state params]
|
304 | 301 | (let [request-uri (first (peg/match uri-percent-encoding-peg
|
305 |
| - (get-in params ["textDocument" "uri"]))) |
| 302 | + (get-in params ["textDocument" "uri"]))) |
306 | 303 | content (get-in state [:documents request-uri :content])
|
307 | 304 | eval-env (get-in state [:documents request-uri :eval-env])
|
308 | 305 | {"line" line "character" character} (get params "position")
|
|
318 | 315 | end is: %d
|
319 | 316 | -------------------------
|
320 | 317 | ``
|
321 |
| - request-uri (length content) line character define-word start end) [:definition] 2) |
| 318 | + request-uri (length content) line character define-word start end) [:definition] 2) |
322 | 319 | (logging/info (string/format "symbol is: %s" (symbol define-word)) [:definition] 2)
|
323 | 320 | (logging/info (string/format "eval-env is: %m" eval-env) [:definition] 3)
|
324 | 321 | (logging/info (string/format "symbol lookup is: %m" (get eval-env (symbol define-word) nil)) [:definition] 2)
|
|
330 | 327 | message {:uri filepath
|
331 | 328 | :range {:start {:line (max 0 (dec line)) :character col}
|
332 | 329 | :end {:line (max 0 (dec line)) :character col}}}]
|
333 |
| - (do |
334 |
| - (logging/message message [:definition]) |
335 |
| - [:ok state message]) |
336 |
| - (do |
337 |
| - (logging/info "Couldn't find definition" [:definition]) |
338 |
| - [:ok state :json/null])))) |
| 330 | + (do |
| 331 | + (logging/message message [:definition]) |
| 332 | + [:ok state message]) |
| 333 | + (do |
| 334 | + (logging/info "Couldn't find definition" [:definition]) |
| 335 | + [:ok state :json/null])))) |
339 | 336 |
|
340 | 337 | (defn on-set-trace [state params]
|
341 | 338 | (logging/info (string/format "on-set-trace: %m" params) [:settrace] 2)
|
|
345 | 342 | "verbose" nil)
|
346 | 343 | [:noresponse state])
|
347 | 344 |
|
| 345 | +(defn on-janet-tell-joke [state params] |
| 346 | + # (eprint "What's brown and sticky? A stick!") |
| 347 | + (let [message {:question "What's brown and sticky?" |
| 348 | + :answer "A stick!"}] |
| 349 | + (logging/message message [:joke]) |
| 350 | + [:ok state message])) |
| 351 | + |
348 | 352 | (defn handle-message [message state]
|
349 | 353 | (let [id (get message "id")
|
350 | 354 | method (get message "method")
|
|
365 | 369 | # "textDocument/documentSymbol" (on-document-symbols state params) TODO: Implement this? See src/lsp/api.ts:121
|
366 | 370 | "textDocument/definition" (on-document-definition state params)
|
367 | 371 | "janet/serverInfo" (on-janet-serverinfo state params)
|
| 372 | + "janet/tellJoke" (on-janet-tell-joke state params) |
368 | 373 | "shutdown" (on-shutdown state params)
|
369 | 374 | "exit" (on-exit state params)
|
370 | 375 | "$/setTrace" (on-set-trace state params)
|
371 |
| - (do |
| 376 | + (do |
372 | 377 | (logging/info (string/format "Received unrecognized RPC: %m" method) [:handle] 1)
|
373 | 378 | [:noresponse state]))))
|
374 | 379 |
|
|
395 | 400 | (logging/info (string/format "current state is: %m" state) [:priority] 3)
|
396 | 401 | (let [message (read-message)]
|
397 | 402 | (logging/info (string/format "got: %q" message) [:core] 3)
|
398 |
| - (match (handle-message message state) |
| 403 | + (match (try (handle-message message state) ([err fib] [:error state err fib])) |
399 | 404 | [:ok new-state & response] (do
|
400 | 405 | (write-response stdout (rpc/success-response (get message "id") ;response))
|
401 | 406 | (logging/info "successful rpc" [:core] (get message "id"))
|
402 | 407 | (message-loop :state new-state))
|
403 | 408 | [:noresponse new-state] (message-loop :state new-state)
|
404 | 409 |
|
405 |
| - [:error new-state err] (printf "unhandled error response: %m" err) |
| 410 | + [:error new-state err fib] (do |
| 411 | + (logging/err (string/format "%m" err) [:core]) |
| 412 | + (debug/stacktrace fib err "") |
| 413 | + (message-loop :state new-state)) |
406 | 414 | [:exit] (do (file/flush stdout) (ev/sleep 0.1) (os/exit 0)))))
|
407 | 415 |
|
408 | 416 | (defn find-all-module-files [path &opt search-jpm-tree explicit results]
|
|
472 | 480 | (when (or (has-value? parsed-args "--version")
|
473 | 481 | (has-value? parsed-args "-v"))
|
474 | 482 | (print "Janet LSP v" version "-" commit)
|
475 |
| - (os/exit 0)) |
476 |
| - |
| 483 | + (os/exit 0)) |
| 484 | + |
477 | 485 | (cmd/run
|
478 | 486 | (cmd/fn
|
479 | 487 | "A Language Server (LSP) for the Janet Programming Language."
|
|
0 commit comments