Процессор аннотаций: как узнать, помечен ли класс Kotlin «внутренним» модификатором видимости из Element - PullRequest
0 голосов
/ 29 октября 2018

Я использую Автосервис для обработки некоторых аннотаций, но я не могу определить, имеет ли класс Kotlin «внутренний» модификатор видимости из API процессора аннотаций.

Я использую KAPT и Kotlin в процессоре. Зависимости:

    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: "1.3.0-rc-190"
    implementation files("${System.properties['java.home']}/../lib/tools.jar")
    implementation 'com.squareup:kotlinpoet:1.0.0-RC2'
    implementation "com.google.auto.service:auto-service:1.0-rc4"
    kapt "com.google.auto.service:auto-service:1.0-rc4"

Образец класса:

@MyAnnotation
internal class Car

Я получил TypeElement этого внутри метода процесса

override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(MyAnnotation::class.java).forEach { classElement ->
            if (classElement.kind != ElementKind.CLASS) {
                error(...)
                return true
            }
            classElement as TypeElement

Но я не знаю, как определить, имеет ли класс модификатор «internal».

Если я сделаю: classElement.modifiers Я получу это: enter image description here

Есть идеи, как определить «внутренний» модификатор?

1 Ответ

0 голосов
/ 29 октября 2018

Когда ваш код Kotlin преобразован в форму .class, модификатор internal отсутствует. Но когда вы декомпилируете свои .class файлы кода Kotlin, вы увидите, что есть аннотация @Metadata.

Эта аннотация метаданных дает некоторую информацию о объявлениях Kotlin в двоичном виде. Вы можете использовать Kotlinx-метаданные для чтения и изменения метаданных .class файлов.

Итак, вам нужно получить аннотацию @Metadata от classElement, а затем использовать флаги из kotlinx-metadata, чтобы узнать, имеет ли она внутренний модификатор или нет:

например:

override fun visitFunction(flags: Flags, name: String): KmFunctionVisitor? {
    if (Flag.IS_INTERNAL(flags)) {
        println("function $name is internal")
    }
    ...
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...