Kotlin/KAPT Генерируемый класс Kotlin не распознается как член класса, но это происходит внутри методов

Я написал процессор аннотаций, который генерирует класс построителя для моих классов, помеченных @DataBuilder

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class DataBuilder

Мои классы, помеченные этой аннотацией, находятся в com.my.package.model пакет и сгенерированный класс компоновщика также находятся в одном пакете com.my.package.model но в сгенерированном каталоге конечно build/generated/source/kapt/debug/com/my/package/model/MyModelBuilder.ktЯ могу использовать эти сгенерированные классы хорошо внутри моих модельных классов (написано на Kotlin)

НО я НЕ могу использовать сгенерированный MyModelBuilder Класс Kotlin внутри класса Java в качестве члена класса

package com.my.package.home;
import com.my.package.model.MyModelBuilder;
public class Home {
    MyModelBuilder builder; // <=== AS recognizes the class, but I'm having an compilation issue
}

Android Studio распознает класс, но у меня проблема с компиляцией

com/my/package/home/Home.java:4: error: cannot find symbol
MyModelBuilder builder;
           ^
  symbol:   class MyModelBuilder
  location: class Home

это странно, потому что я могу использовать этот сгенерированный класс построителя только внутри методов, этот код прекрасно компилируется:

package com.my.package.home;
import com.my.package.model.MyModelBuilder;
public class Home {
    public void hello() {
        MyModelBuilder builder;
    }
}

Может ли кто-нибудь здесь помочь мне понять это поведение и как это исправить? Заранее спасибо!

ОБНОВИТЬ

Я только что создал этот репозиторий с необходимым кодом для репликации проблемы https://github.com/epool/HelloKapt

Проект работает нормально после клонирования и запуска, чтобы повторить проблему, удалите комментарий в этой строке https://github.com/epool/HelloKapt/blob/master/app/src/main/java/com/nearsoft/hellokapt/app/MainActivity.java#L13

Примечание. Если я преобразую свой класс MainActivity.java в Kotlin(MainActivity.kt), проблемы НЕ воспроизводятся и работают нормально, но я не хочу этого делать из-за некоторых ограничений проекта.

Kotlin Issue: https://youtrack.jetbrains.net/issue/KT-24591

1 ответ

Глядя на ваш проект Github, я замечаю, что вы не объявляете зависимость от kotlin-stdlib-jdk7 в app модуль. Когда я собираю модуль, компилятор выдает следующие предупреждения:

warning: unknown enum constant AnnotationTarget.CLASS
  reason: class file for kotlin.annotation.AnnotationTarget not found   
warning: unknown enum constant AnnotationRetention.SOURCE
  reason: class file for kotlin.annotation.AnnotationRetention not found    
warning: unknown enum constant AnnotationTarget.CLASS
  reason: class file for kotlin.annotation.AnnotationTarget not found   

поскольку kotlin-stdlib-jdk7 объявлен как implementation в annotations модуль, app Модуль не рассматривает это как транзитивную зависимость, что может быть причиной сбоя компиляции. Чтобы исправить это, вы, вероятно, должны объявить правильную зависимость в app модуль или хотя бы использовать apiElements сфера для kotlin-stdlib-jdk7 в annotations,

Тот факт, что среда IDE не уведомляет вас о сбое компиляции, может быть ошибкой инструментов, но определенно нет основной проблемы компилятора Kotlin.

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