объединить две проверки PMD

Я столкнулся с проблемой при использовании PMD для проверки ошибок кода. Я не знаю, как удовлетворить два требования одновременно. Например, если я хочу проверить, что метод с именем ABC, не существующий в файле, расширяется от BCD. Я знаю, как проверить, существует ли ABC или же он расширяется от BCD отдельно с помощью PMD.

Так:

//PrimaryExpression/PrimaryPrefix/Name [@Image = "ABC"];
//ExtendsList/ClassOrInterfaceType [@Image != "BCD"];

теперь, есть в любом случае, что я могу проверить эти два вместе. Например, я хочу, чтобы ABC в классе не расширял BCD. Кажется, я не могу просто использовать такие вещи, как и для соединения этих двух запросов Xpath. Кроме того, я заметил, что могу использовать | чтобы связаться с ними, но | работает как или. Мне нужно и здесь вместо или.

Изменить:

Я пробовал что-то вроде этого:

//PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"]
 [//ancestor::ClassOrInterfaceDeclaration/ExtendsList/
                                     ClassOrInterfaceType[@Image != "BCD"]]

Кажется, это работает для меня, по крайней мере. Но я все еще не уверен на 100%, что это правильный путь, так как я только что попробовал это.


person J.P.    schedule 20.07.2015    source источник


Ответы (1)


Ваше редактирование должно работать, хотя обратите внимание, что ось ancestor будет повторять все родительские узлы, поэтому ее не следует вводить с помощью '//'.

Другой альтернативой является создание Xpath на основе общего предка (например, ClassOrInterfaceDeclaration), а затем использование and для обеспечения соответствия двум критериям. Поскольку кажется, что вы просто проверяете наличие узла, отвечающего обоим критериям, я думаю, на самом деле не имеет значения, что на самом деле возвращает результирующее выражение/набор узлов:

//ClassOrInterfaceDeclaration[ExtendsList/ClassOrInterfaceType[@Image != "BCD"] 
                  and descendant::PrimaryExpression/PrimaryPrefix/Name[@Image = "ABC"]]

Однако, если вам нужно выбрать конкретный узел в случае успеха, просто добавьте путь к узлу относительно ClassOrInterfaceDeclaration:

//ClassOrInterfaceDeclaration[... predicate ...]/Some/Path/Here

Вы также можете применить такую ​​функцию, как count(), чтобы определить количество узлов, соответствующих критериям:

count(//ClassOrInterfaceDeclaration[... predicate ...])

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

(Предостережение - я не знаком с компоновкой PMD)

Я привел несколько примеров, показывающих влияние //ancestor:: на ancestor:: и мою альтернативу.

person StuartLC    schedule 21.07.2015