2017-10-11 8 views
2

私は、Android Databinding Observableオブジェクトを生成する注釈プロセッサを作成しています。この考え方は、Realmとデータバインディングライブラリの間に互換性のシムを提供することです。生成されたクラスが別の注釈プロセッサによって消費される

サンプル出力:

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

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

問題はデータバインディングのアノテーションプロセッサは私の注釈プロセッサ(BR.nameが使用できなくさせる)によって生成されたクラスを処理しませんです。

私は、データバインディング注釈プロセッサが後でラウンドで新しく生成されたクラスを取り上げることを望んでいましたが、これは当てはまりません。

答えて

0

結局のところ、私は間違っていくつかのことをしていた。

  1. 私はプロセスにしようとしていた私の注釈がするまで処理されてからの私の注釈付きのクラスの処理を引き起こしBR.classを参照してBR.classが生成された後。これは、私の注釈プロセッサがアンドロイドのデータバインディングプロセッサの後でラウンドで実行されていた。
  2. アンドロイドデータバインディングプロセッサは、最初のラウンドでBR.classの値のみを収集します。後のラウンドで生成されたファイルはすべて無視されます。これは、ファイルの生成後にデータバインディング注釈プロセッサが実行されていても、BRクラスが更新されていないことを意味します。
  3. アンドロイドデータバインディングプロセッサは、最初のラウンドで実行されます。これにより、他の注釈プロセッサによって生成されるクラスの消費を効果的に排除します。 (2)を参照してください

私の解決策は、@Bindableアノテーションを含むインターフェイスを生成するgradleプラグインを構築することです。これらのファイルは、コンパイラが実行される前に生成され、アノテーション処理の第1ラウンドに存在することを保証します。その時点で、私の注釈プロセッサは、上記のようにファイルを生成することができます。

関連する問題