Subject: bug#63345: closed (Re: bug#63345: 28.2; provided-mode-derived-p doesn't work when passed an alias in MODES)

From: [email-masked] (GNU bug Tracking System)
Date: Mon, 08 May 2023 11:31:02 +0000

Your bug report

#63345: 28.2; provided-mode-derived-p doesn't work when passed an alias in MODES

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
63345: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=63345
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#63345: 28.2; provided-mode-derived-p doesn't work when passed an alias in MODES
From: Eli Zaretskii <[email-masked]>
To: Damien Cassou <[email-masked]>
Cc: [email-masked], [email-masked]
Date: Mon, 08 May 2023 14:31:43 +0300
List-Id: <debbugs-submit.debbugs.gnu.org>

> From: Damien Cassou <[email-masked]>
> Cc: [email-masked], Eli Zaretskii <[email-masked]>
> Date: Mon, 08 May 2023 06:56:05 +0200
> 
> Stefan Monnier <[email-masked]> writes:
> > `js-mode` is the right value to use there, indeed.
> 
> Very good, thank you. In this case I would close the issue.

Thanks, done.

Subject: 28.2; provided-mode-derived-p doesn't work when passed an alias in MODES
From: Damien Cassou <[email-masked]>
To: [email-masked]
Date: Sun, 07 May 2023 11:49:37 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi,

The function `provided-mode-derived-p` (used by `derived-mode-p`) has
the code below. The first 3 lines of the function takes care of
converting the first argument MODE if it is an alias (as
`javascript-mode` is an alias for `js-mode`). This works great when
calling the function this way:

  (provided-mode-derived-p 'javascript-mode 'prog-mode)
    ⇒ prog-mode

But if the second argument MODES contains an alias, the code has no
conversion mechanism and the line below returns nil even though I
expect it to return non-nil:

  (provided-mode-derived-p 'javacript-mode 'javascript-mode)
    ⇒ nil

Is that a bug?

(defun provided-mode-derived-p (mode &rest modes)
  "Non-nil if MODE is derived from one of MODES.
Uses the `derived-mode-parent' property of the symbol to trace backwards.
If you just want to check `major-mode', use `derived-mode-p'."
  ;; If MODE is an alias, then look up the real mode function first.
  (when-let ((alias (symbol-function mode)))
    (when (symbolp alias)
      (setq mode alias)))
  (while
      (and
       (not (memq mode modes))
       (let* ((parent (get mode 'derived-mode-parent))
              (parentfn (symbol-function parent)))
         (setq mode (if (and parentfn (symbolp parentfn)) parentfn parent)))))
  mode)

-- 
Damien Cassou

"Success is the ability to go from one failure to another without
losing enthusiasm." --Winston Churchill