Skip to content

Improve hover docs #332

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
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
Loading