From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: andrew@schwartzmeyer.com Newsgroups: gmane.emacs.bugs Subject: bug#32832: [PATCH] Fix 'provided-mode-derived-p' when the parent is an alias Date: Mon, 24 Sep 2018 21:09:39 -0700 Message-ID: <20180925040939.66376-1-andrew@schwartzmeyer.com> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Trace: blaine.gmane.org 1537848553 8778 195.159.176.226 (25 Sep 2018 04:09:13 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Tue, 25 Sep 2018 04:09:13 +0000 (UTC) To: 32832@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Tue Sep 25 06:09:08 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g4eeq-0002D6-Fa for geb-bug-gnu-emacs@m.gmane.org; Tue, 25 Sep 2018 06:09:08 +0200 Original-Received: from localhost ([::1]:50687 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4egx-0003kW-0g for geb-bug-gnu-emacs@m.gmane.org; Tue, 25 Sep 2018 00:11:19 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:45590) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4egj-0003j1-H7 for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:11:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g4egg-00066A-C4 for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:11:05 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:48435) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1g4egg-000661-63 for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:11:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1g4egf-0004Kz-RX for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:11:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: andrew@schwartzmeyer.com Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 25 Sep 2018 04:11:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 32832 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.153784861516577 (code B ref -1); Tue, 25 Sep 2018 04:11:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 25 Sep 2018 04:10:15 +0000 Original-Received: from localhost ([127.0.0.1]:52690 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g4efv-0004JJ-0N for submit@debbugs.gnu.org; Tue, 25 Sep 2018 00:10:15 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:35605) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1g4efs-0004J0-GJ for submit@debbugs.gnu.org; Tue, 25 Sep 2018 00:10:12 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g4efm-0005bZ-AN for submit@debbugs.gnu.org; Tue, 25 Sep 2018 00:10:07 -0400 Original-Received: from lists.gnu.org ([2001:4830:134:3::11]:58530) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1g4efl-0005bR-S1 for submit@debbugs.gnu.org; Tue, 25 Sep 2018 00:10:06 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:45206) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1g4efk-0002ae-Nj for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:10:05 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1g4efh-0005a9-JL for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:10:04 -0400 Original-Received: from mout01.posteo.de ([185.67.36.141]:37596) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1g4efh-0005ZN-Cb for bug-gnu-emacs@gnu.org; Tue, 25 Sep 2018 00:10:01 -0400 Original-Received: from submission (posteo.de [89.146.220.130]) by mout01.posteo.de (Postfix) with ESMTPS id CAB7121148 for ; Tue, 25 Sep 2018 06:09:58 +0200 (CEST) Original-Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 42K6zT40SRz6tm5 for ; Tue, 25 Sep 2018 06:09:57 +0200 (CEST) X-Mailer: git-send-email 2.19.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:150632 Archived-At: From: Andrew Schwartzmeyer Authors of Emacs packages often derive from an alias of a mode instead of the mode directly. This is especially the case when deriving from 'prog-mode' as it is relatively new. Unfortunately, using 'derived-mode-p' to check if some mode is derived from an alias of 'prog-mode' does not work as expected. The bug is that 'provided-mode-derived-p' should not only return non-nil when MODE is one of MODES, but also when MODE is an alias of one of MODES. * lisp/subr.el (provided-mode-derived-p): Return non-nil when MODE is an alias of any of MODES (Bug#32795). * test/lisp/subr-tests.el: Add tests for the above. --- lisp/subr.el | 9 +++++++-- test/lisp/subr-tests.el | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lisp/subr.el b/lisp/subr.el index 7582b6cdb..6c625b40d 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1919,9 +1919,14 @@ delay-mode-hooks (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= . +Non-nil even if MODE is derived from an alias of any of MODES. If you just want to check `major-mode', use `derived-mode-p'." - (while (and (not (memq mode modes)) - (setq mode (get mode 'derived-mode-parent)))) + (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 paren= t))))) mode) =20 (defun derived-mode-p (&rest modes) diff --git a/test/lisp/subr-tests.el b/test/lisp/subr-tests.el index 430d71903..a9f72c26d 100644 --- a/test/lisp/subr-tests.el +++ b/test/lisp/subr-tests.el @@ -62,6 +62,18 @@ (quote (0 font-lock-keyword-face)))))))) =20 +(ert-deftest provided-mode-derived-p () + ;; base case: `derived-mode' directly derives `prog-mode' + (should (progn + (define-derived-mode derived-mode prog-mode "test") + (provided-mode-derived-p 'derived-mode 'prog-mode))) + ;; edge case: `derived-mode' derives an alias of `prog-mode' + (should (progn + (defalias 'parent-mode + (if (fboundp 'prog-mode) 'prog-mode 'fundamental-mode)) + (define-derived-mode derived-mode parent-mode "test") + (provided-mode-derived-p 'derived-mode 'prog-mode)))) + (ert-deftest number-sequence-test () (should (=3D (length (number-sequence (1- most-positive-fixnum) most-positive-f= ixnum)) --=20 2.19.0