2015-07-20 2 views
1

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

Как это:

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

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

Edit:

Я пытался что-то вроде этого:

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

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

ответ

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)

I've put some examples показывая эффекты //ancestor:: против ancestor:: и моей альтернативы.

Смежные вопросы