Spec-Zone.ru › Kotlin 1.6

Как KSP моделирует код Kotlin

Определение API можно найти в репозитории KSP на GitHub. На диаграмме показано, как Kotlin моделируется в KSP:

class diagram

Тип и разрешение

Разрешение занимает большую часть затрат на выполнение основного API. Поэтому ссылки на типы предназначены для явного разрешения процессорами (за исключением некоторых случаев). Когда ссылаются на тип (например, KSFunctionDeclaration.returnType или KSAnnotation.annotationType), это всегда KSTypeReference, который является KSReferenceElement с аннотациями и модификаторами.

interface KSFunctionDeclaration : ... {
  val returnType: KSTypeReference?
  // ...
}

interface KSTypeReference : KSAnnotated, KSModifierListOwner {
  val type: KSReferenceElement
}

KSTypeReference может быть разрешен в KSType, который ссылается на тип в системе типов Kotlin.

У KSTypeReference есть KSReferenceElement, который моделирует структуру программы Kotlin: то есть, как записывается ссылка. Он соответствует элементу type в грамматике Kotlin.

KSReferenceElement может быть KSClassifierReference или KSCallableReference, которые содержат много полезной информации без необходимости разрешения. Например, KSClassifierReference содержит referencedName, а KSCallableReference содержит receiverType, functionArguments и returnType.

Если требуется исходное объявление, на которое ссылается KSTypeReference, его обычно можно найти, разрешив его в KSType и обратившись к нему через KSType.declaration. Переход от места упоминания типа к месту определения его класса выглядит так:

val ksType: KSType = ksTypeReference.resolve()
val ksDeclaration: KSDeclaration = ksType.declaration

Разрешение типов затратно, поэтому имеет явную форму. Часть информации, полученной из разрешения, уже доступна в KSReferenceElement. Например, KSClassifierReference.referencedName может отфильтровать множество неинтересных элементов. Разрешать тип следует только в том случае, если вам нужна конкретная информация из KSDeclaration или KSType.

KSTypeReference, указывающий на тип функции, содержит большую часть своей информации в своём элементе. Хотя его можно разрешить в семейство Function0, Function1 и так далее, эти разрешения не предоставляют никакой дополнительной информации по сравнению с KSCallableReference. Один из вариантов использования разрешения ссылок на типы функций — определение идентификатора прототипа функции.

Последнее изменение: 07 апреля 2022
Примеры KSP Справочник по переходу от обработки аннотаций Java к KSP

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/ksp-additional-details.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API