|
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