Java annotation processing to KSP reference

Program elements

Java

Closest facility in KSP

Notes

AnnotationMirror

KSAnnotation

AnnotationValue

KSValueArguments

Element

KSDeclaration / KSDeclarationContainer

ExecutableElement

KSFunctionDeclaration

PackageElement

KSFile

KSP doesn't model packages as program elements.

Parameterizable

KSDeclaration

QualifiedNameable

KSDeclaration

TypeElement

KSClassDeclaration

TypeParameterElement

KSTypeParameter

VariableElement

KSValueParameter / KSPropertyDeclaration

Types

Because KSP requires explicit type resolution, some functionalities in Java can only be carried out by KSType and the corresponding elements before resolution.

Java

Closest facility in KSP

Notes

ArrayType

KSBuiltIns.arrayType

DeclaredType

KSType / KSClassifierReference

ErrorType

KSType.isError

ExecutableType

KSType / KSCallableReference

IntersectionType

KSType / KSTypeParameter

NoType

KSType.isError

N/A in KSP

NullType

N/A in KSP

PrimitiveType

KSBuiltIns

Not exactly same as primitive type in Java

ReferenceType

KSTypeReference

TypeMirror

KSType

TypeVariable

KSTypeParameter

UnionType

N / A

Kotlin has only one type per catch block. UnionType is also not observable by even Java annotation processors.

WildcardType

KSType / KSTypeArgument

Misc

Java

Closest facility in KSP

notes

Name

KSName

ElementKind

ClassKind / FunctionKind

Modifier

Modifier

NestingKind

ClassKind / FunctionKind

AnnotationValueVisitor

ElementVisitor

KSVisitor

AnnotatedConstruct

KSAnnotated

TypeVisitor

TypeKind

KSBuiltIns

Some can be found in builtins, otherwise check KSClassDeclaration for DeclaredType

ElementFilter

Collection.filterIsInstance

ElementKindVisitor

KSVisitor

ElementScanner

KSTopDownVisitor

SimpleAnnotationValueVisitor

No needed in KSP

SimpleElementVisitor

KSVisitor

SimpleTypeVisitor

TypeKindVisitor

Types

Resolver / utils

Some of the utils are also integrated into symbol interfaces

Elements

Resolver / utils

Details

How functionalities of Java annotation processing API can be carried out by KSP.

AnnotationMirror

Java

KSP equivalent

getAnnotationType

ksAnnotation.annotationType

getElementValues

ksAnnotation.arguments

AnnotationValue

Java

KSP equivalent

getValue

ksValueArgument.value

Element

Java

KSP equivalent

asType

ksClassDeclaration.asType(...) // Only available for KSClassDeclaration. Type arguments need to be supplied.

getAnnotation

// To be implemented.

getAnnotationMirrors

ksDeclaration.annotations

getEnclosedElements

ksDeclarationContainer.declarations

getEnclosingElements

ksDeclaration.parentDeclaration

getKind

type check & cast following ClassKind or FunctionKind

getModifiers

ksDeclaration.modifiers

getSimpleName

ksDeclaration.simpleName

ExecutableElement

Java

KSP equivalent

getDefaultValue

// To be implemented.

getParameters

ksFunctionDeclaration.parameters

getReceiverType

ksFunctionDeclaration.parentDeclaration

getReturnType

ksFunctionDeclaration.returnType

getSimpleName

ksFunctionDeclaration.simpleName

getThrownTypes

// Not needed in Kotlin.

getTypeParameters

ksFunctionDeclaration.typeParameters

isDefault

// Check whether parent declaration is an interface or not.

isVarArgs

ksFunctionDeclaration.parameters.any

Parameterizable

Java

KSP equivalent

getTypeParameters

ksFunctionDeclaration.typeParameters

QualifiedNameable

Java

KSP equivalent

getQualifiedName

ksDeclaration.qualifiedName

TypeElement

Java

KSP equivalent

getEnclosedElements

ksClassDeclaration.declarations

getEnclosingElement

ksClassDeclaration.parentDeclaration

getInterfaces

ksClassDeclaration.superTypes.map { it.resolve() }.filter {(it?.declaration as? KSClassDeclaration)?.classKind == ClassKind.INTERFACE} // Should be able to do without resolution.

getNestingKind

