guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

03/03: style: For 'let' and similar forms, emit one binding per line.


From: guix-commits
Subject: 03/03: style: For 'let' and similar forms, emit one binding per line.
Date: Mon, 4 Jul 2022 17:40:19 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix.

commit 8d9291bd2c36810be50ea340cefa481a42c60a2b
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Mon Jul 4 23:29:55 2022 +0200

    style: For 'let' and similar forms, emit one binding per line.
    
    Previously, 'let' bindings could be rendered like this:
    
      (let ((x 1) (y 2)
            (z 3))
        ...)
    
    With this change, each bindings goes in its own line.
    
    Partly fixes <https://issues.guix.gnu.org/56297>.
    Reported by Maxime Devos <maximedevos@telenet.be>.
    
    * guix/scripts/style.scm (pretty-print-with-comments)[list-of-lists?]:
    New procedure.
    Use it.
    * tests/style.scm: Add tests with 'let' and 'substitute-keyword-arguments'.
---
 guix/scripts/style.scm | 13 ++++++++++++-
 tests/style.scm        | 19 +++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/guix/scripts/style.scm b/guix/scripts/style.scm
index 09937d9e02..fd5f7f5c26 100644
--- a/guix/scripts/style.scm
+++ b/guix/scripts/style.scm
@@ -272,6 +272,16 @@ included in the output.
 Lists longer than LONG-LIST are written as one element per line.  Comments are
 passed through FORMAT-COMMENT before being emitted; a useful value for
 FORMAT-COMMENT is 'canonicalize-comment'."
+  (define (list-of-lists? head tail)
+    ;; Return true if HEAD and TAIL denote a list of lists--e.g., a list of
+    ;; 'let' bindings.
+    (match head
+      ((thing _ ...)                              ;proper list
+       (and (not (memq thing
+                       '(quote quasiquote unquote unquote-splicing)))
+            (pair? tail)))
+      (_ #f)))
+
   (let loop ((indent indent)
              (column indent)
              (delimited? #t)                  ;true if comes after a delimiter
@@ -436,7 +446,8 @@ FORMAT-COMMENT is 'canonicalize-comment'."
               (column    (if overflow?
                              (+ indent 1)
                              (+ column (if delimited? 1 2))))
-              (newline?  (newline-form? head context))
+              (newline?  (or (newline-form? head context)
+                             (list-of-lists? head tail))) ;'let' bindings
               (context   (cons head context)))
          (if overflow?
              (begin
diff --git a/tests/style.scm b/tests/style.scm
index 48d975df94..55bad2b3ba 100644
--- a/tests/style.scm
+++ b/tests/style.scm
@@ -504,6 +504,25 @@ mnopqrstuvwxyz.\")"
          #:make-flags #~'(\"ANSWER=42\")
          #:tests? #f)))")
 
+(test-pretty-print "\
+(let ((x 1)
+      (y 2)
+      (z (let* ((a 3)
+                (b 4))
+           (+ a b))))
+  (list x y z))")
+
+(test-pretty-print "\
+(substitute-keyword-arguments (package-arguments x)
+  ((#:phases phases)
+   `(modify-phases ,phases
+      (add-before 'build 'do-things
+        (lambda _
+          #t))))
+  ((#:configure-flags flags)
+   `(cons \"--without-any-problem\"
+          ,flags)))")
+
 (test-equal "pretty-print-with-comments, canonicalize-comment"
   "\
 (list abc



reply via email to

[Prev in Thread] Current Thread [Next in Thread]