如何获取PsiField的泛型类型?

问题描述 投票:0回答:1

制作一个 IDEA 插件并坚持使用这个东西。这是我的课程:

open class Class1<A, B : Class2> {
    open var value1: Map<String, A>? = null
    open var value2: Map<String, B> = emptyMap()
}

在我的插件中,我需要以某种方式知道变量的真实类型

value1
value2
PSI 库可以吗?

所以我有

PsiClassReferenceType
对象,它是
canonicalText
方法返回
java.util.Map<java.lang.String,? extends B>

psiType.reference.typeParameters
返回两个参数:

  1. PsiClassReferenceType
    - 这是用于
    String
    参数
  2. PsiWildcardType
    - 这是通用值参数(将
    canonicalText
    作为
    ? extends B

也尝试过使用

PsiUtil.resolveGenericsClassInType(psiType).substitutor.substitutionMap
,但这仍然给我带来
? extends B
,仅此而已。

有关如何获取实际类型参数的任何建议(我的情况是

Class2
)?

kotlin generics intellij-idea intellij-plugin intellij-platform-psi
1个回答
0
投票

要使用 PSI 库在 IDEA Plugin 中获取 value1 和 value2 的实际类型参数,可以按照以下步骤操作:

1.找到代表value1或value2的PsiField。

2.使用 PsiField.getType() 检索字段的 PsiType。

一旦获得 PsiType,您就可以提取实际的类型参数。以下是如何执行此操作的示例:

PsiField field = // Retrieve your PsiField here
PsiType fieldType = field.getType();

if (fieldType instanceof PsiClassReferenceType) {
    PsiClassReferenceType classReferenceType = (PsiClassReferenceType) fieldType;

// Get the type parameters
PsiType[] typeParameters = classReferenceType.getParameters();

// Check if the type has parameters
if (typeParameters.length >= 1) {
    PsiType firstTypeParameter = typeParameters[0]; // This is your "A" or "B" type parameter
    String canonicalText = firstTypeParameter.getCanonicalText();
    // Now, you can work with the canonical text to extract the actual type information.
}

}

此代码片段检查字段的类型是否为 PsiClassReferenceType,这通常是泛型类型的情况。然后它检索类型参数并处理它们以提取实际的类型信息。

请记住,处理泛型和类型参数可能很复杂,特别是在涉及多个级别的泛型类型时。您可能需要递归遍历类型层次结构才能获取最具体的类型信息。

© www.soinside.com 2019 - 2024. All rights reserved.