Changeset 15086


Ignore:
Timestamp:
06/17/17 06:52:37 (6 years ago)
Author:
Mark Evenson
Message:

jss: new macro WITH-CLASS-LOOKUP-DISAMBIGUATED
(Alan Ruttenberg)

(with-class-lookup-disambiguated (lang.object) (find-java-class 'object))

-> success (otherwise error: ambiguous)

From <https://github.com/armedbear/abcl/pull/57>.

Merges
<https://github.com/armedbear/abcl/pull/57/commits/5103d57822691d74c66b80c754f8438df6806bba>.

Location:
trunk/abcl/contrib/jss
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/contrib/jss/invoke.lisp

    r15065 r15086  
    246246                 ,@body)))))))
    247247
     248(defvar *class-lookup-overrides*)
     249
     250(defmacro with-class-lookup-disambiguated (overrides &body body)
     251  "Suppose you have code that references class using the symbol 'object, and this is ambiguous. E.g. in my system java.lang.Object, org.omg.CORBA.Object. Use (with-class-lookup-disambiguated (lang.object) ...). Within dynamic scope, find-java-class first sees if any of these match, and if so uses them to lookup the class."
     252  `(let ((*class-lookup-overrides* ',overrides))
     253     ,@body))
     254
     255(defun maybe-found-in-overridden (name)
     256  (when (boundp '*class-lookup-overrides*)
     257      (let ((found (find-if (lambda(el) (#"matches" (string el) (concatenate 'string "(?i).*" (string name) "$")))
     258          *class-lookup-overrides*)))
     259  (if found
     260      (let ((*class-lookup-overrides* nil))
     261        (lookup-class-name found))))))
     262
     263
    248264(defun lookup-class-name (name &key
    249265                                 (table *class-name-to-full-case-insensitive*)
    250266                                 (muffle-warning nil)
    251267                                 (return-ambiguous nil))
     268  (let ((overridden (maybe-found-in-overridden name)))
     269    (when overridden (return-from lookup-class-name overridden)))
    252270  (setq name (string name))
    253271  (let* (;; cant (last-name-pattern (#"compile" '|java.util.regex.Pattern| ".*?([^.]*)$"))
  • trunk/abcl/contrib/jss/t/jss-tests.lisp

    r15066 r15086  
    11(in-package :cl-user)
    22
    3 (prove:plan 6)
     3(prove:plan 8)
    44
    55(prove:is
     
    2323           (find "size" (#"getMethods" (find-java-class "java.util.Collections$UnmodifiableMap"))
    2424                 :test 'string-equal :key #"getName"))
    25     (#"toString" (java::jmethod "java.util.Collections$UnmodifiableMap" "size" )))
     25    (#"toString" (java::jmethod "java.util.Collections$UnmodifiableMap" "size" )))
     26
     27(prove:is
     28 (jss::with-class-lookup-disambiguated (lang.object) (find-java-class 'object))
     29 (find-java-class 'java.lang.object))
     30
     31;; Object is ambiguous in default java
     32(prove:is-error
     33 (find-java-class 'object)
     34 'simple-error)
    2635
    2736;; test that optimized jss is much faster than unoptimized
Note: See TracChangeset for help on using the changeset viewer.