2017-08-25 26 views
1

我想製作自己的SonarQube規則,規則的目標是檢查變量和等號之間是否應該有空格。例如:ClassCastException:org.sonar.java.model.declaration.VariableTreeImpl

int num=3; // Noncompliant 
int num = 3; // Compliant 

要做到這一點,我試圖讓VariableTreeImpl使用的方法equalToken()。所以我應該改變類型VariableTreeVariableTreeImpl

@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測試,以很好地工作,但是當我啓動蔡司鏡頭,掃描儀對我的測試項目中,我得到以下錯誤:

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。

回答

2

不幸的是,因爲equalToken()還不是VariableTree API接口的一部分,所以您的規則在運行時將無法訪問它。這些接口的實現沒有公開,但在測試階段可用。

在這一點上,你可以做的事情不多,只要API沒有改變,除非改變你的方法,只訂閱語法標記。然後檢查=字符串,如果相等運算符是VariableTree的一部分(使用parent()方法),最後檢查令牌位置的位置。

在同一時間,我創建了下面的車票,以豐富的API,並提供了平等的令牌訪問:SONARJAVA-2432

編輯:請注意,因爲你正在寫的SonarJava插件自定義規則,提供的版本SonarJava分析儀可以提供幫助,並且它具有比SonarQube獨立的生命週期。

+0

感謝Michael在我的pom.xml中我使用 4.3.0.7717

+0

最新發布的SonarJava版本是'4.12.0.11033'。我建議您將您的項目和SonarQube實例更新到最新版本。請注意,我的評論仍然有效。訪問等於令牌的新方法將成爲'4.13'的一部分。 –