summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/layouter.nim46
-rw-r--r--nimpretty/tests/exhaustive.nim28
-rw-r--r--nimpretty/tests/expected/exhaustive.nim36
3 files changed, 87 insertions, 23 deletions
diff --git a/compiler/layouter.nim b/compiler/layouter.nim
index 24efc7142..b54fb93bf 100644
--- a/compiler/layouter.nim
+++ b/compiler/layouter.nim
@@ -300,29 +300,37 @@ proc emitMultilineComment(em: var Emitter, lit: string, col: int) =
   var i = 0
   var lastIndent = em.indentStack[^1]
   var b = 0
+  var dontIndent = false
   for commentLine in splitLines(lit):
-    let stripped = commentLine.strip()
-    var a = 0
-    while a < commentLine.len and commentLine[a] == ' ': inc a
-    if i == 0:
-      if em.kinds.len > 0 and em.kinds[^1] != ltTab:
-        wr(em, "", ltTab)
-    elif stripped.len == 0:
+    if i == 0 and (commentLine.endsWith("\\") or commentLine.endsWith("[")):
+      dontIndent = true
+      wr em, commentLine, ltComment
+    elif dontIndent:
       wrNewline em
+      wr em, commentLine, ltComment
     else:
-      if a > lastIndent:
-        b += em.indWidth
-        lastIndent = a
-      elif a < lastIndent:
-        b -= em.indWidth
-        lastIndent = a
-      wrNewline em
-      #wrSpaces em, col + b
-      if col + b > 0:
-        wr(em, repeat(' ', col+b), ltTab)
+      let stripped = commentLine.strip()
+      var a = 0
+      while a < commentLine.len and commentLine[a] == ' ': inc a
+      if i == 0:
+        if em.kinds.len > 0 and em.kinds[^1] != ltTab:
+          wr(em, "", ltTab)
+      elif stripped.len == 0:
+        wrNewline em
       else:
-        wr(em, "", ltTab)
-    wr em, stripped, ltComment
+        if a > lastIndent:
+          b += em.indWidth
+          lastIndent = a
+        elif a < lastIndent:
+          b -= em.indWidth
+          lastIndent = a
+        wrNewline em
+        #wrSpaces em, col + b
+        if col + b > 0:
+          wr(em, repeat(' ', col+b), ltTab)
+        else:
+          wr(em, "", ltTab)
+      wr em, stripped, ltComment
     inc i
 
 proc lastChar(s: string): char =
diff --git a/nimpretty/tests/exhaustive.nim b/nimpretty/tests/exhaustive.nim
index 933b0de75..7a8ae6acc 100644
--- a/nimpretty/tests/exhaustive.nim
+++ b/nimpretty/tests/exhaustive.nim
@@ -689,6 +689,34 @@ proc newRecordGen(ctx: Context; typ: TypRef): PNode =
         typ.recFields.map(newRecFieldGen))))
 
 
+##[
+String `interpolation`:idx: / `format`:idx: inspired by
+Python's ``f``-strings.
+
+.. code-block:: nim
+
+    import strformat
+    let msg = "hello"
+    doAssert fmt"{msg}\n" == "hello\\n"
+
+Because the literal is a raw string literal, the ``\n`` is not interpreted as
+an escape sequence.
+
+
+=================        ====================================================
+  Sign                   Meaning
+=================        ====================================================
+``+``                    Indicates that a sign should be used for both
+                         positive as well as negative numbers.
+``-``                    Indicates that a sign should be used only for
+                         negative numbers (this is the default behavior).
+(space)                  Indicates that a leading space should be used on
+                         positive numbers.
+=================        ====================================================
+
+]##
+
+
 let
   lla = 42394219 - 42429849 + 1293293 - 13918391 + 424242 # this here is an okayish comment
   llb = 42394219 - 42429849 + 1293293 - 13918391 + 424242 # this here is a very long comment which should be split
diff --git a/nimpretty/tests/expected/exhaustive.nim b/nimpretty/tests/expected/exhaustive.nim
index c5ef965e6..046364f4e 100644
--- a/nimpretty/tests/expected/exhaustive.nim
+++ b/nimpretty/tests/expected/exhaustive.nim
@@ -631,10 +631,10 @@ type
     cmdLongOption,    ## A long option such as --option
     cmdShortOption    ## A short option such as -c
   OptParser* = object of RootObj ## \
-                                 ## Implementation of the command line parser. Here is even more text yad.
-                                 ##
-                                 ## To initialize it, use the
-                                 ## `initOptParser proc<#initOptParser,string,set[char],seq[string]>`_.
+    ## Implementation of the command line parser. Here is even more text yad.
+    ##
+    ## To initialize it, use the
+    ## `initOptParser proc<#initOptParser,string,set[char],seq[string]>`_.
     pos*: int
     inShortState: bool
     allowWhitespaceAfterColon: bool
@@ -695,6 +695,34 @@ proc newRecordGen(ctx: Context; typ: TypRef): PNode =
         typ.recFields.map(newRecFieldGen))))
 
 
+##[
+String `interpolation`:idx: / `format`:idx: inspired by
+Python's ``f``-strings.
+
+.. code-block:: nim
+
+    import strformat
+    let msg = "hello"
+    doAssert fmt"{msg}\n" == "hello\\n"
+
+Because the literal is a raw string literal, the ``\n`` is not interpreted as
+an escape sequence.
+
+
+=================        ====================================================
+  Sign                   Meaning
+=================        ====================================================
+``+``                    Indicates that a sign should be used for both
+                         positive as well as negative numbers.
+``-``                    Indicates that a sign should be used only for
+                         negative numbers (this is the default behavior).
+(space)                  Indicates that a leading space should be used on
+                         positive numbers.
+=================        ====================================================
+
+]##
+
+
 let
   lla = 42394219 - 42429849 + 1293293 - 13918391 + 424242 # this here is an okayish comment
   llb = 42394219 - 42429849 + 1293293 - 13918391 +