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.master
parent
dde0291476
commit
9562a2eb61
|
@ -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 @@ etc."
|
||||||
(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))
|
||||||
|
|
10
guix/ui.scm
10
guix/ui.scm
|
@ -376,12 +376,14 @@ ARGS is the list of arguments received by the 'throw' handler."
|
||||||
(('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)))
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 @@
|
||||||
(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 @@
|
||||||
(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 @@
|
||||||
(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 @@
|
||||||
(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)))
|
||||||
|
|
Reference in New Issue