2016-05-03 5 views
1

Ich möchte eine benutzerdefinierte PMD Regel schreiben, die zwei AST Knoten verwendet.Wie zwei AST-Knoten in einer Regel in PMD verwenden?

Meine benutzerdefinierte Regel scannt den Quellcode nach mathematischen Operatoren.

Ich möchte, dass meine Regel mehr als ein Betreiber von diesen

+,*,/, and - 

im gleichen Ausdruck zu finden.

Ich habe einige Lösungen ausprobiert, aber sie hat nicht funktioniert, zum Beispiel:

public class OperatorPrecednece extends AbstractJavaRule { 

    Public Object visit(ASTMultiplicativeExpression node, Object data) { 


     Object tvisi(ASTAdditiveExpression node2, Object data2){ 
     addViolation(data2, node2); 


     } 

     return super.visit(node, data); 

    } 
} 

Wie das tun?

Antwort

1

Ich wählte XPath anstelle von Java. Setzen Sie diese Regel in der pmd ruleset Konfiguration xml:

<rule name="MultipleOperatorsInExpression" language="java" message="More than one different operator used in expression" class="net.sourceforge.pmd.lang.rule.XPathRule"> 
    <properties> 
    <property name="xpath"> 
     <value> 
     <![CDATA[ 
//Expression[.//AdditiveExpression and .//MultiplicativeExpression] 
     ]]> 
     </value> 
    </property> 
    </properties> 
</rule> 

Aber es ist keine vollständige Lösung noch ... Ich bin auf der Suche nach einem möglichen pmd Fehler: sieht aus wie, dass ein Ausdruck wie 1+2-3+4 einen einzelnen AdditiveExpression:+ Knoten bekommt statt von 3 verschiedenen Knoten mit ihren jeweiligen Operatoren, so dass ein Ausdruck, der nur + und - oder nur * und/verwendet, nicht erkannt wird. Aber es erkennt Ausdrücke mit gemischten additiven und multiplikativen Operatoren.

Ich werde die Antwort aktualisieren, wenn ich das herausfinden, aber ich hoffe, dass die Regel von Nutzen ist.

+0

Thaaaaaaanks alooooot Behaarte, erkennende Ausdrücke mit gemischten additiven und multiplikativen Operatoren ist was ich brauche. Ich benutze diese Lösung und es funktioniert :-) –

+0

Ich muss mehr Regeln schreiben, wenn ich mehr Hilfe von dir brauche, kann ich dich fragen? –

+0

Kein Problem! Ich folge pmd und anderen Tags, die sich auf statische Analyse beziehen. Wenn Sie also das nächste Mal eine Frage dazu stellen, werde ich es sehen. – HairyFotr

1

Ich füge eine andere Antwort hinzu, um zu veranschaulichen, wie eine ähnliche Sache mit der Java-Schnittstelle gemacht werden kann. Dies ist ungetestet Code, aber hier ist die allgemeine Idee:

public class OperatorPrecednece extends AbstractJavaRule { 

    private boolean additiveExpression = false; 
    private boolean multiplicativeExpression = false; 

    public Object visit(ASTMultiplicativeExpression node, Object data) { 
     multiplicativeExpression = true; 
     if (additiveExpression) { 
      addViolation(data, node); 
     } 
     Object superVisit = super.visit(node, data); 
     multiplicativeExpression = false; 
     return superVisit; 
    } 

    public Object visit(ASTAdditiveExpression node, Object data) { 
     additiveExpression = true; 
     if (multiplicativeExpression) { 
      addViolation(data, node); 
     } 
     Object superVisit = super.visit(node, data); 
     additiveExpression = false; 
     return superVisit; 
    } 

} 

So durchläuft der Besucher Muster der AST, und wenn es eine ASTMultiplicativeExpression erreicht er setzt einen multiplicativeExpression Flag und setzt dann die Traversal. Wenn innerhalb dieser Traversierung ein ASTAdditiveExpression erreicht wird, wird das Flag gesetzt und die Verletzung hinzugefügt. Wenn Sie von dieser Durchquerung zurück zu der ASTM multiplicativeExpression zurückkehren, ist das Flag nicht gesetzt. Und das gleiche für ASTAdditiveExpression und additiveExpression Flag.

+0

danke wieder Lehrer, das hilft mir so sehr :-) –

+1

Ich habe es getestet, und es funktioniert sehr gut :-) –

Verwandte Themen