// check KSClassDeclaration.parentDeclaration and inner modifier.

getQualifiedName

ksClassDeclaration.qualifiedName

getSimpleName

ksClassDeclaration.simpleName

getSuperclass

ksClassDeclaration.superTypes.map { it.resolve() }.filter { (it?.declaration as? KSClassDeclaration)?.classKind == ClassKind.CLASS } // Should be able to do without resolution.

getTypeParameters

ksClassDeclaration.typeParameters

TypeParameterElement

Java

KSP equivalent

getBounds

ksTypeParameter.bounds

getEnclosingElement

ksTypeParameter.parentDeclaration

getGenericElement

ksTypeParameter.parentDeclaration

VariableElement

Java

KSP equivalent

getConstantValue

// To be implemented.

getEnclosingElement

ksValueParameter.parentDeclaration

getSimpleName

ksValueParameter.simpleName

ArrayType

Java

KSP equivalent

getComponentType

ksType.arguments.first()

DeclaredType

Java

KSP equivalent

asElement

ksType.declaration

getEnclosingType

ksType.declaration.parentDeclaration

getTypeArguments

ksType.arguments

ExecutableType

Note: A KSType for a function is just a signature represented by the FunctionN<R, T1, T2, ..., TN> family.

Java

KSP equivalent

getParameterTypes

ksType.declaration.typeParameters, ksFunctionDeclaration.parameters.map

getReceiverType

ksFunctionDeclaration.parentDeclaration.asType(...)

getReturnType

ksType.declaration.typeParameters.last()

getThrownTypes

// Not needed in Kotlin.

getTypeVariables

ksFunctionDeclaration.typeParameters

IntersectionType

Java

KSP equivalent

getBounds

ksTypeParameter.bounds

TypeMirror

Java

KSP equivalent

getKind

// Compare with types in KSBuiltIns for primitive types, Unit type, otherwise declared types

TypeVariable

Java

KSP equivalent

asElement

ksType.declaration

getLowerBound

// To be decided. Only needed if capture is provided and explicit bound checking is needed.

getUpperBound

ksTypeParameter.bounds

WildcardType

Java

KSP equivalent

getExtendsBound

if (ksTypeArgument.variance == Variance.COVARIANT) { ksTypeArgument.type } else { null }

getSuperBound

if (ksTypeArgument.variance == Variance.CONTRAVARIANT) { ksTypeArgument.type } else { null }

Elements

Java

KSP equivalent

getAllAnnotationMirrors

KSDeclarations.annotations

getAllMembers

getAllFunctions and getAllProperties, the latter is not there yet

getBinaryName

// To be decided, see Java Spec

getConstantExpression

we have constant value, not expression

getDocComment

// To be implemented

getElementValuesWithDefaults

// To be implemented.

getName

resolver.getKSNameFromString

getPackageElement

Package not supported, while package information can be retrieved, operation on package is not possible for KSP

getPackageOf

Package not supported

getTypeElement

Resolver.getClassDeclarationByName

hides

// To be implemented

isDeprecated

KsDeclaration.annotations.any { it.annotationType.resolve()!!.declaration.quailifiedName!!.asString() == Deprecated::class.quailifiedName }

overrides

KSFunctionDeclaration/KSPropertyDeclaration.overrides // member function of respective class

printElements

// KSP implemented basic toString() on most classes.

Types

Java

KSP equivalent

asElement

ksType.declaration

asMemberOf

resolver.asMemberOf

boxedClass

// Not needed

capture

// To be decided.

contains

KSType.isAssignableFrom

directSuperTypes

(ksType.declaration as KSClassDeclaration).superTypes

erasure

ksType.starProjection()

getArrayType

ksBuiltIns.arrayType.replace(...)

getDeclaredType

ksClassDeclaration.asType

getNoType

ksBuiltIns.nothingType / null

getNullType

// depends on the context, KSType.markNullable maybe useful.

getPrimitiveType

// Not needed, check for KSBuiltins

getWildcardType

// Use Variance in places expecting KSTypeArgument

isAssignable

ksType.isAssignableFrom

isSameType

ksType.equals

isSubsignature

functionTypeA == functionTypeB // functionTypeA == functionTypeB.starProjection()

isSubtype

ksType.isAssignableFrom

unboxedType

// Not needed.

Last modified: 16 September 2021

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