branch: externals/compat
commit e53184c187631dcd2e784dbd4db541c63f028832
Author: Daniel Mendler <m...@daniel-mendler.de>
Commit: Daniel Mendler <m...@daniel-mendler.de>

    compat-macs: Strict checking of :explicit
---
 compat-26.el    | 16 +---------------
 compat-27.el    | 18 ++++++++++++++++--
 compat-macs.el  | 12 ++++++++----
 compat-tests.el |  6 ++++--
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/compat-26.el b/compat-26.el
index a06229d573..ce23d9ca80 100644
--- a/compat-26.el
+++ b/compat-26.el
@@ -101,7 +101,7 @@ If you just want to check `major-mode', use 
`derived-mode-p'."
 
 (compat-defun alist-get (key alist &optional default remove testfn) ;; 
<compat-tests:alist-get>
   "Handle optional argument TESTFN."
-  :explicit t
+  :explicit "25.1"
   (ignore remove)
   (let ((x (if (not testfn)
                (assq key alist)
@@ -358,20 +358,6 @@ The returned file name can be used directly as argument of
 `process-file', `start-file-process', or `shell-command'."
   (or (file-remote-p file 'localname) file))
 
-(compat-defun file-name-quoted-p (name &optional top) ;; 
<compat-tests:file-name-quoted-p>
-  "Handle optional argument TOP."
-  :explicit t
-  (let ((file-name-handler-alist (unless top file-name-handler-alist)))
-    (string-prefix-p "/:" (file-local-name name))))
-
-(compat-defun file-name-quote (name &optional top) ;; 
<compat-tests:file-name-quote>
-  "Handle optional argument TOP."
-  :explicit t
-  (let ((file-name-handler-alist (unless top file-name-handler-alist)))
-    (if (string-prefix-p "/:" (file-local-name name))
-        name
-      (concat (file-remote-p name) "/:" (file-local-name name)))))
-
 (compat-defun temporary-file-directory () ;; 
<compat-tests:temporary-file-directory>
   "The directory for writing temporary files.
 In case of a remote `default-directory', this is a directory for
diff --git a/compat-27.el b/compat-27.el
index ee7f89ec79..eebd951fb0 100644
--- a/compat-27.el
+++ b/compat-27.el
@@ -211,7 +211,7 @@ return nil."
 
 (compat-defun assoc-delete-all (key alist &optional test) ;; 
<compat-tests:assoc-delete-all>
   "Handle optional argument TEST."
-  :explicit t
+  :explicit "26.2"
   (unless test (setq test #'equal))
   (while (and (consp (car alist))
               (funcall test (caar alist) key))
@@ -306,7 +306,7 @@ the minibuffer was activated, and execute the forms."
 (compat-defun image--set-property (image property value) ;; 
<compat-tests:image-property>
   "Set PROPERTY in IMAGE to VALUE.
 Internal use only."
-  :explicit t
+  :explicit "26.1"
   :feature image
   (if (null value)
       (while (cdr image)
@@ -327,6 +327,20 @@ Internal use only."
 
 ;;;; Defined in files.el
 
+(compat-defun file-name-quoted-p (name &optional top) ;; 
<compat-tests:file-name-quoted-p>
+  "Handle optional argument TOP."
+  :explicit "26.1"
+  (let ((file-name-handler-alist (unless top file-name-handler-alist)))
+    (string-prefix-p "/:" (file-local-name name))))
+
+(compat-defun file-name-quote (name &optional top) ;; 
<compat-tests:file-name-quote>
+  "Handle optional argument TOP."
+  :explicit "26.1"
+  (let ((file-name-handler-alist (unless top file-name-handler-alist)))
+    (if (string-prefix-p "/:" (file-local-name name))
+        name
+      (concat (file-remote-p name) "/:" (file-local-name name)))))
+
 (compat-defun file-size-human-readable (file-size &optional flavor space unit) 
;; <compat-tests:file-size-human-readable>
   "Handle the optional arguments SPACE and UNIT.
 
diff --git a/compat-macs.el b/compat-macs.el
index bf836cd54d..40c4f7c740 100644
--- a/compat-macs.el
+++ b/compat-macs.el
@@ -105,12 +105,14 @@ a plist of predicates for arguments which are passed to 
FUN."
 (defun compat--guard-defun (type name arglist docstring rest)
   "Define function NAME of TYPE with ARGLIST and DOCSTRING.
 REST are attributes and the function BODY."
-  (compat--guard rest `(:explicit booleanp
+  (compat--guard rest `(:explicit ,(lambda (x) (or (booleanp x) 
(version-to-list x)))
                         :obsolete ,(lambda (x) (or (booleanp x) (stringp x)))
                         :body t)
     (lambda (explicit obsolete body)
-      (compat--strict (or explicit (not (fboundp name)))
-                      "Non-explicit %s %s already defined" type name)
+      (when (stringp explicit)
+        (setq explicit (version<= explicit emacs-version)))
+      (compat--strict (eq explicit (fboundp name))
+                      "Wrong :explicit flag for %s %s" type name)
       ;; Remove unsupported declares.  It might be possible to set these
       ;; properties otherwise.  That should be looked into and implemented
       ;; if it is the case.
@@ -198,7 +200,9 @@ specify the conditions under which the definition is 
generated.
   invocation via `compat-call'.  :explicit should be used for
   functions which extend already existing functions, e.g.,
   functions which changed their calling convention or their
-  behavior.
+  behavior.  The value can also be a version string, which
+  specifies for which Emacs version and newer an explicit
+  definition will be created.
 
 - :obsolete :: Mark the function as obsolete if t, can be a
   string describing the obsoletion.
diff --git a/compat-tests.el b/compat-tests.el
index 74e5beca28..58aa635dfa 100644
--- a/compat-tests.el
+++ b/compat-tests.el
@@ -1564,7 +1564,8 @@
   (should-equal ":/bar/foo" (file-local-name "/ssh:::/bar/foo")))
 
 (ert-deftest file-name-quoted-p ()
-  ;; TODO test TOP argument
+  (should-not (compat-call file-name-quoted-p "" t)) ;; top argument
+  (should (compat-call file-name-quoted-p "/:" t)) ;; top argument
   (should-not (file-name-quoted-p ""))
   (should (file-name-quoted-p "/:"))
   (should-not (file-name-quoted-p "//:"))
@@ -1578,7 +1579,8 @@
     (should-not (file-name-quoted-p "/ssh:/:a"))))
 
 (ert-deftest file-name-quote ()
-  ;; TODO test TOP argument
+  (should-equal "/:" (compat-call file-name-quote "" t)) ;; top argument
+  (should-equal "/::"(compat-call file-name-quote  ":" t)) ;; top argument
   (should-equal "/:" (file-name-quote ""))
   (should-equal "/::"(file-name-quote  ":"))
   (should-equal "/:/" (file-name-quote "/"))

Reply via email to