【发布时间】: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