2017-10-11 3 views
2

J'écris un processeur d'annotation qui génère des objets Android Databinding Observable. L'idée est de fournir un shim de compatibilité entre les bibliothèques Realm et de liaison de données.Classe générée par un autre processeur d'annotation

Exemple de sortie:

public class ObservablePerson extends BaseObservable { 
    @Bindable 
    public String getName() { 
     return getValue(BR.name); 
    } 

    @Bindable 
    public void setName(String name) { 
     setValue(BR.name, name); 
    } 
} 

Le problème est le processeur d'annotation de liaison de données ne traite pas les classes générées par mon processeur d'annotation (causant BR.name pas disponible).

J'avais espéré que le processeur d'annotation de liaison de données récupèrerait les classes nouvellement générées dans un cycle ultérieur, mais cela ne semble pas être le cas.

Répondre

0

Comme il se trouve, je faisais quelques mauvaises choses:

  1. Mon annotation que je tentais de processus faisait référence à la BR.class, qui a causé le traitement de mes classes annotées d'être traitées avant après BR.class a été généré. Cela a provoqué l'exécution de mon processeur d'annotation dans la ronde après le processeur de liaison de données android.
  2. Le processeur de liaison de données android ne collecte que les valeurs de BR.class au premier tour. Tous les fichiers générés dans les tours suivants sont ignorés. Cela signifie que même si le processeur d'annotation de liaison de données était en cours d'exécution après la génération de mes fichiers, la classe BR n'était pas mise à jour.
  3. Le processeur de liaison de données android s'exécute au premier tour. Cela empêche effectivement les classes consommatrices générées par d'autres processeurs d'annotation. Voir (2)

Ma solution est de construire un greffon gradle qui va générer une interface contenant les annotations @Bindable. Ces fichiers sont générés avant l'exécution du compilateur, garantissant qu'ils sont présents pour le premier cycle de traitement des annotations. À ce stade, mon processeur d'annotation peut générer les fichiers comme décrit ci-dessus.