Spec-Zone.ru › Kotlin 1.7

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

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

Полный размер диаграммы.

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

Разрешение типов составляет большую часть накладных расходов реализации базового 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. Один из вариантов использования разрешения ссылок на типы функций — определение идентичности прототипа функции.

Последнее изменение: 06 сентября 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