|
13 | 13 |
|
14 | 14 | (use judge)
|
15 | 15 |
|
16 |
| -(def version "0.0.5") |
| 16 | +(def version "0.0.6") |
17 | 17 |
|
18 | 18 | (def jpm-defs (require "../libs/jpm-defs"))
|
19 | 19 |
|
|
147 | 147 | that this server provides so the client knows what it can request.
|
148 | 148 | ``
|
149 | 149 | [state params]
|
150 |
| - (logging/log (string/format "on-initialize called with these params: %m" params)) |
| 150 | + (comment (logging/log (string/format "on-initialize called with these params: %m" params))) |
151 | 151 |
|
152 | 152 | (if-let [diagnostic? (get-in params ["capabilities" "textDocument" "diagnostic"])]
|
153 | 153 | (setdyn :push-diagnostics false)
|
|
161 | 161 | :workspaceDiagnostics false}
|
162 | 162 | :hoverProvider true
|
163 | 163 | :signatureHelpProvider {:triggerCharacters [" "]}
|
164 |
| - :documentFormattingProvider true} |
| 164 | + :documentFormattingProvider true |
| 165 | + # :definitionProvider true |
| 166 | + } |
165 | 167 | :serverInfo {:name "janet-lsp"
|
166 | 168 | :version version}}])
|
167 | 169 |
|
|
190 | 192 | [state params]
|
191 | 193 | [:ok state :json/null])
|
192 | 194 |
|
| 195 | +# (defn on-document-definition |
| 196 | +# `` |
| 197 | +# Called by the LSP client to request the location of a symbol's definition. |
| 198 | +# `` |
| 199 | +# [state params] |
| 200 | +# (let [uri (get-in params ["textDocument" "uri"]) |
| 201 | +# content (get-in state [:documents uri :content]) |
| 202 | +# {"line" line "character" character} (get params "position") |
| 203 | +# {:word define-word :range [start end]} (lookup/word-at {:line line :character character} content)] |
| 204 | +# (if-let [[uri line col] ((dyn (symbol define-word) :source-map))] |
| 205 | +# [:ok state {:uri uri |
| 206 | +# :range {:start {:line (max 0 (dec line)) :character col} |
| 207 | +# :end {:line (max 0 (dec line)) :character col}}}] |
| 208 | +# [:ok state :json/null]))) |
| 209 | + |
193 | 210 | (defn handle-message [message state]
|
194 | 211 | (let [id (get message "id")
|
195 | 212 | method (get message "method")
|
|
208 | 225 | "textDocument/signatureHelp" (on-document-signature-help state params)
|
209 | 226 | # "textDocument/references" (on-document-references state params) TODO: Implement this? See src/lsp/api.ts:103
|
210 | 227 | # "textDocument/documentSymbol" (on-document-symbols state params) TODO: Implement this? See src/lsp/api.ts:121
|
| 228 | + # "textDocument/definition" (on-document-definition state params) |
211 | 229 | "janet/serverInfo" (on-janet-serverinfo state params)
|
212 | 230 | "shutdown" (on-shutdown state params)
|
213 | 231 | "exit" (on-exit state params)
|
214 | 232 | [:noresponse state])))
|
215 | 233 |
|
216 |
| -(def line-ending "\r\n\r\n") |
217 |
| -(def read-offset |
218 |
| - (case (os/which) |
219 |
| - :windows 1 |
220 |
| - 2)) |
221 |
| - |
222 | 234 | (defn write-response [file response]
|
223 | 235 | # Write headers
|
224 |
| - (file/write file (string "Content-Length: " (length response) line-ending)) |
| 236 | + (file/write file (string "Content-Length: " (length response) (case (os/which) |
| 237 | + :windows "\n\n" "\r\n\r\n"))) |
225 | 238 |
|
226 | 239 | # Write response
|
227 | 240 | (file/write file response)
|
228 | 241 |
|
229 | 242 | # Flush response
|
230 |
| - (file/flush file)) |
| 243 | + (file/flush file)) |
231 | 244 |
|
232 | 245 | (defn read-message []
|
233 |
| - (let [input (file/read stdin :line) |
234 |
| - content-length (+ (parse-content-length input) read-offset) |
235 |
| - input (file/read stdin content-length)] |
| 246 | + (let [content-length-line (file/read stdin :line) |
| 247 | + _ (file/read stdin :line) |
| 248 | + input (file/read stdin (parse-content-length content-length-line))] |
236 | 249 | (json/decode input)))
|
237 | 250 |
|
238 | 251 | (defn message-loop [&named state]
|
| 252 | + (logging/log "Loop enter") |
239 | 253 | (let [message (read-message)]
|
240 | 254 | (logging/log (string/format "got: %q" message))
|
241 | 255 | (match (handle-message message state)
|
242 | 256 | [:ok new-state & response] (do
|
243 |
| - (logging/log "successful rpc") |
244 |
| - (write-response stdout (rpc/success-response (get message "id") ;response)) |
245 |
| - (message-loop :state new-state)) |
| 257 | + (logging/log "successful rpc") |
| 258 | + (write-response stdout (rpc/success-response (get message "id") ;response)) |
| 259 | + (message-loop :state new-state)) |
246 | 260 | [:noresponse new-state] (message-loop :state new-state)
|
247 | 261 |
|
248 | 262 | [:error new-state err] (printf "unhandled error response: %m" err)
|
|
280 | 294 |
|
281 | 295 | (defn start-language-server []
|
282 | 296 | (print "Starting LSP")
|
283 |
| - (when (dyn :debug) (spit "janetlsp.log.txt" "")) |
| 297 | + (when (dyn :debug) |
| 298 | + (try (spit "janetlsp.log.txt" "") |
| 299 | + ([_] (logging/log "Tried to write to janetlsp.log txt, but couldn't")))) |
284 | 300 |
|
285 | 301 | (merge-module root-env jpm-defs nil true)
|
286 | 302 | (setdyn :eval-env (make-env root-env))
|
|
0 commit comments