ui: Only suggest modules that export the unbound variable identifier.

Fixes <https://bugs.gnu.org/43498>.
Reported by Tobias Geerinckx-Rice <me@tobias.gr>.

* guix/ui.scm (known-variable-definition): Check for variables in the
public interface of HEAD, not in HEAD itself.
* tests/guix-build.sh: Add test.
This commit is contained in:
Ludovic Courtès 2020-10-15 16:41:14 +02:00
parent 48720afb32
commit 5ef1508942
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 29 additions and 1 deletions

View File

@ -297,7 +297,8 @@ VARIABLE and return it, or #f if none was found."
(hash-map->list (lambda (name module)
module)
(module-submodules head)))))
(match (module-local-variable head variable)
(match (and=> (module-public-interface head)
(cut module-local-variable <> variable))
(#f (loop next suggestions visited))
(_
(match (module-name head)

View File

@ -198,6 +198,33 @@ grep "forget.*(guix build-system gnu)" "$module_dir/err" # hint
rm -f "$module_dir"/*
# Unbound variable: don't suggest modules that do not export the variable.
cat > "$module_dir/aa-private.scm" <<EOF
(define-module (aa-private))
(define make-thing #f)
(set! make-thing make-thing) ;don't inline
EOF
cat > "$module_dir/bb-public.scm" <<EOF
(define-module (bb-public) #:export (make-thing))
(define make-thing identity)
EOF
cat > "$module_dir/cc-user.scm" <<EOF
;; Make those module available in the global name space.
(load-from-path "aa-private.scm")
(load-from-path "bb-public.scm")
(define-module (cc-user))
(make-thing 42)
EOF
! guix build -f "$module_dir/cc-user.scm" -n 2> "$module_dir/err"
cat "$module_dir/err"
grep "make-thing.*unbound" "$module_dir/err" # actual error
grep "forget.*(bb-public)" "$module_dir/err" # hint
rm -f "$module_dir"/*
# Wrong 'define-module' clause reported by 'warn-about-load-error'.
cat > "$module_dir/foo.scm" <<EOF
(define-module (something foo)