From: Stephen Gildea <stepheng+emacs@gildea.com>
To: emacs-devel@gnu.org
Subject: Re: a property "definition-type" would help find macro-defined tests
Date: Thu, 09 Jan 2025 20:47:28 -0800 [thread overview]
Message-ID: <409838.1736484448@pental.sg.gildea.net> (raw)
In-Reply-To: Message from eliz@gnu.org of 9 Jan 2025 08:57:06 +0200 <86frls3265.fsf@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 577 bytes --]
I have made the changes requested and one other:
- added a NEWS entry
- find-function-search-for-symbol doc string additions
trimmed of detail that is available from the manual.
- in the manual, added an index entry for the new property,
definition-type, and for all the existing properties that
did not have index entries (which was most of them).
- in the code example, put each top-level form in @group.
- new in this version of the patch: added a cross reference
from where Coding Conventions discusses how to write macros
that define functions.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: new property definition-type, version 2 --]
[-- Type: text/x-diff, Size: 7033 bytes --]
diff --git a/etc/NEWS b/etc/NEWS
index 37e5669b139..50928cd9264 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1137,6 +1137,13 @@ It offers a more concise way to create a completion table with metadata.
+++
** 'all-completions' and 'unintern' no longer support old calling conventions.
++++
+** New property 'definition-type' used by find-function and friends.
+Macros that define an object in a way makes the object's name and the
+macro call site defining the object hard to associate can put the
+property 'definition-type' on the object's name to provide instructions
+for finding the definition.
+
\f
* Changes in Emacs 31.1 on Non-Free Operating Systems
diff --git a/lisp/emacs-lisp/find-func.el b/lisp/emacs-lisp/find-func.el
index 0837b37023e..643b6aba2a6 100644
--- a/lisp/emacs-lisp/find-func.el
+++ b/lisp/emacs-lisp/find-func.el
@@ -400,9 +400,12 @@ find-function-search-for-symbol
Visit the library in a buffer, and return a cons cell (BUFFER . POSITION),
or just (BUFFER . nil) if the definition can't be found in the file.
-If TYPE is nil, look for a function definition.
-Otherwise, TYPE specifies the kind of definition,
-and it is interpreted via `find-function-regexp-alist'.
+If TYPE is nil, look for a function definition,
+otherwise, TYPE specifies the kind of definition.
+If SYMBOL has a property `definition-type',
+the property value is used instead of TYPE.
+TYPE is interpreted via `find-function-regexp-alist'.
+
The search is done in the source for library LIBRARY."
(if (null library)
(error "Don't know where `%s' is defined" symbol))
@@ -410,6 +413,8 @@ find-function-search-for-symbol
;; that defines something else.
(while (and (symbolp symbol) (get symbol 'definition-name))
(setq symbol (get symbol 'definition-name)))
+ (setq type (or (get symbol 'definition-type)
+ type))
(if (string-match "\\`src/\\(.*\\.\\(c\\|m\\)\\)\\'" library)
(find-function-C-source symbol (match-string 1 library) type)
(when (string-match "\\.el\\(c\\)\\'" library)
diff --git a/doc/lispref/symbols.texi b/doc/lispref/symbols.texi
index 24b4e892024..7990e2a8f75 100644
--- a/doc/lispref/symbols.texi
+++ b/doc/lispref/symbols.texi
@@ -510,35 +510,54 @@ Standard Properties
@table @code
@item :advertised-binding
+@cindex @code{:advertised-binding} property
This property value specifies the preferred key binding, when showing
documentation, for the named function. @xref{Keys in Documentation}.
@item char-table-extra-slots
+@cindex @code{char-table-extra-slots} property
The value, if non-@code{nil}, specifies the number of extra slots in
the named char-table type. @xref{Char-Tables}.
@item customized-face
+@cindex @code{customized-face} property
@itemx face-defface-spec
+@cindex @code{face-defface-spec} property
@itemx saved-face
+@cindex @code{saved-face} property
@itemx theme-face
+@cindex @code{theme-face} property
These properties are used to record a face's standard, saved,
customized, and themed face specs. Do not set them directly; they are
managed by @code{defface} and related functions. @xref{Defining
Faces}.
@item customized-value
+@cindex @code{customized-value} property
@itemx saved-value
+@cindex @code{saved-value} property
@itemx standard-value
+@cindex @code{standard-value} property
@itemx theme-value
+@cindex @code{theme-value} property
These properties are used to record a customizable variable's standard
value, saved value, customized-but-unsaved value, and themed values.
Do not set them directly; they are managed by @code{defcustom} and
related functions. @xref{Variable Definitions}.
@item definition-name
-This property is used to find the definition of a symbol in the source
-code, when it might be hard to find the definition by textual search
-of the source file. For example, a @code{define-derived-mode}
+@cindex @code{definition-name} property
+@itemx definition-type
+@cindex @code{definition-type} property
+These properties help find the definition of a symbol in the source
+code when it might be hard to find the definition by textual search
+of the source file.
+The Emacs Help commands such as @kbd{C-h f} (@pxref{Help,,,
+emacs, The GNU Emacs Manual}) use these properties to show the definition
+of a symbol via a button in the @file{*Help*} buffer where the
+symbol's documentation is shown.
+
+For example, a @code{define-derived-mode}
(@pxref{Derived Modes}) might define a mode-specific function or a
variable implicitly; or your Lisp program might generate a run-time
call to @code{defun} to define a function (@pxref{Defining
@@ -547,43 +566,101 @@ Standard Properties
be found by textual search and whose code defines the original symbol.
In the example with @code{define-derived-mode}, the value of this
property of the functions and variables it defines should be the mode
-symbol. The Emacs Help commands such as @kbd{C-h f} (@pxref{Help,,,
-emacs, The GNU Emacs Manual}) use this property to show the definition
-of a symbol via a button in the @file{*Help*} buffer where the
-symbol's documentation is shown.
+symbol.
+
+In some cases, the definition cannot be found by looking for the
+definition of another symbol. For example, a test file might use a
+macro to generate calls to @code{ert-deftest}
+(@pxref{,,,ert, ERT: Emacs Lisp Regression Testing}) where the code
+is boiler plate and only varying data need to be passed in.
+In such cases, the @code{definition-type} property of the symbol can
+be a symbol that has an entry in @code{find-function-regexp-alist}
+telling how to find the definition of symbols of this type.
+
+In the example of a macro defining calls to @code{ert-deftest},
+the macro could put the property @code{definition-type} on each
+test defined. The file defining the macro would also define a
+definition-finding function or regexp and add it to
+@code{find-function-regexp-alist} after that variable is loaded.
+Here is an example using a function to find the definition:
+
+@example
+@group
+(defmacro define-foo-test (data)
+ "Define a test of the foo system using DATA."
+ (declare (debug (&rest sexp)))
+ (let ((test-name (intern (concat ...))))
+ `(progn
+ (put ',test-name 'definition-type 'foo-test-type)
+ (ert-deftest ,test-name ()
+ ,(concat "Test foo with " ...)
+ ...))))
+@end group
+@end example
+
+@example
+@group
+(defun foo-find-test-def-function (test-name)
+ "Search for the `define-foo-test' call defining TEST-NAME.
+Return non-nil if the definition is found."
+ (save-match-data
+ (let ((regexp ...))
+ (save-restriction
+ (widen)
+ (goto-char (point-min))
+ (re-search-forward regexp nil t)))))
+@end group
+@end example
+
+@example
+@group
+(with-eval-after-load "find-func"
+ (add-to-list
+ 'find-function-regexp-alist
+ '(foo-test-type . foo-find-test-def-function)))
+@end group
+@end example
@item disabled
+@cindex @code{disabled} property
If the value is non-@code{nil}, the named function is disabled
next prev parent reply other threads:[~2025-01-10 4:47 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-21 16:53 a property "definition-type" would help find macro-defined tests Stephen Gildea
2024-12-22 17:12 ` Richard Lawrence
2025-01-07 22:13 ` Stephen Gildea
2025-01-08 12:31 ` Eli Zaretskii
2025-01-08 17:44 ` Stephen Gildea
2025-01-09 6:57 ` Eli Zaretskii
2025-01-10 4:47 ` Stephen Gildea [this message]
2025-01-10 7:08 ` Eli Zaretskii
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=409838.1736484448@pental.sg.gildea.net \
--to=stepheng+emacs@gildea.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).