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), проблемы НЕ воспроизводятся и работают нормально, но я пока не хочу этого делать из-за некоторых ограничений проекта.

Проблема с Котлином: https://youtrack.jetbrains.net/issue/KT-24591


person epool    schedule 23.05.2018    source источник
comment
Где генерируется источник, добавлен ли каталог в набор источников?   -  person EpicPandaForce    schedule 23.05.2018
comment
@EpicPandaForce, сгенерированный источник находится в ...build/generated/source/kapt/debug/..., это тот же каталог, который используется кинжалом и другими обработчиками аннотаций, моя Android Studio распознает сгенерированный класс, и я могу использовать класс внутри метода, но не как член класса.   -  person epool    schedule 23.05.2018


Ответы (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.

person Egor    schedule 01.06.2018
comment
На самом деле, я создал проект с поддержкой Kotlin из Android Studio, возможно, AS не добавляет его по умолчанию, и это может быть разрешено в новых плагинах kotlin gradle, но не уверен. Я просто выдвинул изменение для добавления зависимости времени выполнения kotlin, что не помогло. В любом случае хороший улов. - person epool; 02.06.2018