2012-04-06 3 views
2

Ich habe ein Modul für die BaseXJava interface, die ich in Clojure schreibe. Die Schnittstelle stellt eine Anzahl von Anmerkungen zur Verfügung, die verwendet werden können, um zu bestimmen, wie Methoden aufgerufen und optimiert werden; aber ich habe Probleme, diese eigentlich immer zu der generierten Klasse anhängen:Clojure: Annotationen an AOT-kompilierte Methoden anhängen

(ns net.dyfis.svnkit_wrapper.SvnWrapper 
    (:import (org.basex.query QueryModule 
          QueryModule$Requires 
          QueryModule$Permission 
          QueryModule$Deterministic)) 
    (:gen-class 
    :main false 
    :extends org.basex.query.QueryModule 
    :methods [ 
     ^{:static true} 
     [^{QueryModule$Requires QueryModule$Permission/NONE, 
     Deprecated {}} 
     cat [java.lang.String] java.lang.String] 

     ^{:static true} 
     [^{QueryModule$Deterministic {}, 
     QueryModule$Requires QueryModule$Permission/NONE} 
     catRev [java.lang.String int] java.lang.String]])) 

jedoch nur die Veraltete Anmerkung wird angebracht - die QueryModule$Requires und QueryModule$Deterministic Anmerkungen stillschweigend verworfen werden:

>>> cat 
public static java.lang.String net.dyfis.svnkit_wrapper.SvnWrapper.cat(java.lang.String) 
>>> cat.getAnnotations() 
array(java.lang.annotation.Annotation,[@java.lang.Deprecated()]) 

Dies geschieht mit Clojure 1.4.0-beta6, während Unterstützung für Annotationen in AOT-kompilierten Methoden von Clojure 1.2 erwartet wird. Dies ist vermutlich ein Nutzungsfehler - aber was soll ich anders machen?

Antwort

2

Außer Klassen in java.lang (wie Deprecated) müssen alle Klassennamen in gen-class Deklarationen vollständig qualifiziert sein. Also, sollten Sie den Code sein:

^{org.basex.query.QueryModule$Deterministic {}, 
    org.basex.query.QueryModule$Requires org.basex.query.QueryModule$Permission/NONE} 

Beachten Sie, dass die gleiche Einschränkung nicht in Annotations Metadaten auf/in deftype, defprotocol oder defrecord Formen gilt.

0

Verschieben der gen-class Definition aus der ns Erklärung erlaubt die import s anzuwenden:

(ns net.dyfis.svnkit_wrapper.SvnWrapper 
    (:import (org.basex.query QueryModule 
          QueryModule$Requires 
          QueryModule$Permission 
          QueryModule$Deterministic))) 

(gen-class 
    :name com.indeed.svnkit_wrapper.SvnWrapper 
    :main false 
    :extends org.basex.query.QueryModule 
    :methods [ 
    ^{:static true} 
    [^{QueryModule$Requires QueryModule$Permission/NONE, 
     Deprecated {}} 
    cat [java.lang.String] java.lang.String] 

    ^{:static true} 
    [^{QueryModule$Deterministic {}, 
     QueryModule$Requires QueryModule$Permission/NONE} 
    catRev [java.lang.String long] java.lang.String] 
    ])