我正在尝试创建自己的SonarQube规则,该规则的目标是检查变量和等号之间是否应该有空格。例如:
int num=3; // Noncompliant
int num = 3; // Compliant 为此,我正在尝试让VariableTreeImpl使用equalToken()方法。因此我应该将类型VariableTree更改为VariableTreeImpl
@Override
public void visitClass(ClassTree tree) {
if (tree.is(Tree.Kind.CLASS) || tree.is(Tree.Kind.ENUM)) {
for (Tree member : tree.members()) {
if (member.is(Tree.Kind.VARIABLE)) {
if (((VariableTree) member).initializer() != null && ((VariableTreeImpl)member).equalToken()!= null ){
SyntaxToken variableFistToken = ((VariableTree) member).simpleName().firstToken();
SyntaxToken initializerToken = ((VariableTree) member).initializer().firstToken();
if (noSpacingBetweenEqualSign(variableFistToken,initializerToken,((VariableTreeImpl) member).equalToken())) {
context.reportIssue(this, member, "Before and after equals sign should have white space");
}
}
}
}
}
super.visitClass(tree);
}它在jUnit测试期间似乎工作得很好,但是当我在我的测试项目上启动sonnar-scanner时,我得到了以下错误:
Caused by: java.lang.ClassCastException: org.sonar.java.model.declaration.VariableTreeImpl cannot be cast to org.sonar.java.model.declaration.VariableTreeImpl
at com.gisquest.custom.sonar.check.DeclareVariableCheck.visitClass(DeclareVariableCheck.java:39)
at org.sonar.java.model.declaration.ClassTreeImpl.accept(ClassTreeImpl.java:198)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:37)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.visitCompilationUnit(BaseTreeVisitor.java:55)
at org.sonar.java.model.JavaTree$CompilationUnitTreeImpl.accept(JavaTree.java:184)
at org.sonar.plugins.java.api.tree.BaseTreeVisitor.scan(BaseTreeVisitor.java:43)
at com.gisquest.custom.sonar.check.DeclareVariableCheck.scanFile(DeclareVariableCheck.java:29)
at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:121)
at org.sonar.java.ast.JavaAstScanner.simpleScan(JavaAstScanner.java:84)
... 38 more
ERROR: 我做了一些研究,我遇到了这个问题,这看起来是我的问题:SonarQube java.lang.ClassCastException: ParametrizedTypeJavaType cannot be cast to ParametrizedTypeJavaType
所以我完全糊涂了。解决我的问题的好方法是什么?
我使用的是SonarQube 6.2版。
发布于 2017-08-25 14:27:22
不幸的是,因为equalToken()还不是VariableTree接口的一部分,所以您的规则在运行时不能访问它。这些接口的实现不公开,但在测试阶段可用。
在这一点上,只要API没有改变,你能做的就不多了,除了可能改变你的方法,只订阅语法标记。然后检查=字符串,以及等于运算符是否是VariableTree的一部分(使用parent()方法),最后检查标记空间的位置。
同时,我创建了以下票证来丰富API并为equal令牌提供访问权限:SONARJAVA-2432
编辑:请注意,当您为SonarJava插件编写自定义规则时,提供SonarJava分析器的版本可能会有所帮助,并且它具有比SonarQube独立的生命周期。
https://stackoverflow.com/questions/45873413
复制相似问题