Java 注解处理对应到 KSP 参考
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
KSP requires explicit type resolution, so 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 | | Not needed in KSP |
SimpleElementVisitor | KSVisitor | |
SimpleTypeVisitor | | |
TypeKindVisitor | | |
Types | Resolver / utils | Some of the utils are also integrated into symbol interfaces |
Elements | Resolver / utils |
Details
See 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(…) is available for KSClassDeclaration only. Type arguments need to be supplied. |
getAnnotation | To be implemented |
getAnnotationMirrors | ksDeclaration.annotations |
getEnclosedElements | ksDeclarationContainer.declarations |
getEnclosingElements | ksDeclaration.parentDeclaration |
getKind | Type check and 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 { it.isVarArg } |
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 | kotlin // Should be able to do without resolution ksClassDeclaration.superTypes .map { it.resolve() } .filter { (it?.declaration as? KSClassDeclaration)?.classKind == ClassKind.INTERFACE } |
getNestingKind | Check KSClassDeclaration.parentDeclaration and inner modifier |
getQualifiedName | ksClassDeclaration.qualifiedName |
getSimpleName | ksClassDeclaration.simpleName |
getSuperclass | kotlin // Should be able to do without resolution ksClassDeclaration.superTypes .map { it.resolve() } .filter { (it?.declaration as? KSClassDeclaration)?.classKind == ClassKind.CLASS } |
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
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 { it.type } |
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 | kotlin if (ksTypeArgument.variance == Variance.COVARIANT) ksTypeArgument.type else null |
getSuperBound | kotlin if (ksTypeArgument.variance == Variance.CONTRAVARIANT) ksTypeArgument.type else null |
Elements
Java | KSP equivalent |
getAllAnnotationMirrors | KSDeclarations.annotations |
getAllMembers | getAllFunctions , getAllProperties is to be implemented |
getBinaryName | To be decided, see Java Specification |
getConstantExpression | There is 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 | kotlin KsDeclaration.annotations.any { it.annotationType.resolve()!!.declaration.qualifiedName!!.asString() == Deprecated::class.qualifiedName } |
overrides | KSFunctionDeclaration.overrides / KSPropertyDeclaration.overrides (member function of respective class) |
printElements | KSP has basic toString() implementation 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 | Depending on the context, KSType.markNullable could be 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 |