【问题标题】:Resolve generic type in IntelliJ plugin codecheck解析 IntelliJ 插件代码检查中的泛型类型
【发布时间】:2021-01-18 06:36:38
【问题描述】:

我编写了一个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 的访问。 这就是我目前所拥有的(为简单起见,我省略了类型和空值检查):

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
  • 在课堂Derived访问list,我想输入D

但我总是在变量refTypes 中得到PsiType:B。为了获得预期的类型,我必须进行哪些更改?

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

【问题讨论】:

    标签: java intellij-idea intellij-plugin intellij-inspections


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,但这仅适用于两种情况之一。它在Derived 类中提供D,但T 而不是Base 中的B。换句话说,当它是一个特定的类时,我需要这个类。当它被约束时,它需要约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2016-10-10
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多