diagnostics, ui: Adjust to 'read-error' and 'syntax-error' in Guile 3.0.6.

* guix/diagnostics.scm (source-properties->location): Add clause for
vectors.
* guix/ui.scm (report-load-error): Tweak 'read-error' handling for 3.0.6.
* tests/guix-package.sh: Relax regexp for the "unbound variable"
diagnostic check.
* tests/guix-system.sh: Adjust "missing closing paren" check for 3.0.6.
* tests/records.scm (location-alist): New procedure.
("define-record-type* & wrong field specifier")
("define-record-type* & wrong field specifier, identifier")
("define-record-type* & duplicate initializers"): Use it.
This commit is contained in:
Ludovic Courtès 2021-04-29 00:38:03 +02:00
parent 0ce1b28151
commit 524c9800af
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
5 changed files with 33 additions and 11 deletions

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -233,6 +233,10 @@ (define (source-properties->location loc)
(make-location file (+ line 1) col))) (make-location file (+ line 1) col)))
(#f (#f
#f) #f)
(#(file line column)
;; Guile >= 3.0.6 uses vectors instead of alists internally, which can be
;; seen in the arguments to 'syntax-error' exceptions.
(location file (+ 1 line) column))
(_ (_
(let ((file (assq-ref loc 'filename)) (let ((file (assq-ref loc 'filename))
(line (assq-ref loc 'line)) (line (assq-ref loc 'line))

View file

@ -376,12 +376,14 @@ (define* (report-load-error file args #:optional frame)
(('system-error . rest) (('system-error . rest)
(let ((err (system-error-errno args))) (let ((err (system-error-errno args)))
(report-error (G_ "failed to load '~a': ~a~%") file (strerror err)))) (report-error (G_ "failed to load '~a': ~a~%") file (strerror err))))
(('read-error "scm_i_lreadparen" message _ ...) (('read-error _ message args ...)
;; Guile's missing-paren messages are obscure so we make them more ;; Guile's missing-paren messages are obscure so we make them more
;; intelligible here. ;; intelligible here.
(if (string-suffix? "end of file" message) (if (or (string-suffix? "end of file" message) ;Guile < 3.0.6
(let ((location (string-drop-right message (and (string-contains message "unexpected end of input")
(string-length "end of file")))) (member '(#\)) args)))
(let ((location (string-take message
(+ 2 (string-contains message ": ")))))
(format (current-error-port) (G_ "~amissing closing parenthesis~%") (format (current-error-port) (G_ "~amissing closing parenthesis~%")
location)) location))
(apply throw args))) (apply throw args)))

View file

@ -459,7 +459,7 @@ if guix package --bootstrap -n -m "$module_dir/manifest.scm" \
then false then false
else else
cat "$module_dir/stderr" cat "$module_dir/stderr"
grep "manifest.scm:[1-3]:.*wonderful-package.*: unbound variable" \ grep "manifest.scm:[1-4]:.*wonderful-package.*: unbound variable" \
"$module_dir/stderr" "$module_dir/stderr"
fi fi

View file

@ -51,6 +51,7 @@ then
# This must not succeed. # This must not succeed.
exit 1 exit 1
else else
cat "$errorfile"
grep "$tmpfile:2:3:.*missing.* initializers" "$errorfile" grep "$tmpfile:2:3:.*missing.* initializers" "$errorfile"
fi fi
@ -66,7 +67,12 @@ then
# This must not succeed. # This must not succeed.
exit 1 exit 1
else else
grep "$tmpfile:4:1: missing closing paren" "$errorfile" cat "$errorfile"
# Guile 3.0.6 gets line/column numbers for 'read-error' wrong
# (zero-indexed): <https://bugs.gnu.org/48089>.
grep "$tmpfile:4:1: missing closing paren" "$errorfile" || \
grep "$tmpfile:3:0: missing closing paren" "$errorfile"
fi fi

View file

@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -29,6 +29,16 @@ (define (test-module)
(module-use! module (resolve-interface '(guix records))) (module-use! module (resolve-interface '(guix records)))
module)) module))
(define (location-alist loc)
;; Return a location alist. In Guile < 3.0.6, LOC is always an alist, but
;; starting with 3.0.6, LOC is a vector (at least when it comes from
;; 'syntax-error' exceptions), hence this conversion.
(match loc
(#(file line column)
`((line . ,line) (column . ,column)
(filename . ,file)))
(_ loc)))
(test-begin "records") (test-begin "records")
@ -298,7 +308,7 @@ (define-record-type* <foo> foo make-foo
(pk 'expected-loc (pk 'expected-loc
`((line . ,(- (assq-ref loc 'line) 1)) `((line . ,(- (assq-ref loc 'line) 1))
,@(alist-delete 'line loc))) ,@(alist-delete 'line loc)))
(pk 'actual-loc location))))))) (pk 'actual-loc (location-alist location))))))))
(test-assert "define-record-type* & wrong field specifier, identifier" (test-assert "define-record-type* & wrong field specifier, identifier"
(let ((exp '(begin (let ((exp '(begin
@ -325,7 +335,7 @@ (define-record-type* <foo> foo make-foo
(pk 'expected-loc (pk 'expected-loc
`((line . ,(- (assq-ref loc 'line) 2)) `((line . ,(- (assq-ref loc 'line) 2))
,@(alist-delete 'line loc))) ,@(alist-delete 'line loc)))
(pk 'actual-loc location))))))) (pk 'actual-loc (location-alist location))))))))
(test-assert "define-record-type* & missing initializers" (test-assert "define-record-type* & missing initializers"
(catch 'syntax-error (catch 'syntax-error
@ -396,7 +406,7 @@ (define-record-type* <foo> foo make-foo
(pk 'expected-loc (pk 'expected-loc
`((line . ,(- (assq-ref loc 'line) 1)) `((line . ,(- (assq-ref loc 'line) 1))
,@(alist-delete 'line loc))) ,@(alist-delete 'line loc)))
(pk 'actual-loc location))))))) (pk 'actual-loc (location-alist location))))))))
(test-assert "ABI checks" (test-assert "ABI checks"
(let ((module (test-module))) (let ((module (test-module)))