From f9a15dbae909f4521cd506bedf7ec500c4f4d9f8 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Mon, 28 Dec 2020 03:19:47 -0800 Subject: [PATCH] fix `nim secret` dots interfering with prompt (#16491) * fix nim secret dots * cleanups --- compiler/llstream.nim | 6 +++++- compiler/main.nim | 3 ++- compiler/msgs.nim | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler/llstream.nim b/compiler/llstream.nim index 6df927c60b..b768e6c837 100644 --- a/compiler/llstream.nim +++ b/compiler/llstream.nim @@ -20,6 +20,7 @@ when hasRstdin: import rdstdin type TLLRepl* = proc (s: PLLStream, buf: pointer, bufLen: int): int + OnPrompt* = proc() {.closure.} TLLStreamKind* = enum # enum of different stream implementations llsNone, # null stream: reading and writing has no effect llsString, # stream encapsulates a string @@ -32,6 +33,7 @@ type rd*, wr*: int # for string streams lineOffset*: int # for fake stdin line numbers repl*: TLLRepl # gives stdin control to clients + onPrompt*: OnPrompt PLLStream* = ref TLLStream @@ -55,12 +57,13 @@ proc llStreamOpen*(): PLLStream = result.kind = llsNone proc llReadFromStdin(s: PLLStream, buf: pointer, bufLen: int): int -proc llStreamOpenStdIn*(r: TLLRepl = llReadFromStdin): PLLStream = +proc llStreamOpenStdIn*(r: TLLRepl = llReadFromStdin, onPrompt: OnPrompt = nil): PLLStream = new(result) result.kind = llsStdIn result.s = "" result.lineOffset = -1 result.repl = r + result.onPrompt = onPrompt proc llStreamClose*(s: PLLStream) = case s.kind @@ -133,6 +136,7 @@ proc llStreamRead*(s: PLLStream, buf: pointer, bufLen: int): int = of llsFile: result = readBuffer(s.f, buf, bufLen) of llsStdIn: + if s.onPrompt!=nil: s.onPrompt() result = s.repl(s, buf, bufLen) proc llStreamReadLine*(s: PLLStream, line: var string): bool = diff --git a/compiler/main.nim b/compiler/main.nim index 73676ffd5d..74c19bf10e 100644 --- a/compiler/main.nim +++ b/compiler/main.nim @@ -138,7 +138,8 @@ proc commandInteractive(graph: ModuleGraph) = var m = graph.makeStdinModule() incl(m.flags, sfMainModule) var idgen = IdGenerator(module: m.itemId.module, item: m.itemId.item) - processModule(graph, m, idgen, llStreamOpenStdIn()) + let s = llStreamOpenStdIn(onPrompt = proc() = flushDot(graph.config, stderr)) + processModule(graph, m, idgen, s) proc commandScan(cache: IdentCache, config: ConfigRef) = var f = addFileExt(AbsoluteFile mainCommandArg(config), NimExt) diff --git a/compiler/msgs.nim b/compiler/msgs.nim index d027ce960e..6d6e212047 100644 --- a/compiler/msgs.nim +++ b/compiler/msgs.nim @@ -19,9 +19,9 @@ template instLoc(): InstantiationInfo = instantiationInfo(-2, fullPaths = true) template toStdOrrKind(stdOrr): untyped = if stdOrr == stdout: stdOrrStdout else: stdOrrStderr -template flushDot(conf, stdOrr) = +template flushDot*(conf, stdOrr) = ## safe to call multiple times - let stdOrrKind = stdOrr.toStdOrrKind() + let stdOrrKind = toStdOrrKind(stdOrr) if stdOrrKind in conf.lastMsgWasDot: conf.lastMsgWasDot.excl stdOrrKind write(stdOrr, "\n")