fix: nil load-file-name in package autoloads

Some packages do funky things in their autoloads, so care is needed to
closely emulate an autoloading environment when loading them, however,
in 8cafbe4, Doom wraps these autoloads in a function, thus ensuring
they're executed without `load-file-name` or `load-in-progress` set,
which some packages will expect these in their autoloads.

This fixes the (wrong-type-argument stringp nil) error some folks see
with certain packages doing said funky things in their autoloads (like
realgun in the :tools debugger module).

Fix: #8143
Amend: 8cafbe4408
This commit is contained in:
Henrik Lissner
2024-11-03 19:04:50 -05:00
parent 5649e1acc4
commit 114f99688c
2 changed files with 40 additions and 38 deletions

View File

@ -174,18 +174,15 @@ non-nil, treat FILES as pre-generated autoload files instead."
(file-readable-p file))
(doom-log "loaddefs:scan: %s" file)
(with-temp-buffer
(let (subautoloads)
(if literal
(insert-file-contents file)
(doom-autoloads--scan-file file))
(save-excursion
(while (re-search-forward "\\_<load-file-name\\_>" nil t)
;; `load-file-name' is meaningless in a concatenated
;; mega-autoloads file, but also essential in isolation, so we
;; replace references to it with the file they came from.
(let ((ppss (save-excursion (syntax-ppss))))
(or (nth 3 ppss)
(nth 4 ppss)
(replace-match (prin1-to-string (abbreviate-file-name file)) t t)))))
;; Fixup the special #$ reader form and throw away comments.
(while (re-search-forward "#\\$\\|^;\\(.*\n\\)" nil 'move)
(unless (ppss-string-terminator (save-match-data (syntax-ppss)))
(replace-match (if (match-end 1) "" pfile) t t))))
(let ((load-file-name file)
(load-path
(append (list doom-user-dir)
@ -195,8 +192,11 @@ non-nil, treat FILES as pre-generated autoload files instead."
(while t
(push (doom-autoloads--cleanup-form (read (current-buffer))
(not literal))
autoloads))
(end-of-file))))))))
subautoloads))
(end-of-file)))
(push `(let* ((load-file-name ,file) (load-true-file-name load-file-name))
,@(delq nil subautoloads))
autoloads)))))))
(provide 'doom-lib '(autoloads))
;;; autoloads.el end here

View File

@ -397,6 +397,7 @@ caches them in `doom--profiles'. If RELOAD? is non-nil, refresh the cache."
(defun doom-profile--generate-doom-autoloads ()
`((defun doom--startup-module-autoloads ()
(let ((load-in-progress t))
,@(doom-autoloads--scan
(append (doom-glob doom-core-dir "lib/*.el")
(cl-loop for dir
@ -405,16 +406,17 @@ caches them in `doom--profiles'. If RELOAD? is non-nil, refresh the cache."
if (doom-glob dir "autoload.el") collect (car it)
if (doom-glob dir "autoload/*.el") append it)
(mapcan #'doom-glob doom-autoloads-files))
nil))))
nil)))))
(defun doom-profile--generate-package-autoloads ()
`((defun doom--startup-package-autoloads ()
(let ((load-in-progress t))
,@(doom-autoloads--scan
(mapcar #'straight--autoloads-file
(nreverse (seq-difference (hash-table-keys straight--build-cache)
doom-autoloads-excluded-packages)))
doom-autoloads-excluded-files
'literal))))
'literal)))))
(provide 'doom-lib '(profiles))
;;; profiles.el ends here