Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 24 additions & 14 deletions routes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import
json_serialization,
std/[strscans, times, json, parseutils, strutils],
ls,
regex,
stew/[byteutils],
nimexpand,
testrunner
Expand Down Expand Up @@ -366,15 +367,24 @@ proc scheduleFileCheck(ls: LanguageServer, uri: string) {.gcsafe, raises: [].} =
# except Exception:
# discard

proc toMarkedStrings(suggest: Suggest): seq[MarkedStringOption] =
var label = suggest.qualifiedPath.join(".")
if suggest.forth != "":
label &= ": " & suggest.forth

result = @[MarkedStringOption %* {"language": "nim", "value": label}]

if suggest.doc != "":
result.add MarkedStringOption %* {"language": "markdown", "value": suggest.doc}
proc toMdLinks(s: string): string =
result = s
let matches = s.findAll(re2"`([^`<]*?)<([^`>]*?)>`_")
for i in countDown(matches.high, matches.low):
let match = matches[i]
result[match.boundaries] = fmt"[{s[match.captures[0]]}]({s[match.captures[1]]})"

proc toMarkupContent(suggest: Suggest): MarkupContent =
result = MarkupContent(kind: "markdown", value: "```nim\n")
result.value.add suggest.qualifiedPath.join(".")
if suggest.forth.len != 0:
result.value.add ": "
result.value.add suggest.forth
result.value.add "\n```"

if suggest.doc.len != 0:
result.value.add "\n\n---\n"
result.value.add toMdLinks(suggest.doc)

proc hover*(
ls: LanguageServer, params: HoverParams, id: int
Expand All @@ -394,34 +404,34 @@ proc hover*(
return none(Hover)
var suggest = suggestions[0]
if suggest.symkind == "skModule": # NOTE: skMoudle always return position (1, 0)
return some(Hover(contents: some(%toMarkedStrings(suggest))))
return some(Hover(contents: some(%toMarkupContent(suggest))))
else:
for s in suggestions:
if s.line == line + 1:
if s.column <= ch.get:
suggest = s
else:
break
var content = toMarkedStrings(suggest)
var content = toMarkupContent(suggest)
if suggest.symkind == "skMacro" and config.nimExpandMacro.get(NIM_EXPAND_MACRO_BY_DEFAULT):
let expanded = await nimsuggest.get
.expand(uriToPath(uri), ls.uriToStash(uri), suggest.line, suggest.column)
if expanded.len > 0 and expanded[0].doc != "":
# debug "Expanded macro", expanded = expanded[0].doc
content.add MarkedStringOption %* {"language": "nim", "value": expanded[0].doc}
content.value.add &"```nim\n{expanded[0].doc}\n```"
else:
# debug "Couldnt expand the macro. Trying with nim expand", suggest = suggest[]
let nimPath = config.getNimPath()
if nimPath.isSome:
let expanded = await nimExpandMacro(nimPath.get, suggest, uriToPath(uri))
content.add MarkedStringOption %* {"language": "nim", "value": expanded}
content.value.add &"```nim\n{expanded}\n```"
if suggest.section == ideDef and suggest.symkind in ["skProc"] and config.nimExpandArc.get(NIM_EXPAND_ARC_BY_DEFAULT):
debug "#Expanding arc", suggest = suggest[]
let nimPath = config.getNimPath()
if nimPath.isSome:
let expanded = await nimExpandArc(nimPath.get, suggest, uriToPath(uri))
let arcContent = "#Expanded arc \n" & expanded
content.add MarkedStringOption %* {"language": "nim", "value": arcContent}
content.value.add &"```nim\n{arcContent}\n```"
return some(Hover(
contents: some(%content),
range: some(toLabelRange(suggest.toUtf16Pos(ls))),
Expand Down
8 changes: 4 additions & 4 deletions tests/tnimlangserver.nim
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,10 @@ suite "LSP features":
hoverParams = positionParams(helloWorldUri, 1, 6)
hover = client.call("textDocument/hover", %hoverParams).waitFor
expected = %*{
"contents": [{
"language": "nim",
"value": "hw.a안녕: proc (){.noSideEffect, gcsafe, raises: <inferred> [].}"
}],
"contents": {
"kind": "markdown",
"value": "```nim\nhw.a안녕: proc (){.noSideEffect, gcsafe, raises: <inferred> [].}\n```"
},
"range": {
"start": {
"line": 1,
Expand Down