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

Я написал процессор аннотаций, который генерирует класс построителя для моих классов, помеченных @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 Проблема: https://youtrack.jetbrains.net/issue/KT-24591

1 Ответ

0 голосов
/ 01 июня 2018

Глядя на ваш проект 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 scope для kotlin-stdlib-jdk7 в annotations.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...