Как проверить наличие строки Apex в PMD с помощью XPath? - PullRequest
0 голосов
/ 09 января 2019

Анализатор исходного кода PMD позволяет записывать правила в виде выражений XPath .

Я работаю над очисткой кодовой базы Apex, где часто нахожу следующую ошибку: !someCollection.isEmpty() && someCollection != null.

Правильный подход заключается в том, чтобы сначала проверить нулевое значение: someCollection != null && !someCollection.isEmpty().

Использование моего доверенного редактора Я могу использовать RegEx, чтобы найти следующие элементы: && [a-zA-Z0-9]* != null. Работает как шарм. Сейчас я пытаюсь создать собственное правило PMD для него, но мое регулярное выражение XPath не возвращает никакого значения в PMD Designer:

<rule message="Apex code must check != null before .isEmpty()" name="NullValueCheckBeforeEmptyCheck" class="net.sourceforge.pmd.lang.rule.XPathRule">
    <description>Apex code must check != null before .isEmpty()</description>
    <priority>1</priority>
    <properties>
      <property name="xpath">
        <value>
            <![CDATA[
                //*[matches(@Image,'&& [a-zA-Z0-9]* != null')]
            ]]>
        </value>
      </property>
    </properties>
  </rule>

Я попытался провести начальную проверку //*[matches(@Image,'if')], но даже это не дало результата.

Что мне не хватает?

Пример Apex, который должен вызвать правило:

global class caseShareBatch {

<pre><code>global void execute(List&lt;Case&gt; caseShareList){
     if(!caseShareList.isEmpty() &amp;&amp; caseShareList != null) {
            insert caseShareList;
     }
}
}

Ответы [ 3 ]

0 голосов
/ 11 января 2019

PMD использует синтаксический анализатор Apex для преобразования исходного кода в абстрактное синтаксическое дерево (AST). Ваши выражения XPath применяются к AST, а не к исходному коду. Например. AST для оператора if будет выглядеть так:

IfElseBlockStatement {
    IfBlockStatement {
        StandardCondition {
            BooleanExpression {
                PrefixExpression {
                    MethodCallExpression {
                        ReferenceExpression 
                    }
                }
                BooleanExpression {
                    VariableExpression 
                    LiteralExpression 
                }
            }
        }
        BlockStatement {
            DmlInsertStatement {
                VariableExpression 
            }
        }
    }
}

PMD имеет графический конструктор правил , который очень помогает при написании правил XPath.

PMD Rule Designer

Для этого AST XPath //BooleanExpression/BooleanExpression[position() > 0 and VariableExpression and LiteralExpression] соответствует && caseShareList != null. Но это также будет соответствовать || i == 42, поэтому вы должны уточнить запрос дальше. К сожалению, я не увидел ничего, что позволило бы мне различить && и ||, но вам, возможно, повезет больше.

0 голосов
/ 28 января 2019

Оказывается, то, что мне нужно было сделать, было невозможно с PMD 6.10. Последний выпуск 6.11.0 не предоставил свойство @Image, как я и ожидал, но добавил в булевый оператор достаточно новых свойств, чтобы без необходимости создавать выражение XPath, достойное @ michael-kay. добавить Regex в смесь:

//BooleanExpression[@Op="&&"][
  child::*[2][
    self::BooleanExpression[@Op="!="][
      child::*[1][self::VariableExpression] and
      child::*[2][self::LiteralExpression[@LiteralType="NULL"]]
    ]
  ]
]

YMMV

0 голосов
/ 09 января 2019

Вы уверены, что PMD поддерживает XPath 2.0? С первого взгляда на документацию, это не очевидно. Очень часто люди, которые говорят о XPath без номера версии, ссылаются на XPath 1.0, которая, конечно, не имеет функции matches().

...