制作一个 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
返回两个参数:
PsiClassReferenceType
- 这是用于 String
参数PsiWildcardType
- 这是通用值参数(将 canonicalText
作为 ? extends B
)也尝试过使用
PsiUtil.resolveGenericsClassInType(psiType).substitutor.substitutionMap
,但这仍然给我带来? extends B
,仅此而已。
有关如何获取实际类型参数的任何建议(我的情况是
Class2
)?
要使用 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,这通常是泛型类型的情况。然后它检索类型参数并处理它们以提取实际的类型信息。
请记住,处理泛型和类型参数可能很复杂,特别是在涉及多个级别的泛型类型时。您可能需要递归遍历类型层次结构才能获取最具体的类型信息。