解析IntelliJ插件代码检查中的泛型类型



我编写了一个IntelliJ插件,它对Java代码执行一些检查
对于其中一项检查,我需要知道泛型字段的类型

示例:

// Model classes B and D
public class B {
void doB() {
}
}
public class D extends B {
void doD() {
}
}
// Classes that use the model classes
public class Base<T extends B> {
protected List<T> list;
private void test() {
list.get(0).doB();
}
}
public class Derived extends Base<D> {
private void test() {
list.get(0).doD();
}
}

类CCD_ 1包含具有从类Base及其派生类Derived访问的通用参数CCD_。

我有一个注释器(可能改为LocalInspection(,它检查两个类中对list的访问。这就是我到目前为止所做的(为了简单起见,我省略了类型和null检查(:

public class GenAnno implements Annotator {
@Override
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
if (element instanceof PsiReferenceExpression) {
PsiReferenceExpression refExpr = (PsiReferenceExpression)element;
PsiElement target = refExpr.resolve();
PsiField field = (PsiField) target;
PsiClassType fieldType = (PsiClassType) field.getType();
PsiClassType itTyp = (PsiClassType) PsiUtil.extractIterableTypeParameter(fieldType, false);
PsiClass cl = itTyp.resolve();
PsiTypeParameter tpara = (PsiTypeParameter) cl;
JvmReferenceType[] refTypes = tpara.getBounds();
}
}
}

我想在使用上下文中获得最低要求的泛型类型(PsiReferenceExpression(。或者关于我上面的例子:

  • 在访问类Base中的list时,我想要键入B
  • 在访问类Base1中的list时,我想要键入D

但我总是在变量refTypes中得到PsiType:B。我必须更改什么才能获得预期的类型?

小背景信息:我想检查反射使用的类型是否包含字段或方法。

您可能会得到list.get(0)的类型(如refExpr.getType()(,它将返回DPsiTpe。

最新更新