diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2017-03-08 00:38:48 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2017-03-08 00:38:48 +0100 |
commit | 91a4b448fdfb1a28e5bd1f1d5785e0308fedcb1a (patch) | |
tree | 9d34b447df1bf08f7207a82c5f4fdc65a619c006 /tools/nimsuggest/nimsuggest.nim | |
parent | 538c6c98985399314a845617e566313b70ac71e4 (diff) | |
download | Nim-91a4b448fdfb1a28e5bd1f1d5785e0308fedcb1a.tar.gz |
nimsuggest: chk checks the full project lazily; much better suggestions orderings
Diffstat (limited to 'tools/nimsuggest/nimsuggest.nim')
-rw-r--r-- | tools/nimsuggest/nimsuggest.nim | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/tools/nimsuggest/nimsuggest.nim b/tools/nimsuggest/nimsuggest.nim index 628f2bc4c..1798ac4e9 100644 --- a/tools/nimsuggest/nimsuggest.nim +++ b/tools/nimsuggest/nimsuggest.nim @@ -17,7 +17,7 @@ import compiler / [options, commands, modules, sem, passes, passaux, msgs, nimconf, extccomp, condsyms, sigmatch, ast, scriptconfig, - idents, modulegraphs, vm] + idents, modulegraphs, vm, prefixmatches] when defined(windows): import winlean @@ -51,6 +51,11 @@ are supported. """ type Mode = enum mstdin, mtcp, mepc, mcmdline + CachedMsg = object + info: TLineInfo + msg: string + sev: Severity + CachedMsgs = seq[CachedMsg] var gPort = 6000.Port @@ -93,7 +98,7 @@ proc parseQuoted(cmd: string; outp: var string; start: int): int = i += parseUntil(cmd, outp, seps, i) result = i -proc sexp(s: IdeCmd|TSymKind): SexpNode = sexp($s) +proc sexp(s: IdeCmd|TSymKind|PrefixMatch): SexpNode = sexp($s) proc sexp(s: Suggest): SexpNode = # If you change the order here, make sure to change it over in @@ -110,6 +115,8 @@ proc sexp(s: Suggest): SexpNode = s.doc, s.quality ]) + if s.section == ideSug: + result.add convertSexp(s.prefix) proc sexp(s: seq[Suggest]): SexpNode = result = newSList() @@ -363,7 +370,7 @@ proc replEpc(x: ThreadParams) {.thread.} = "unexpected call: " & epcAPI quit errMessage -proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache) = +proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache; cachedMsgs: CachedMsgs) = template sentinel() = # send sentinel for the input reading thread: results.send(Suggest(section: ideNone)) @@ -415,17 +422,19 @@ proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache) = if gIdeCmd == ideKnown: results.send(Suggest(section: ideKnown, quality: ord(fileInfoKnown(orig)))) else: + if gIdeCmd == ideChk: + for cm in cachedMsgs: errorHook(cm.info, cm.msg, cm.sev) execute(gIdeCmd, orig, dirtyfile, line, col-1, graph, cache) sentinel() proc recompileFullProject(graph: ModuleGraph; cache: IdentCache) = - echo "recompiling full project" + #echo "recompiling full project" resetSystemArtifacts() vm.globalCtx = nil graph.resetAllModules() GC_fullcollect() compileProject(graph, cache) - echo GC_getStatistics() + #echo GC_getStatistics() proc mainThread(graph: ModuleGraph; cache: IdentCache) = if gLogging: @@ -442,12 +451,13 @@ proc mainThread(graph: ModuleGraph; cache: IdentCache) = suggestionResultHook = sugResultHook graph.doStopCompile = proc (): bool = requests.peek() > 0 var idle = 0 + var cachedMsgs: CachedMsgs = @[] while true: let (hasData, req) = requests.tryRecv() if hasData: msgs.writelnHook = wrHook suggestionResultHook = sugResultHook - execCmd(req, graph, cache) + execCmd(req, graph, cache, cachedMsgs) idle = 0 else: os.sleep 250 @@ -456,7 +466,9 @@ proc mainThread(graph: ModuleGraph; cache: IdentCache) = # we use some nimsuggest activity to enable a lazy recompile: gIdeCmd = ideChk msgs.writelnHook = proc (s: string) = discard - msgs.structuredErrorHook = nil + cachedMsgs.setLen 0 + msgs.structuredErrorHook = proc (info: TLineInfo; msg: string; sev: Severity) = + cachedMsgs.add(CachedMsg(info: info, msg: msg, sev: sev)) suggestionResultHook = proc (s: Suggest) = discard recompileFullProject(graph, cache) @@ -525,8 +537,13 @@ proc processCmdLine*(pass: TCmdLinePass, cmd: string) = suggestVersion = 2 gMode = mstdin gEmitEof = true + gRefresh = false of "log": gLogging = true - of "refresh": gRefresh = true + of "refresh": + if p.val.len > 0: + gRefresh = parseBool(p.val) + else: + gRefresh = true else: processSwitch(pass, p) of cmdArgument: options.gProjectName = unixToNativePath(p.key) |