首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.sonar.java.model.declaration.VariableTreeImpl :ClassCastException

org.sonar.java.model.declaration.VariableTreeImpl :ClassCastException
EN

Stack Overflow用户
提问于 2017-08-25 10:10:29
回答 1查看 330关注 0票数 1

我正在尝试创建自己的SonarQube规则,该规则的目标是检查变量和等号之间是否应该有空格。例如:

代码语言:javascript
复制
int num=3; // Noncompliant 
int num = 3; // Compliant 

为此,我正在尝试让VariableTreeImpl使用equalToken()方法。因此我应该将类型VariableTree更改为VariableTreeImpl

代码语言:javascript
复制
@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时,我得到了以下错误:

代码语言:javascript
复制
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版。

EN

回答 1

Stack Overflow用户

发布于 2017-08-25 14:27:22

不幸的是,因为equalToken()还不是VariableTree接口的一部分,所以您的规则在运行时不能访问它。这些接口的实现不公开,但在测试阶段可用。

在这一点上,只要API没有改变,你能做的就不多了,除了可能改变你的方法,只订阅语法标记。然后检查=字符串,以及等于运算符是否是VariableTree的一部分(使用parent()方法),最后检查标记空间的位置。

同时,我创建了以下票证来丰富API并为equal令牌提供访问权限:SONARJAVA-2432

编辑:请注意,当您为SonarJava插件编写自定义规则时,提供SonarJava分析器的版本可能会有所帮助,并且它具有比SonarQube独立的生命周期。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45873413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档