[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