summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorTimothee Cour <timothee.cour2@gmail.com>2021-04-29 02:25:08 -0700
committerGitHub <noreply@github.com>2021-04-29 02:25:08 -0700
commit87229e272ecd4012b750215d35e914580cd8475c (patch)
tree702ba3527005028375e51af9322fe38aa7457af9
parent016a8ccd7a8a018b28e8f424085c178d96860c6c (diff)
downloadNim-87229e272ecd4012b750215d35e914580cd8475c.tar.gz
fix #17853 (ascii message separator broke json nim dump) (#17887)
-rw-r--r--changelog.md4
-rw-r--r--compiler/main.nim3
-rw-r--r--compiler/msgs.nim1
-rw-r--r--compiler/options.nim2
-rw-r--r--tests/misc/trunner.nim11
-rw-r--r--tests/osproc/treadlines.nim7
6 files changed, 24 insertions, 4 deletions
diff --git a/changelog.md b/changelog.md
index 75d086450..21f3cb9b5 100644
--- a/changelog.md
+++ b/changelog.md
@@ -60,6 +60,10 @@
 
 - Removed `.travis.yml`, `appveyor.yml.disabled`, `.github/workflows/ci.yml.disabled`.
 
+- Nim compiler now adds ASCII unit separator `\31` before a newline for every generated
+  message (potentially multiline), so tooling can tell when messages start and end.
+
+
 ## Standard library additions and changes
 - Added support for parenthesized expressions in `strformat`
 
diff --git a/compiler/main.nim b/compiler/main.nim
index e7ee021bc..db5dd439e 100644
--- a/compiler/main.nim
+++ b/compiler/main.nim
@@ -349,7 +349,8 @@ proc mainCommand*(graph: ModuleGraph) =
         (key: "warnings", val: warnings),
       ]
 
-      msgWriteln(conf, $dumpdata, {msgStdout, msgSkipHook})
+      msgWriteln(conf, $dumpdata, {msgStdout, msgSkipHook, msgNoUnitSep})
+        # `msgNoUnitSep` to avoid generating invalid json, refs bug #17853
     else:
       msgWriteln(conf, "-- list of currently defined symbols --",
                  {msgStdout, msgSkipHook, msgNoUnitSep})
diff --git a/compiler/msgs.nim b/compiler/msgs.nim
index 93ca8d7cc..3abbf9e69 100644
--- a/compiler/msgs.nim
+++ b/compiler/msgs.nim
@@ -291,6 +291,7 @@ proc `??`* (conf: ConfigRef; info: TLineInfo, filename: string): bool =
 
 const
   UnitSep = "\31"
+    # this needs care to avoid issues similar to https://github.com/nim-lang/Nim/issues/17853
 
 type
   MsgFlag* = enum  ## flags altering msgWriteln behavior
diff --git a/compiler/options.nim b/compiler/options.nim
index 209564d0a..4773ba284 100644
--- a/compiler/options.nim
+++ b/compiler/options.nim
@@ -44,7 +44,7 @@ type                          # please make sure we have under 32 options
     optImportHidden
 
   TOptions* = set[TOption]
-  TGlobalOption* = enum       # **keep binary compatible**
+  TGlobalOption* = enum
     gloptNone, optForceFullMake,
     optWasNimscript,          # redundant with `cmdNimscript`, could be removed
     optListCmd, optCompileOnly, optNoLinking,
diff --git a/tests/misc/trunner.nim b/tests/misc/trunner.nim
index 06c828eaa..014373dfb 100644
--- a/tests/misc/trunner.nim
+++ b/tests/misc/trunner.nim
@@ -71,6 +71,7 @@ ret=[s1:foobar s2:foobar age:25 pi:3.14]
 
 else: # don't run twice the same test
   import std/strutils
+  import std/json
   template check2(msg) = doAssert msg in output, output
 
   block: # tests with various options `nim doc --project --index --docroot`
@@ -317,3 +318,13 @@ compiling: v3
 running: v3
 running: v2
 """, ret
+
+  block: # nim dump
+    let cmd = fmt"{nim} dump --dump.format:json -d:D20210428T161003 --hints:off ."
+    let (ret, status) = execCmdEx(cmd)
+    doAssert status == 0
+    let j = ret.parseJson
+    # sanity checks
+    doAssert "D20210428T161003" in j["defined_symbols"].to(seq[string])
+    doAssert j["version"].to(string) == NimVersion
+    doAssert j["nimExe"].to(string) == getCurrentCompilerExe()
diff --git a/tests/osproc/treadlines.nim b/tests/osproc/treadlines.nim
index 436dd7a10..bcde19d7f 100644
--- a/tests/osproc/treadlines.nim
+++ b/tests/osproc/treadlines.nim
@@ -1,15 +1,18 @@
 discard """
-  output: '''Error: cannot open 'a.nim'\31
+  output: '''
+Error: cannot open 'a.nim'\31
 Error: cannot open 'b.nim'\31
 '''
   targets: "c"
 """
 
 import osproc
+from std/os import getCurrentCompilerExe
 
 var ps: seq[Process] # compile & run 2 progs in parallel
+const nim = getCurrentCompilerExe()
 for prog in ["a", "b"]:
-  ps.add startProcess("nim", "",
+  ps.add startProcess(nim, "",
                       ["r", "--hint[Conf]=off", "--hint[Processing]=off", prog],
                       options = {poUsePath, poDaemon, poStdErrToStdOut})