微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

解决IntelliJ插件代码检查中的通用类型

如何解决解决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();
    }
}

Base包含一个带有通用参数T的列表,可从类Base及其派生类Derived访问该列表。

我有一个注释器(可能更改为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)获得通用的最低要求类型。或从上面看我的例子:

  • 在访问类list中的Base时,我要输入B
  • 在访问类list中的Derived时,我要输入D

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。