Генератор субкомпонентов Dagger 2.10 - Проверка инжектора не удалась

Я пытаюсь создать процессор аннотаций, который будет обрабатывать мои MVP-представления (фрагменты) для автоматически сгенерированных субкомпонентов (аналогично https://github.com/lukaspili/Auto-Dagger2, но для новых инжекторов Dagger 2.10 для Android)

До сих пор я был в состоянии генерировать соответствующие файлы, но при компиляции сгенерированных компонентов появляется странное сообщение об ошибке

Error:(22, 58) error: @dagger.android.support.FragmentKey methods should bind dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>, not dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>. See google.github.io/dagger/android

Структура модуля Factory и файлов Subcomponent должна быть правильной, потому что, как только я копирую и вставляю сгенерированные классы и создаю обычные классы (и модуль Factory, и Subcomponent) и использую реальные классы вместо сгенерированных, сообщение больше не отображается и компиляция удалась

Кажется, проблема заключается в AndroidMapKeyValidator ( ссылка), где !MoreTypes.equivalence().equivalent(returnType, intendedReturnType) вызов, очевидно, не удается, но у меня нет большого опыта отладки процессоров аннотаций, поэтому я не знаю, почему именно...

Может кто-нибудь помочь, где искать проблему? Спасибо

FYI: MyFragment действительно распространяется android.support.v4.app.Fragment


Мои файлы:

Созданная Фабрика @Module public interface BuildersModule { @Binds @IntoMap @FragmentKey(MyFragment.class) abstract AndroidInjector.Factory<? extends Fragment> factory(MySubcomponent.Builder builder); }

Сгенерированный подкомпонент @Subcomponent(modules = MyModule.class) public interface MySubcomponent extends AndroidInjector<MyFragment> { MyPresenter presenter(); @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<MyFragment> {} }

1 ответ

Решение

Если кто-то заинтересован в решении:

Я узнал, что по какой-то причине ClassType -сравниваются во время компиляции проекта не совпадают при проверке сгенерированного метода.

И эти ссылки, несмотря на то, что они указывают на один и тот же класс, проверяются на равенство в auto-common библиотека в EqualVisitor.visitDeclared метод. Видимо, это может быть ошибка в auto-common, потому что элементы в visitDeclared сравниваются по ссылке на объект, но не по типу.

Поэтому обходной путь здесь заключается в использовании локальной фиксированной копии auto-common библиотека и исключить все зависимости исходной библиотеки.

//TODO think if this is the correct solution to cast both elements
//return aElement.equals(bElement)
return ((TypeElement) aElement).getQualifiedName().equals(((TypeElement) bElement).getQualifiedName())
       && equal(a.getEnclosingType(), b.getEnclosingType(), newVisiting)
       && equalLists(a.getTypeArguments(), b.getTypeArguments(), newVisiting);


Я все еще должен проверить, почему эти ссылки не совпадают, и я должен подумать, как правильно установить проверку на равенство в auto-common (Я использую только быстрое исправление), прежде чем подавать проблему в auto-common Сделки РЕПО.

Другие вопросы по тегам