ダガーは、他の注釈プロセッサによって生成されたクラスを見つけることができません

mallaudin:

私は私の以前のプロジェクトに書いていることをいくつかの定型的なコードを生成します(ちょうど楽しみのために)簡単な注釈プロセッサを書かれています。これは、実際のアクティビティクラスに注釈を収集することにより、以下のようなモジュールを生成します

@Module
abstract class ActivityInjectorModule {
  @ContributesAndroidInjector
  abstract fun providesMain2Activity(): Main2Activity

  @ContributesAndroidInjector
  abstract fun providesMainActivity(): MainActivity
}

私は短剣でそれを実行したときしかし、短剣は私の注釈プロセッサによって生成されたクラスを見つけることができないよう、クラスが生成され、生成されたディレクトリに存在しているが、私は私のソースコードではなく、コンパイルにそれを使用することができ、短剣は、次の例外を生成します。任意の専門家の提案?

error: cannot find symbol
@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, ActivityInjectorModule.class})
                                                                                                                       ^
  symbol: class ActivityInjectorModule

これは、メインのアプリケーションコンポーネントです。

@Singleton
@Component(
    modules = [
        AndroidInjectionModule::class,
        AppModule::class,
        ActivityInjectorModule::class
    ]
)
interface AppComponent : AndroidInjector<App> {


    @Component.Builder
    interface Builder {

        fun addContext(@BindsInstance ctx: Context): Builder

        fun build(): AppComponent
    }
}

ActivityInjectorModuleのクラスには、注釈プロセッサによって生成され、生成されたディレクトリに存在しています。

Applicationクラス

class App : DaggerApplication() {
    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().addContext(this).build()
    }
}

私は、生成されたクラスを自分で作成する場合はすべてが、完璧に動作します。どういうわけか、コンパイル時に、短剣は私の注釈プロセッサによって生成されたときに、クラスを見つけることができません。

ユーリークリコフの答えの後、

yurilyの答え

あなたは、生成されたファイルは、同じパッケージ内にあるだけでなく、完全修飾名で参照見ることができます。まだ短剣レポートエラー。

ここにあるリンク誰かが実験したい場合はgithubのリポジトリには、

esentsov:

解決:

  1. Javaコードを生成します。Kapt 複数のラウンドをサポートしていません
  2. 可能な限り早いラウンドで生成されたファイルを書き込みます。

説明:

Javac注釈プロセッサは、ラウンドを使用する代わりに、プロセッサの順序を定義します。だから、通常は簡略化されたアルゴリズムは、そのようなものです:

  1. すべてのJavaソースを収集
  2. すべての注釈プロセッサを実行します。任意の注釈プロセッサを使用して新しいファイルを生成することができますファイラーを
  3. 生成されたすべてのファイルを収集し、いずれかがある場合は、再びステップ2を実行します。
  4. 生成されたファイルがない場合は、1以上のラウンドを実行RoundEnvironment.processingOver()リターンをtrue、このシグナル伝達することは、最後のラウンドです。

ここでは、プロセスのかなり良い説明があります

今について少しkaptKapt 用途javacは注釈プロセッサを実行します。それを可能にするために、それがために最初kotlin complilerを実行するJavaスタブファイルを生成して実行しjavac、それらに。現在、kapt 複数のラウンドをサポートしていません、それは注釈プロセッサによって生成されたクラスkotlinのJavaスタブを生成しない意味。注:javacまだ複数のラウンドを使用して、それだけで生成されたkotlinソースを拾うことができません。

だから、あなたの質問に戻って。一つの可能なオプションは、それがているように、別のモジュールにあなたの生成されたクラスを移動させることで、ここで説明しました

しかし、最も簡単なオプションは直接Javaコードを生成することであり、あなたの生成されたJavaクラスは、によってピックアップされるjavac短剣がそれらを処理する注釈処理の第二ラウンドを立ち上げ、自動的に。

ちょうど少数のより多くの注意事項:

  • ときにコードを生成しませんRoundEnvironment.processingOver() == true、それは別のラウンドをトリガしません。あなたは注釈を参照してください同じラウンド中にそれを生成します。
  • 注釈プロセッサに生成されたコードが表示されるように、使用してそれを書くファイラーを

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229608&siteId=1