2016-05-03 2 views
1

Я хочу написать правило PMD, которое использует два узла AST.Как использовать два узла AST в одном правиле в pmd?

Мое пользовательское правило сканирует исходный код, чтобы найти математические операторы.

Я хочу, чтобы мое правило, чтобы найти более одного оператора из этих

+,*,/, and - 

в том же выражении.

Я пробовал некоторые решения, но они не работают, например:

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); 

    } 
} 

Как сделать это?

ответ

1

Я выбрал XPath вместо Java. Поместите это правило в ваш PMD конфигурации набора правил 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> 

Но это не полное решение еще ... Я ищу в возможной PMD ошибка: похоже, что такое выражение, как 1+2-3+4 получает один AdditiveExpression:+ узел вместо из 3 различных узлов с их соответствующими операторами, поэтому обнаружение выражения, которое использует только + и - или просто * и /, не будет обнаружено. Но он будет обнаруживать выражения со смешанными аддитивными и мультипликативными операторами.

Я уточню ответ, если я это выясню, но я надеюсь, что это правило используется.

+0

Thaaaaaaanks aloooooot Волосатые, обнаруживающие выражения со смешанными добавочными и мультипликативными операторами - это то, что мне нужно. Я использую это решение, и он работает :-) –

+0

Мне нужно написать больше правил, если мне нужно больше помочь от вас, могу я спросить вас? –

+0

Нет проблем! Я слежу за pmd и другими тегами, связанными с статическим анализом, поэтому в следующий раз, когда вы зададите вопрос об этом, я это увижу. – HairyFotr

1

Я добавляю еще один ответ, чтобы проиллюстрировать, как аналогичная вещь может быть выполнена с интерфейсом Java. Это непроверенный код, но вот общая идея:

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; 
    } 

} 

Итак, картина посетителя пересекает AST, и когда он достигает ASTMultiplicativeExpression он устанавливает флаг МультипликативноеВыражения, а затем продолжает обход. Если внутри этого обхода он достигает выражения ASTAdditiveExpression, флаг будет установлен, а нарушение будет добавлено. Когда вы вернетесь из этого обхода обратно в ASTMultiplicativeExpression, флаг не будет установлен. И то же самое для атрибутов ASTAdditiveExpression и additiveExpression.

+0

Еще раз спасибо учителю, это мне очень помогает :-) –

+1

Я протестировал его, и он работает очень хорошо :-) –