Филе котлинского поэта не создается

Я попытался создать класс с обработчиком аннотаций и Kotlin Poet. Это мой код:

@AutoService(Processor::class)
class TailProcessor : AbstractProcessor() {

    override fun process(elementTypeSet: MutableSet<out TypeElement>?, roundEnvironment: RoundEnvironment?): Boolean {
        roundEnvironment?.getElementsAnnotatedWith(Tail::class.java)?.forEach {
            if (it.javaClass.kotlin.isData) {
                print("You are doing it right")
                val className = it.simpleName.toString()
                val pack = processingEnv.elementUtils.getPackageOf(it).toString()
                val variables = ElementFilter.fieldsIn(elementTypeSet)
                startClassGeneration(className, pack, variables)
            } else {
                return false
            }
        }
        return false
    }

    override fun getSupportedSourceVersion(): SourceVersion = SourceVersion.latest()

    override fun getSupportedAnnotationTypes(): MutableSet<String> = mutableSetOf(Tail::class.java.name)

    private fun startClassGeneration(
        className: String,
        pack: String,
        variables: MutableSet<VariableElement>
    ) {
        val fileName = "Tail$className"
        val stringToBePrinted = generateStringFromIncommingValues(variables)
        val printFunction = FunSpec.builder("print").addCode("print($stringToBePrinted)").build()
        val generatedClass = TypeSpec.objectBuilder(fileName).addFunction(printFunction).build()
        val file = FileSpec.builder(pack, fileName).addType(generatedClass).build()
        val kaptKotlinGeneratedDir = processingEnv.options[KOTLIN_DIRECTORY_NAME]
        file.writeTo(File(kaptKotlinGeneratedDir, "$fileName.kt"))
    }

    private fun generateStringFromIncommingValues(variables: MutableSet<VariableElement>): Any {
        val stringBuilder = StringBuilder()
        variables.forEach {
            if (it.constantValue == null) {
                stringBuilder.append("null\n ")
            } else {
                stringBuilder.append("${it.constantValue}\n")
            }
        }
        return stringBuilder.toString()
    }

    companion object {
        const val KOTLIN_DIRECTORY_NAME = "sxhardha.tail"
    }
}

Проблема, каталог и файл не создаются. Я пытался перестроить, аннулировать кеш + перезапуск, очистить, но ни один из них не работает. Сборка проходит успешно, без ошибок, но я не вижу изменений. Вы можете проверить, что не так?


person coroutineDispatcher    schedule 27.05.2019    source источник


Ответы (1)


Я действительно нашел проблему. Я неправильно проверял, является ли этот класс data классом или нет, и условие никогда не выполнялось.

Вместо того:

it.javaClass.kotlin.isData

Должно было:

it.kotlinMetadata as KotlinClassMetadata).data.classProto.isDataClass

Но этого можно добиться только с помощью этой библиотеки, здесь.

person coroutineDispatcher    schedule 29.05.2019