如何确定函数 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 查看类型的名称,这将显示 LongInt 等。所以我可以检查该名称是否为 == "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())
}