2017-08-25 2 views
1

Ich versuche, meine eigene Sonarqube Regel zu machen, das Ziel der Regel ist zu prüfen, ob es ein Leerraum zwischen einer Variablen und einem Gleichheitszeichen sein sollte. Zum Beispiel:Classcast: org.sonar.java.model.declaration.VariableTreeImpl

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

zu tun, dass ich die VariableTreeImpl zu bekommen versuchen die Methode equalToken() zu verwenden. so sollte ich die Art ändern VariableTree zu 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); 
} 

Es scheint auch bei JUnit-Tests zu arbeiten, aber wenn ich starten Sonnar-Scanner auf meinem Testprojekt bekomme ich folgende Fehlermeldung:

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: 

Ich habe Ich habe ein paar Nachforschungen angestellt und bin auf diese Frage gestoßen, die mein Problem zu sein scheint: SonarQube java.lang.ClassCastException: ParametrizedTypeJavaType cannot be cast to ParametrizedTypeJavaType

So bin ich total verwirrt. Was ist der gute Ansatz, um mit meinem Problem umzugehen?

Ich verwende Sonarqube Version 6.2.

Antwort

2

Da die equalToken() leider noch nicht Teil der API-Schnittstelle VariableTree ist, hat Ihre Regel zur Laufzeit keinen Zugriff darauf. Die Implementierung dieser Schnittstellen ist nicht verfügbar, aber während der Testphasen verfügbar.

gibt es nicht viel Sie an dieser Stelle tun können, solange die API nicht verändert, außer vielleicht Ihren Ansatz ändern und nur Syntax Token abonnieren. Dann prüfen = strings, und wenn der gleiche Operator Teil VariableTree (unter Verwendung von parent() Methode) ist, und schließlich für die Lage von Tokens Räumen überprüfen.

In der gleichen Zeit, habe ich das folgende Ticket die API und den Zugang für die gleichen Token zu bereichern: SONARJAVA-2432

EDIT: beachten Sie, dass Sie benutzerdefinierte Regeln für die SonarJava Plugin schreiben, Version der Bereitstellung SonarJava-Analysator könnte helfen und es hat einen unabhängigen Lebenszyklus als SonarQube.

+0

danke Michael in meiner pom.xml Ich benutze 4.3.0.7717

+0

Zuletzt veröffentlichte Version von SonarJava ist '4.12.0.11033'. Ich empfehle Ihnen, Ihr Projekt und Ihre SonarQube-Instanz auf die neueste Version zu aktualisieren. Beachten Sie, dass mein Kommentar immer noch gültig ist. Eine neue Methode, um auf das gleiche Token zuzugreifen, ist Teil von '4.13'. –