如何确定函数 return 类型是否是 ksp 中的原语
How to determine if a functions return type is a primitive in ksp
简短版本:如何判断 KSType
是原始类型还是将其与 kotlin 类型进行比较?
我正在使用 ksp 在 Kotlin 中编写代码生成器。我正在遍历一个类型的函数并且有一个 KSFunctionDeclaration
。我想知道函数的 return 类型是否是原语。
我可以使用 it.returnType?.resolve()?.declaration?.simpleName
查看类型的名称,这将显示 Long
或 Int
等。所以我可以检查该名称是否为 == "Long"
等.但似乎应该有一种方法可以与实际类型进行比较。
我发现 Resolver
上的 builtins
属性 每个内置类型都有一个 属性 类型 KSType
。但是我不知道怎么去 Resolver
.
builtIns
是比较基元类型和 return 类型的方法。
Resolver
可以作为参数传递给您的访问者,这是完全安全的。
class ConnectFunctionVisitor(
private val environment: MySymbolProcessorEnvironment,
private val resolver: Resolver
) : KSDefaultVisitor<KSFunctionDeclaration, FunSpec>()
对于 non-primitive 类型 you can use this extension:
inline fun <reified T> KSType.isAssignableFrom(resolver: Resolver): Boolean {
val classDeclaration = requireNotNull(resolver.getClassDeclarationByName<T>()) {
"Unable to resolve ${KSClassDeclaration::class.simpleName} for type ${T::class.simpleName}"
}
return isAssignableFrom(classDeclaration.asStarProjectedType())
}
简短版本:如何判断 KSType
是原始类型还是将其与 kotlin 类型进行比较?
我正在使用 ksp 在 Kotlin 中编写代码生成器。我正在遍历一个类型的函数并且有一个 KSFunctionDeclaration
。我想知道函数的 return 类型是否是原语。
我可以使用 it.returnType?.resolve()?.declaration?.simpleName
查看类型的名称,这将显示 Long
或 Int
等。所以我可以检查该名称是否为 == "Long"
等.但似乎应该有一种方法可以与实际类型进行比较。
我发现 Resolver
上的 builtins
属性 每个内置类型都有一个 属性 类型 KSType
。但是我不知道怎么去 Resolver
.
builtIns
是比较基元类型和 return 类型的方法。
Resolver
可以作为参数传递给您的访问者,这是完全安全的。
class ConnectFunctionVisitor(
private val environment: MySymbolProcessorEnvironment,
private val resolver: Resolver
) : KSDefaultVisitor<KSFunctionDeclaration, FunSpec>()
对于 non-primitive 类型 you can use this extension:
inline fun <reified T> KSType.isAssignableFrom(resolver: Resolver): Boolean {
val classDeclaration = requireNotNull(resolver.getClassDeclarationByName<T>()) {
"Unable to resolve ${KSClassDeclaration::class.simpleName} for type ${T::class.simpleName}"
}
return isAssignableFrom(classDeclaration.asStarProjectedType())
}