diff --git a/src/nimlsp.nim b/src/nimlsp.nim index 0442cd4..21799c3 100644 --- a/src/nimlsp.nim +++ b/src/nimlsp.nim @@ -2,7 +2,7 @@ import std/[algorithm, asyncdispatch, asyncfile, hashes, os, osproc, sets, streams, strformat, strutils, tables, uri] import asynctools/asyncproc import nimlsppkg/[baseprotocol, logger, suggestlib, utfmapping] -include nimlsppkg/[messages, messageenums] +include nimlsppkg/[messages, messageenums, capabilities] const @@ -125,6 +125,28 @@ proc parseId(node: JsonNode): int = else: raise newException(MalformedFrame, "Invalid id node: " & repr(node)) +func newTokenRange(x: Suggest): Range = + ## Creates a [Range] that spans the length of the token + result = Range.create( + Position.create(x.line - 1, x.column), + Position.create(x.line - 1, x.column + x.tokenLen) + ) + +func newDocumentSymbol(sug: Suggest, children: seq[Suggest]): DocumentSymbol = + ## Creates a [DocumentSymbol] from a suggestion + let childSymbols = children.mapIt(newDocumentSymbol(it, @[])) + result = DocumentSymbol.create( + sug.name[], + none(string), + nimSymToLSPKind(sug.symKind).int, + none(seq[int]), + newTokenRange(sug), + # TODO: Make selectionRange use endCol/endLine. + # This requires support for v3 + newTokenRange(sug), + if children.len > 0: some(childSymbols) else: none(seq[DocumentSymbol]) + ) + proc respond(outs: Stream | AsyncFile, request: RequestMessage, data: JsonNode) {.multisync.} = let resp = create(ResponseMessage, "2.0", parseId(request["id"]), some(data), none(ResponseError)).JsonNode await outs.sendJson resp @@ -222,6 +244,7 @@ proc main(ins: Stream | AsyncFile, outs: Stream | AsyncFile) {.multisync.} = await checkVersion(outs) else: checkVersion(outs) + var capabilities: ClientCapabilities while true: try: debugLog "Trying to read frame" @@ -242,6 +265,7 @@ proc main(ins: Stream | AsyncFile, outs: Stream | AsyncFile) {.multisync.} = of "initialize": debugLog "Got initialize request, answering" initialized = true + capabilities = ClientCapabilities(message["params"].get()["capabilities"]) let resp = create(InitializeResult, create(ServerCapabilities, textDocumentSync = some(create(TextDocumentSyncOptions, openClose = some(true), @@ -449,10 +473,11 @@ proc main(ins: Stream | AsyncFile, outs: Stream | AsyncFile) {.multisync.} = await outs.respond(message, resp) of "textDocument/documentSymbol": message.textDocumentRequest(DocumentSymbolParams, symbolRequest): - debugLog "Running equivalent of: outline ", uriToPath(fileuri), + let filePath = uriToPath(fileuri) + debugLog "Running equivalent of: outline ", filePath, ";", filestash let syms = getNimsuggest(fileuri).outline( - uriToPath(fileuri), + filePath, dirtyfile = filestash ) debugLog "Found outlines: ", syms[0..