summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2020-12-28 03:19:47 -0800
committerGitHub <noreply@github.com>2020-12-28 12:19:47 +0100
commitf9a15dbae909f4521cd506bedf7ec500c4f4d9f8 (patch)
treef5d58c4e0e46b065318fe8bc79e968886a4ce0d3
parentfbc8a40c7a351ff7c0f2dc0608bc8926f89d8537 (diff)
downloadNim-f9a15dbae909f4521cd506bedf7ec500c4f4d9f8.tar.gz
fix `nim secret` dots interfering with prompt (#16491)
* fix nim secret dots

* cleanups
-rw-r--r--compiler/llstream.nim6
-rw-r--r--compiler/main.nim3
-rw-r--r--compiler/msgs.nim4
3 files changed, 9 insertions, 4 deletions
diff --git a/compiler/llstream.nim b/compiler/llstream.nim
index 6df927c60..b768e6c83 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 73676ffd5..74c19bf10 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 d027ce960..6d6e21204 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")