Получить Kotlin Тип свойства из Kotlin psi API - PullRequest
3 голосов
/ 26 мая 2020

Я пытаюсь создать новое правило для проекта детект . Для этого мне необходимо знать точный тип свойства Kotlin. Например, val x: Int имеет тип Int.

К сожалению, для свойства типа private val a = 3 я получаю следующее:

  1. property.typeReference is null
  2. property.typeParameters пусто
  3. property.typeConstraints пусто
  4. property.typeParameterList пусто
  5. property.text равно private val a = 3
  6. property.node.children().joinToString() имеет объектную нотацию предыдущего элемента
  7. property.delegate равно нулю
  8. property.getType(bindingContext) равно нулю (свойство bindingContext является частью KtTreeVisitorVoid использовано

Вопрос : как я могу получить имя типа (или, что лучше, объект KClass) для сравнения фактического типа свойства с типом Boolean класса? (Например, мне просто нужно получить если свойство boolean равно not)

Код:

    override fun visitProperty(property: org.jetbrains.kotlin.psi.KtProperty) {
        val type: String = ??? //property.typeReference?.text - doesn't work

        if(property.identifierName().startsWith("is") && type != "Boolean") {
            report(CodeSmell(
                issue,
                Entity.from(property),
                message = "Non-boolean properties shouldn't start with 'is' prefix. Actual type: $type")
            )
        }
    }

1 Ответ

1 голос
/ 18 июня 2020

Правильное решение:

fun getTypeName(parameter: KtCallableDeclaration): String? {
        return parameter.createTypeBindingForReturnType(bindingContext)
            ?.type
            ?.getJetTypeFqName(false)
    }

Для логического типа существуют как минимум следующие значения: kotlin.Boolean и java.lang.Boolean

Полный код здесь .

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