SonarQube java.lang.ClassCastException:ParametrizedTypeJavaT



我正在尝试制定自己的SonarQube规则,该规则的目的是检查我是否在特定对象的集合上使用包含方法。整数对象示例:

List<Integer> a = new ArrayList<>();
a.contains(1); // Noncompliant

为此,我正在尝试获取ParametrizedTypeJavaType。然后我将能够测试它是否是整数......

@Override
public void visitNode(Tree tree) {
MethodInvocationTree methodInvocationTree = (MethodInvocationTree) tree;
ExpressionTree expressionTree = ((MethodInvocationTree) tree).methodSelect();
if(expressionTree.is(Kind.MEMBER_SELECT)){
MemberSelectExpressionTree memberSelectExpressionTree = (MemberSelectExpressionTree) expressionTree;
Type type = memberSelectExpressionTree.expression().symbolType();
ParametrizedTypeJavaType parametrizedTypeJavaType = (ParametrizedTypeJavaType) type;
// SOME CODE Test if it is an integer or not ...
reportIssue(tree,"REPORT !");
}

}
@Override
public List<Kind> nodesToVisit() {
List<Kind> kinds = new ArrayList<>();
kinds.add(Kind.METHOD_INVOCATION);
return kinds;
}

}

在jUnit测试期间它似乎运行良好,但是当我在测试项目上启动声纳扫描仪时,出现以下错误:

Caused by: java.lang.ClassCastException: org.sonar.java.resolve.ParametrizedTypeJavaType cannot be cast to org.sonar.java.resolve.ParametrizedTypeJavaType
at org.sonar.samples.java.checks.CollectionCheck.visitNode(CollectionCheck.java:38)

我做了一些研究,遇到了这个问题,这似乎是我的问题:

Sonarqube error java.lang.ClassCastException: org.sonar.java.resolve.SemanticModel 不能强制转换为 org.sonar.java.resolve.SemanticModel

我也遇到了这个规则,它看起来与我的规则非常相似,并使用了ParametrizedTypeJavaType。

https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/CollectionInappropriateCallsCheck.java

所以我完全糊涂了。处理我的问题的好方法是什么?

声纳库比版本 : 6.3.1

感谢您的帮助。

ParametrizedTypeJavaType不是自定义规则的 Java API 的一部分。截至今天,语义API不允许您访问泛型信息:这是计划但未计划:https://jira.sonarsource.com/browse/SONARJAVA-1871

你最好依靠现有的规则来实现你想要实现的目标:https://sonarqube.com/coding_rules#rule_key=squid%3AS2175

如果此规则对您不起作用,您能解释一下原因吗?

相关内容

  • 没有找到相关文章

最新更新