read-print: Support printing multi-line comments.
* guix/read-print.scm (%not-newline): New variable. (print-multi-line-comment): New procedure. (pretty-print-with-comments): Use it. * tests/read-print.scm ("pretty-print-with-comments, multi-line comment"): New test.
This commit is contained in:
parent
a109ee9048
commit
445a0d134c
@ -387,6 +387,27 @@ particular newlines, is left as is."
|
|||||||
line "\n")
|
line "\n")
|
||||||
(comment-margin? comment)))))
|
(comment-margin? comment)))))
|
||||||
|
|
||||||
|
(define %not-newline
|
||||||
|
(char-set-complement (char-set #\newline)))
|
||||||
|
|
||||||
|
(define (print-multi-line-comment str indent port)
|
||||||
|
"Print to PORT STR as a multi-line comment, with INDENT spaces preceding
|
||||||
|
each line except the first one (they're assumed to be already there)."
|
||||||
|
|
||||||
|
;; While 'read-with-comments' only returns one-line comments, user-provided
|
||||||
|
;; comments might span multiple lines, which is why this is necessary.
|
||||||
|
(let loop ((lst (string-tokenize str %not-newline)))
|
||||||
|
(match lst
|
||||||
|
(() #t)
|
||||||
|
((last)
|
||||||
|
(display last port)
|
||||||
|
(newline port))
|
||||||
|
((head tail ...)
|
||||||
|
(display head port)
|
||||||
|
(newline port)
|
||||||
|
(display (make-string indent #\space) port)
|
||||||
|
(loop tail)))))
|
||||||
|
|
||||||
(define* (pretty-print-with-comments port obj
|
(define* (pretty-print-with-comments port obj
|
||||||
#:key
|
#:key
|
||||||
(format-comment
|
(format-comment
|
||||||
@ -486,8 +507,9 @@ FORMAT-VERTICAL-SPACE; a useful value of 'canonicalize-vertical-space'."
|
|||||||
(unless (= column indent)
|
(unless (= column indent)
|
||||||
(newline port)
|
(newline port)
|
||||||
(display (make-string indent #\space) port))
|
(display (make-string indent #\space) port))
|
||||||
(display (comment->string (format-comment comment indent))
|
(print-multi-line-comment (comment->string
|
||||||
port)))
|
(format-comment comment indent))
|
||||||
|
indent port)))
|
||||||
(display (make-string indent #\space) port)
|
(display (make-string indent #\space) port)
|
||||||
indent)
|
indent)
|
||||||
((? vertical-space? space)
|
((? vertical-space? space)
|
||||||
|
@ -341,4 +341,18 @@ mnopqrstuvwxyz.\")"
|
|||||||
#:format-vertical-space
|
#:format-vertical-space
|
||||||
canonicalize-vertical-space)))))
|
canonicalize-vertical-space)))))
|
||||||
|
|
||||||
|
(test-equal "pretty-print-with-comments, multi-line comment"
|
||||||
|
"\
|
||||||
|
(list abc
|
||||||
|
;; This comment spans
|
||||||
|
;; two lines.
|
||||||
|
def)"
|
||||||
|
(call-with-output-string
|
||||||
|
(lambda (port)
|
||||||
|
(pretty-print-with-comments port
|
||||||
|
`(list abc ,(comment "\
|
||||||
|
;; This comment spans\n
|
||||||
|
;; two lines.\n")
|
||||||
|
def)))))
|
||||||
|
|
||||||
(test-end)
|
(test-end)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user