fix hintProcessing dots interference with static:echo and hintCC; add tests for nim secret, add tests for hintProcessing, misc other bug fixes (#16495)
* fix dots interfering with static:echo * add tests * fix hintProcessing dots for hintCC * improve trunner tests * fix bug: readLineFromStdin now writes prompt to stdout, consistent with linenoise and rdstdin * disable a failing test for windows
This commit is contained in:
parent
2f4d00fb98
commit
8508c4e1c2
7 changed files with 77 additions and 21 deletions
|
|
@ -848,7 +848,10 @@ proc callCCompiler*(conf: ConfigRef) =
|
|||
var cmds: TStringSeq
|
||||
var prettyCmds: TStringSeq
|
||||
let prettyCb = proc (idx: int) =
|
||||
if prettyCmds[idx].len > 0: echo prettyCmds[idx]
|
||||
if prettyCmds[idx].len > 0:
|
||||
flushDot(conf)
|
||||
# xxx should probably use stderr like other compiler messages, not stdout
|
||||
echo prettyCmds[idx]
|
||||
|
||||
for idx, it in conf.toCompile:
|
||||
# call the C compiler for the .c file:
|
||||
|
|
|
|||
|
|
@ -75,10 +75,10 @@ proc llStreamClose*(s: PLLStream) =
|
|||
when not declared(readLineFromStdin):
|
||||
# fallback implementation:
|
||||
proc readLineFromStdin(prompt: string, line: var string): bool =
|
||||
stderr.write(prompt)
|
||||
stdout.write(prompt)
|
||||
result = readLine(stdin, line)
|
||||
if not result:
|
||||
stderr.write("\n")
|
||||
stdout.write("\n")
|
||||
quit(0)
|
||||
|
||||
proc endsWith*(x: string, s: set[char]): bool =
|
||||
|
|
|
|||
|
|
@ -138,7 +138,7 @@ proc commandInteractive(graph: ModuleGraph) =
|
|||
var m = graph.makeStdinModule()
|
||||
incl(m.flags, sfMainModule)
|
||||
var idgen = IdGenerator(module: m.itemId.module, item: m.itemId.item)
|
||||
let s = llStreamOpenStdIn(onPrompt = proc() = flushDot(graph.config, stderr))
|
||||
let s = llStreamOpenStdIn(onPrompt = proc() = flushDot(graph.config))
|
||||
processModule(graph, m, idgen, s)
|
||||
|
||||
proc commandScan(cache: IdentCache, config: ConfigRef) =
|
||||
|
|
|
|||
|
|
@ -19,8 +19,10 @@ template instLoc(): InstantiationInfo = instantiationInfo(-2, fullPaths = true)
|
|||
template toStdOrrKind(stdOrr): untyped =
|
||||
if stdOrr == stdout: stdOrrStdout else: stdOrrStderr
|
||||
|
||||
template flushDot*(conf, stdOrr) =
|
||||
proc flushDot*(conf: ConfigRef) =
|
||||
## safe to call multiple times
|
||||
# xxx one edge case not yet handled is when `printf` is called at CT with `compiletimeFFI`.
|
||||
let stdOrr = if optStdout in conf.globalOptions: stdout else: stderr
|
||||
let stdOrrKind = toStdOrrKind(stdOrr)
|
||||
if stdOrrKind in conf.lastMsgWasDot:
|
||||
conf.lastMsgWasDot.excl stdOrrKind
|
||||
|
|
@ -311,12 +313,12 @@ proc msgWriteln*(conf: ConfigRef; s: string, flags: MsgFlags = {}) =
|
|||
conf.writelnHook(s)
|
||||
elif optStdout in conf.globalOptions or msgStdout in flags:
|
||||
if eStdOut in conf.m.errorOutputs:
|
||||
flushDot(conf, stdout)
|
||||
flushDot(conf)
|
||||
writeLine(stdout, s)
|
||||
flushFile(stdout)
|
||||
else:
|
||||
if eStdErr in conf.m.errorOutputs:
|
||||
flushDot(conf, stderr)
|
||||
flushDot(conf)
|
||||
writeLine(stderr, s)
|
||||
# On Windows stderr is fully-buffered when piped, regardless of C std.
|
||||
when defined(windows):
|
||||
|
|
@ -368,11 +370,11 @@ template styledMsgWriteln*(args: varargs[typed]) =
|
|||
callIgnoringStyle(callWritelnHook, nil, args)
|
||||
elif optStdout in conf.globalOptions:
|
||||
if eStdOut in conf.m.errorOutputs:
|
||||
flushDot(conf, stdout)
|
||||
flushDot(conf)
|
||||
callIgnoringStyle(writeLine, stdout, args)
|
||||
flushFile(stdout)
|
||||
elif eStdErr in conf.m.errorOutputs:
|
||||
flushDot(conf, stderr)
|
||||
flushDot(conf)
|
||||
if optUseColors in conf.globalOptions:
|
||||
callStyledWriteLineStderr(args)
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -368,8 +368,11 @@ proc setNote*(conf: ConfigRef, note: TNoteKind, enabled = true) =
|
|||
if enabled: incl(conf.notes, note) else: excl(conf.notes, note)
|
||||
|
||||
proc hasHint*(conf: ConfigRef, note: TNoteKind): bool =
|
||||
# ternary states instead of binary states would simplify logic
|
||||
if optHints notin conf.options: false
|
||||
elif note in {hintConf}: # could add here other special notes like hintSource
|
||||
elif note in {hintConf, hintProcessing}:
|
||||
# could add here other special notes like hintSource
|
||||
# these notes apply globally.
|
||||
note in conf.mainPackageNotes
|
||||
else: note in conf.notes
|
||||
|
||||
|
|
|
|||
|
|
@ -1153,14 +1153,14 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
|
|||
stackTrace(c, tos, pc, "node is not a proc symbol")
|
||||
of opcEcho:
|
||||
let rb = instr.regB
|
||||
if rb == 1:
|
||||
msgWriteln(c.config, regs[ra].node.strVal, {msgStdout})
|
||||
template fn(s) = msgWriteln(c.config, s, {msgStdout})
|
||||
if rb == 1: fn(regs[ra].node.strVal)
|
||||
else:
|
||||
var outp = ""
|
||||
for i in ra..ra+rb-1:
|
||||
#if regs[i].kind != rkNode: debug regs[i]
|
||||
outp.add(regs[i].node.strVal)
|
||||
msgWriteln(c.config, outp, {msgStdout})
|
||||
fn(outp)
|
||||
of opcContainsSet:
|
||||
decodeBC(rkInt)
|
||||
regs[ra].intVal = ord(inSet(regs[rb].node, regs[rc].regToNode))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue