]> git.eshelyaron.com Git - emacs.git/commitdiff
Print know function types in C-h f
authorAndrea Corallo <akrl@sdf.org>
Tue, 30 May 2023 13:30:11 +0000 (15:30 +0200)
committerAndrea Corallo <akrl@sdf.org>
Sun, 4 Jun 2023 11:06:39 +0000 (13:06 +0200)
* lisp/emacs-lisp/comp.el (comp-known-type-specifiers): Improve comment.
(comp-funciton-type-spec): New function.
* lisp/help-fns.el (help-fns--signature): Update to make use of
`comp-funciton-type-spec'.

lisp/emacs-lisp/comp.el
lisp/help-fns.el

index da551ae2fd90c9567a8b8cf6ad7caccba54a0a2f..86707dd3516a164c2bdd8c628b45aa5cce068a60 100644 (file)
@@ -277,10 +277,10 @@ Useful to hook into pass checkers.")
 ;; FIXME this probably should not be here but... good for now.
 (defconst comp-known-type-specifiers
   `(
-    ;; Functions we can trust not to be or if redefined should expose
-    ;; the same type.  Vast majority of these is either pure or
-    ;; primitive, the original list is the union of pure +
-    ;; side-effect-free-fns + side-effect-and-error-free-fns:
+    ;; Functions we can trust not to be redefined or if redefined
+    ;; should expose the same type.  The vast majority of these is
+    ;; either pure or primitive, the original list is the union of
+    ;; pure + side-effect-free-fns + side-effect-and-error-free-fns:
     (% (function ((or number marker) (or number marker)) number))
     (* (function (&rest (or number marker)) number))
     (+ (function (&rest (or number marker)) number))
@@ -4447,6 +4447,26 @@ of (commands) to run simultaneously."
             (delete-directory subdir))))))
   (message "Cache cleared"))
 
+;;;###autoload
+(defun comp-funciton-type-spec (function)
+  "Given FUNCTION gives its type specifier.
+Return a cons with its car being the function specifier and its
+cdr being a symbol.
+
+If the symbol is `inferred' the type specifier is automatically
+inferred from the code itself by the native compiler, if it is
+`know' the type specifier comes from
+`comp-known-type-specifiers'."
+  (let ((kind 'know)
+        type-spec )
+    (when-let ((res (gethash function comp-known-func-cstr-h)))
+      (setf type-spec (comp-cstr-to-type-spec res)))
+    (unless type-spec
+      (setf kind 'inferred
+            type-spec (subr-type (symbol-function function))))
+    (when type-spec
+        (cons type-spec kind))))
+
 (provide 'comp)
 
 ;; LocalWords: limplified limplification limplify Limple LIMPLE libgccjit elc eln
index c4e09e48bea46c34ad5433a2649b124fcb37aaba..dcf265ea17019c563686086e889f9754c9b23914 100644 (file)
@@ -711,10 +711,14 @@ the C sources, too."
           (unless (and (symbolp function)
                        (get function 'reader-construct))
             (insert high-usage "\n")
-            (when (and (featurep 'native-compile)
-                       (subr-native-elisp-p (symbol-function function))
-                       (subr-type (symbol-function function)))
-              (insert (format "\nInferred type: %s\n" (subr-type (symbol-function function))))))
+            (when-let* ((res (comp-funciton-type-spec function))
+                        (type-spec (car res))
+                        (kind (cdr res)))
+              (insert (format
+                       (if (eq kind 'inferred)
+                           "\nInferred type: %s\n"
+                         "\nType: %s\n")
+                       type-spec))))
           (fill-region fill-begin (point))
           high-doc)))))