diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-05-13 09:53:00 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-05-13 09:53:00 +0200 |
commit | e4c088721a969ffafe621fecd8bb28dfa2fe9d18 (patch) | |
tree | 3f684977214fafe69eef5e0dfad84f2fa567241a | |
parent | dc4aa47c29bbcc7453244a11bcdb09e2eb62f1f5 (diff) | |
download | Nim-e4c088721a969ffafe621fecd8bb28dfa2fe9d18.tar.gz |
make nimsuggest compile again
-rw-r--r-- | compiler/importer.nim | 2 | ||||
-rw-r--r-- | compiler/lexer.nim | 10 | ||||
-rw-r--r-- | compiler/semexprs.nim | 2 | ||||
-rw-r--r-- | compiler/semstmts.nim | 6 | ||||
-rw-r--r-- | compiler/semtypes.nim | 2 | ||||
-rw-r--r-- | compiler/suggest.nim | 18 | ||||
-rw-r--r-- | nimsuggest/nimsuggest.nim | 146 |
7 files changed, 97 insertions, 89 deletions
diff --git a/compiler/importer.nim b/compiler/importer.nim index 05beb1d98..4e3aa8d10 100644 --- a/compiler/importer.nim +++ b/compiler/importer.nim @@ -152,7 +152,7 @@ proc myImportModule(c: PContext, n: PNode): PSym = message(c.config, n.info, warnDeprecated, result.constraint.strVal & "; " & result.name.s) else: message(c.config, n.info, warnDeprecated, result.name.s) - suggestSym(n.info, result, c.graph.usageSym, false) + suggestSym(c.config, n.info, result, c.graph.usageSym, false) proc impMod(c: PContext; it: PNode) = let m = myImportModule(c, it) diff --git a/compiler/lexer.nim b/compiler/lexer.nim index 7c89ee4a7..d01b8c4be 100644 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -274,7 +274,7 @@ template tokenEnd(tok, pos) {.dirty.} = when defined(nimsuggest): let colB = getColNumber(L, pos)+1 if L.fileIdx == gTrackPos.fileIndex and gTrackPos.col in colA..colB and - L.lineNumber == gTrackPos.line.int and gIdeCmd in {ideSug, ideCon}: + L.lineNumber == gTrackPos.line.int and L.config.ideCmd in {ideSug, ideCon}: L.cursor = CursorPosition.InToken gTrackPos.col = colA.int16 colA = 0 @@ -285,7 +285,7 @@ template tokenEndIgnore(tok, pos) = when defined(nimsuggest): let colB = getColNumber(L, pos) if L.fileIdx == gTrackPos.fileIndex and gTrackPos.col in colA..colB and - L.lineNumber == gTrackPos.line.int and gIdeCmd in {ideSug, ideCon}: + L.lineNumber == gTrackPos.line.int and L.config.ideCmd in {ideSug, ideCon}: gTrackPos.fileIndex = trackPosInvalidFileIdx gTrackPos.line = 0'u16 colA = 0 @@ -299,7 +299,7 @@ template tokenEndPrevious(tok, pos) = # the cursor in a string literal or comment: let colB = getColNumber(L, pos) if L.fileIdx == gTrackPos.fileIndex and gTrackPos.col in colA..colB and - L.lineNumber == gTrackPos.line.int and gIdeCmd in {ideSug, ideCon}: + L.lineNumber == gTrackPos.line.int and L.config.ideCmd in {ideSug, ideCon}: L.cursor = CursorPosition.BeforeToken gTrackPos = L.previousToken gTrackPosAttached = true @@ -1122,7 +1122,7 @@ proc rawGetTok*(L: var TLexer, tok: var TToken) = tok.tokType = tkParLe when defined(nimsuggest): if L.fileIdx == gTrackPos.fileIndex and tok.col < gTrackPos.col and - tok.line == gTrackPos.line.int and gIdeCmd == ideCon: + tok.line == gTrackPos.line.int and L.config.ideCmd == ideCon: gTrackPos.col = tok.col.int16 of ')': tok.tokType = tkParRi @@ -1143,7 +1143,7 @@ proc rawGetTok*(L: var TLexer, tok: var TToken) = of '.': when defined(nimsuggest): if L.fileIdx == gTrackPos.fileIndex and tok.col+1 == gTrackPos.col and - tok.line == gTrackPos.line.int and gIdeCmd == ideSug: + tok.line == gTrackPos.line.int and L.config.ideCmd == ideSug: tok.tokType = tkDot L.cursor = CursorPosition.InToken gTrackPos.col = tok.col.int16 diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 5b5c7f80c..5fe7a7a69 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -2154,7 +2154,7 @@ proc semBlock(c: PContext, n: PNode): PNode = if sfGenSym notin labl.flags: addDecl(c, labl) n.sons[0] = newSymNode(labl, n.sons[0].info) - suggestSym(n.sons[0].info, labl, c.graph.usageSym) + suggestSym(c.config, n.sons[0].info, labl, c.graph.usageSym) styleCheckDef(labl) n.sons[1] = semExpr(c, n.sons[1]) n.typ = n.sons[1].typ diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 0df3ee1c4..0a51ccee4 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -62,7 +62,7 @@ proc semBreakOrContinue(c: PContext, n: PNode): PNode = x.info = n.info incl(s.flags, sfUsed) n.sons[0] = x - suggestSym(x.info, s, c.graph.usageSym) + suggestSym(c.config, x.info, s, c.graph.usageSym) styleCheckUse(x.info, s) else: localError(c.config, n.info, errInvalidControlFlowX % s.name.s) @@ -203,7 +203,7 @@ proc semCase(c: PContext, n: PNode): PNode = for i in countup(1, sonsLen(n) - 1): var x = n.sons[i] when defined(nimsuggest): - if gIdeCmd == ideSug and exactEquals(gTrackPos, x.info) and caseTyp.kind == tyEnum: + if c.config.ideCmd == ideSug and exactEquals(gTrackPos, x.info) and caseTyp.kind == tyEnum: suggestEnum(c, x, caseTyp) case x.kind of nkOfBranch: @@ -365,7 +365,7 @@ proc semIdentDef(c: PContext, n: PNode, kind: TSymKind): PSym = result = semIdentWithPragma(c, kind, n, {}) if result.owner.kind == skModule: incl(result.flags, sfGlobal) - suggestSym(n.info, result, c.graph.usageSym) + suggestSym(c.config, n.info, result, c.graph.usageSym) styleCheckDef(result) proc checkNilable(c: PContext; v: PSym) = diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index f6d23403e..f44d93f20 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -672,7 +672,7 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int, else: rectype.sym for i in countup(0, sonsLen(n)-3): var f = semIdentWithPragma(c, skField, n.sons[i], {sfExported}) - suggestSym(n.sons[i].info, f, c.graph.usageSym) + suggestSym(c.config, n.sons[i].info, f, c.graph.usageSym) f.typ = typ f.position = pos if fieldOwner != nil and diff --git a/compiler/suggest.nim b/compiler/suggest.nim index 82b6038a4..ba70de1f7 100644 --- a/compiler/suggest.nim +++ b/compiler/suggest.nim @@ -342,12 +342,12 @@ proc suggestFieldAccess(c: PContext, n, field: PNode, outputs: var Suggestions) when defined(nimsuggest): if n.kind == nkSym and n.sym.kind == skError and suggestVersion == 0: # consider 'foo.|' where 'foo' is some not imported module. - let fullPath = findModule(n.sym.name.s, n.info.toFullPath) + let fullPath = findModule(c.config, n.sym.name.s, n.info.toFullPath) if fullPath.len == 0: # error: no known module name: typ = nil else: - let m = gImportModule(c.graph, c.module, fullpath.fileInfoIdx, c.cache) + let m = gImportModule(c.graph, c.module, fileInfoIdx(c.config, fullpath), c.cache) if m == nil: typ = nil else: for it in items(n.sym.tab): @@ -457,7 +457,7 @@ proc ensureIdx[T](x: var T, y: int) = proc ensureSeq[T](x: var seq[T]) = if x == nil: newSeq(x, 0) -proc suggestSym*(info: TLineInfo; s: PSym; usageSym: var PSym; isDecl=true) {.inline.} = +proc suggestSym*(conf: ConfigRef; info: TLineInfo; s: PSym; usageSym: var PSym; isDecl=true) {.inline.} = ## misnamed: should be 'symDeclared' when defined(nimsuggest): if suggestVersion == 0: @@ -466,17 +466,17 @@ proc suggestSym*(info: TLineInfo; s: PSym; usageSym: var PSym; isDecl=true) {.in else: s.addNoDup(info) - if gIdeCmd == ideUse: + if conf.ideCmd == ideUse: findUsages(info, s, usageSym) - elif gIdeCmd == ideDef: + elif conf.ideCmd == ideDef: findDefinition(info, s) - elif gIdeCmd == ideDus and s != nil: + elif conf.ideCmd == ideDus and s != nil: if isTracked(info, s.name.s.len): suggestResult(symToSuggest(s, isLocal=false, ideDef, info, 100, PrefixMatch.None, false, 0)) findUsages(info, s, usageSym) - elif gIdeCmd == ideHighlight and info.fileIndex == gTrackPos.fileIndex: + elif conf.ideCmd == ideHighlight and info.fileIndex == gTrackPos.fileIndex: suggestResult(symToSuggest(s, isLocal=false, ideHighlight, info, 100, PrefixMatch.None, false, 0)) - elif gIdeCmd == ideOutline and info.fileIndex == gTrackPos.fileIndex and + elif conf.ideCmd == ideOutline and info.fileIndex == gTrackPos.fileIndex and isDecl: suggestResult(symToSuggest(s, isLocal=false, ideOutline, info, 100, PrefixMatch.None, false, 0)) @@ -499,7 +499,7 @@ proc markUsed(conf: ConfigRef; info: TLineInfo; s: PSym; usageSym: var PSym) = if sfDeprecated in s.flags: warnAboutDeprecated(conf, info, s) if sfError in s.flags: localError(conf, info, "usage of '$1' is a user-defined error" % s.name.s) when defined(nimsuggest): - suggestSym(info, s, usageSym, false) + suggestSym(conf, info, s, usageSym, false) proc useSym*(conf: ConfigRef; sym: PSym; usageSym: var PSym): PNode = result = newSymNode(sym) diff --git a/nimsuggest/nimsuggest.nim b/nimsuggest/nimsuggest.nim index b2764e9ee..bbb751ba6 100644 --- a/nimsuggest/nimsuggest.nim +++ b/nimsuggest/nimsuggest.nim @@ -158,9 +158,10 @@ proc symFromInfo(graph: ModuleGraph; gTrackPos: TLineInfo): PSym = proc execute(cmd: IdeCmd, file, dirtyfile: string, line, col: int; graph: ModuleGraph; cache: IdentCache) = + let conf = graph.config myLog("cmd: " & $cmd & ", file: " & file & ", dirtyFile: " & dirtyfile & "[" & $line & ":" & $col & "]") - gIdeCmd = cmd + conf.ideCmd = cmd if cmd == ideChk: msgs.structuredErrorHook = errorHook msgs.writelnHook = myLog @@ -170,33 +171,33 @@ proc execute(cmd: IdeCmd, file, dirtyfile: string, line, col: int; if cmd == ideUse and suggestVersion != 0: graph.resetAllModules() var isKnownFile = true - let dirtyIdx = file.fileInfoIdx(isKnownFile) + let dirtyIdx = fileInfoIdx(conf, file, isKnownFile) if dirtyfile.len != 0: msgs.setDirtyFile(dirtyIdx, dirtyfile) else: msgs.setDirtyFile(dirtyIdx, nil) gTrackPos = newLineInfo(dirtyIdx, line, col) gTrackPosAttached = false - gErrorCounter = 0 + conf.errorCounter = 0 if suggestVersion == 1: graph.usageSym = nil if not isKnownFile: graph.compileProject(cache) - if suggestVersion == 0 and gIdeCmd in {ideUse, ideDus} and + if suggestVersion == 0 and conf.ideCmd in {ideUse, ideDus} and dirtyfile.len == 0: discard "no need to recompile anything" else: let modIdx = graph.parentModule(dirtyIdx) graph.markDirty dirtyIdx graph.markClientsDirty dirtyIdx - if gIdeCmd != ideMod: + if conf.ideCmd != ideMod: graph.compileProject(cache, modIdx) - if gIdeCmd in {ideUse, ideDus}: + if conf.ideCmd in {ideUse, ideDus}: let u = if suggestVersion != 1: graph.symFromInfo(gTrackPos) else: graph.usageSym if u != nil: listUsages(u) else: - localError(gTrackPos, "found no symbol at this position " & $gTrackPos) + localError(conf, gTrackPos, "found no symbol at this position " & $gTrackPos) proc executeEpc(cmd: IdeCmd, args: SexpNode; graph: ModuleGraph; cache: IdentCache) = @@ -257,7 +258,7 @@ proc toEpc(client: Socket; uid: BiggestInt) {.gcsafe.} = template setVerbosity(level: typed) = gVerbosity = level - gNotes = NotesVerbosity[gVerbosity] + conf.notes = NotesVerbosity[gVerbosity] proc connectToNextFreePort(server: Socket, host: string): Port = server.bindaddr(Port(0), host) @@ -349,16 +350,18 @@ proc replEpc(x: ThreadParams) {.thread.} = of "call": let uid = message[1].getNum + cmd = message[2].getSymbol args = message[3] - gIdeCmd = parseIdeCmd(message[2].getSymbol) - case gIdeCmd - of ideSug, ideCon, ideDef, ideUse, ideDus, ideOutline, ideHighlight: - setVerbosity(0) - else: discard - let cmd = $gIdeCmd & " " & args.argsToStr - myLog "MSG CMD: " & cmd - requests.send(cmd) + when false: + x.ideCmd[] = parseIdeCmd(message[2].getSymbol) + case x.ideCmd[] + of ideSug, ideCon, ideDef, ideUse, ideDus, ideOutline, ideHighlight: + setVerbosity(0) + else: discard + let fullCmd = cmd & " " & args.argsToStr + myLog "MSG CMD: " & fullCmd + requests.send(fullCmd) toEpc(client, uid) of "methods": returnEpc(client, message[1].getNum, listEpc()) @@ -375,6 +378,8 @@ proc replEpc(x: ThreadParams) {.thread.} = quit errMessage proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache; cachedMsgs: CachedMsgs) = + let conf = graph.config + template sentinel() = # send sentinel for the input reading thread: results.send(Suggest(section: ideNone)) @@ -395,21 +400,21 @@ proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache; cachedMsgs: Cac var opc = "" var i = parseIdent(cmd, opc, 0) case opc.normalize - of "sug": gIdeCmd = ideSug - of "con": gIdeCmd = ideCon - of "def": gIdeCmd = ideDef - of "use": gIdeCmd = ideUse - of "dus": gIdeCmd = ideDus - of "mod": gIdeCmd = ideMod - of "chk": gIdeCmd = ideChk - of "highlight": gIdeCmd = ideHighlight - of "outline": gIdeCmd = ideOutline + of "sug": conf.ideCmd = ideSug + of "con": conf.ideCmd = ideCon + of "def": conf.ideCmd = ideDef + of "use": conf.ideCmd = ideUse + of "dus": conf.ideCmd = ideDus + of "mod": conf.ideCmd = ideMod + of "chk": conf.ideCmd = ideChk + of "highlight": conf.ideCmd = ideHighlight + of "outline": conf.ideCmd = ideOutline of "quit": sentinel() quit() of "debug": toggle optIdeDebug of "terse": toggle optIdeTerse - of "known": gIdeCmd = ideKnown + of "known": conf.ideCmd = ideKnown else: err() var dirtyfile = "" var orig = "" @@ -423,17 +428,17 @@ proc execCmd(cmd: string; graph: ModuleGraph; cache: IdentCache; cachedMsgs: Cac i += skipWhile(cmd, seps, i) i += parseInt(cmd, col, i) - if gIdeCmd == ideKnown: - results.send(Suggest(section: ideKnown, quality: ord(fileInfoKnown(orig)))) + if conf.ideCmd == ideKnown: + results.send(Suggest(section: ideKnown, quality: ord(fileInfoKnown(conf, orig)))) else: - if gIdeCmd == ideChk: + if conf.ideCmd == ideChk: for cm in cachedMsgs: errorHook(cm.info, cm.msg, cm.sev) - execute(gIdeCmd, orig, dirtyfile, line, col, graph, cache) + execute(conf.ideCmd, orig, dirtyfile, line, col, graph, cache) sentinel() proc recompileFullProject(graph: ModuleGraph; cache: IdentCache) = #echo "recompiling full project" - resetSystemArtifacts() + resetSystemArtifacts(graph) vm.globalCtx = nil graph.resetAllModules() GC_fullcollect() @@ -441,8 +446,9 @@ proc recompileFullProject(graph: ModuleGraph; cache: IdentCache) = #echo GC_getStatistics() proc mainThread(graph: ModuleGraph; cache: IdentCache) = + let conf = graph.config if gLogging: - for it in searchPaths: + for it in conf.searchPaths: log(it) proc wrHook(line: string) {.closure.} = @@ -468,7 +474,7 @@ proc mainThread(graph: ModuleGraph; cache: IdentCache) = idle += 1 if idle == 20 and gRefresh: # we use some nimsuggest activity to enable a lazy recompile: - gIdeCmd = ideChk + conf.ideCmd = ideChk msgs.writelnHook = proc (s: string) = discard cachedMsgs.setLen 0 msgs.structuredErrorHook = proc (info: TLineInfo; msg: string; sev: Severity) = @@ -480,20 +486,21 @@ var inputThread: Thread[ThreadParams] proc mainCommand(graph: ModuleGraph; cache: IdentCache) = + let conf = graph.config clearPasses() registerPass verbosePass registerPass semPass gCmd = cmdIdeTools incl gGlobalOptions, optCaasEnabled - wantMainModule() + wantMainModule(conf) - if not fileExists(gProjectFull): - quit "cannot find file: " & gProjectFull + if not fileExists(conf.projectFull): + quit "cannot find file: " & conf.projectFull - add(searchPaths, options.libpath) + add(conf.searchPaths, conf.libpath) # do not stop after the first error: - msgs.gErrorMax = high(int) + conf.errorMax = high(int) # do not print errors, but log them msgs.writelnHook = proc (s: string) = log(s) msgs.structuredErrorHook = nil @@ -510,15 +517,15 @@ proc mainCommand(graph: ModuleGraph; cache: IdentCache) = of mtcp: createThread(inputThread, replTcp, (gPort, gAddress)) of mepc: createThread(inputThread, replEpc, (gPort, gAddress)) of mcmdsug: createThread(inputThread, replCmdline, - (gPort, "sug \"" & options.gProjectFull & "\":" & gAddress)) + (gPort, "sug \"" & conf.projectFull & "\":" & gAddress)) of mcmdcon: createThread(inputThread, replCmdline, - (gPort, "con \"" & options.gProjectFull & "\":" & gAddress)) + (gPort, "con \"" & conf.projectFull & "\":" & gAddress)) mainThread(graph, cache) joinThread(inputThread) close(requests) close(results) -proc processCmdLine*(pass: TCmdLinePass, cmd: string; config: ConfigRef) = +proc processCmdLine*(pass: TCmdLinePass, cmd: string; conf: ConfigRef) = var p = parseopt.initOptParser(cmd) while true: parseopt.next(p) @@ -562,66 +569,67 @@ proc processCmdLine*(pass: TCmdLinePass, cmd: string; config: ConfigRef) = gRefresh = true of "maxresults": suggestMaxResults = parseInt(p.val) - else: processSwitch(pass, p, config) + else: processSwitch(pass, p, conf) of cmdArgument: let a = unixToNativePath(p.key) if dirExists(a) and not fileExists(a.addFileExt("nim")): - options.gProjectName = findProjectNimFile(a) + conf.projectName = findProjectNimFile(conf, a) # don't make it worse, report the error the old way: - if options.gProjectName.len == 0: options.gProjectName = a + if conf.projectName.len == 0: conf.projectName = a else: - options.gProjectName = a + conf.projectName = a # if processArgument(pass, p, argsCount): break -proc handleCmdLine(cache: IdentCache; config: ConfigRef) = +proc handleCmdLine(cache: IdentCache; conf: ConfigRef) = + condsyms.initDefines(conf.symbols) + defineSymbol conf.symbols, "nimsuggest" + if paramCount() == 0: stdout.writeline(Usage) else: - processCmdLine(passCmd1, "", config) + processCmdLine(passCmd1, "", conf) if gMode != mstdin: msgs.writelnHook = proc (msg: string) = discard - if gProjectName != "": + if conf.projectName != "": try: - gProjectFull = canonicalizePath(gProjectName) + conf.projectFull = canonicalizePath(conf, conf.projectName) except OSError: - gProjectFull = gProjectName - var p = splitFile(gProjectFull) - gProjectPath = canonicalizePath p.dir - gProjectName = p.name + conf.projectFull = conf.projectName + var p = splitFile(conf.projectFull) + conf.projectPath = canonicalizePath(conf, p.dir) + conf.projectName = p.name else: - gProjectPath = canonicalizePath getCurrentDir() + conf.projectPath = canonicalizePath(conf, getCurrentDir()) # Find Nim's prefix dir. let binaryPath = findExe("nim") if binaryPath == "": raise newException(IOError, "Cannot find Nim standard library: Nim compiler not in PATH") - gPrefixDir = binaryPath.splitPath().head.parentDir() - if not dirExists(gPrefixDir / "lib"): gPrefixDir = "" + conf.prefixDir = binaryPath.splitPath().head.parentDir() + if not dirExists(conf.prefixDir / "lib"): conf.prefixDir = "" #msgs.writelnHook = proc (line: string) = log(line) - myLog("START " & gProjectFull) + myLog("START " & conf.projectFull) - loadConfigs(DefaultConfig, cache, config) # load all config files + loadConfigs(DefaultConfig, cache, conf) # load all config files # now process command line arguments again, because some options in the # command line can overwite the config file's settings - options.command = "nimsuggest" - let scriptFile = gProjectFull.changeFileExt("nims") + conf.command = "nimsuggest" + let scriptFile = conf.projectFull.changeFileExt("nims") if fileExists(scriptFile): # 'nimsuggest foo.nims' means to just auto-complete the NimScript file: - if scriptFile != gProjectFull: - runNimScript(cache, scriptFile, freshDefines=false, config) - elif fileExists(gProjectPath / "config.nims"): + if scriptFile != conf.projectFull: + runNimScript(cache, scriptFile, freshDefines=false, conf) + elif fileExists(conf.projectPath / "config.nims"): # directory wide NimScript file - runNimScript(cache, gProjectPath / "config.nims", freshDefines=false, config) + runNimScript(cache, conf.projectPath / "config.nims", freshDefines=false, conf) - extccomp.initVars() - processCmdLine(passCmd2, "", config) + extccomp.initVars(conf) + processCmdLine(passCmd2, "", conf) - let graph = newModuleGraph(config) + let graph = newModuleGraph(conf) graph.suggestMode = true mainCommand(graph, cache) -condsyms.initDefines() -defineSymbol "nimsuggest" handleCmdline(newIdentCache(), newConfigRef()) |