2009-10-20 3 views
1

Есть ли способ (и если да, как?) Рекурсивно пересекать запрос XPath?Как переходить XPath рекурсивно?

У меня есть AST в Java с помощью следующего сценария

@Relevant 
public void foo() { 
    bar(true); 
} 

public void bar(boolean flag) { 
    assert flag; 
} 

Я хочу, чтобы найти метод, который аннотированный с «@Relevant» (это является легким) и проверить, если метод, который вызывается в Foo (здесь bar) имеет утверждение assert.

Итак, а) как извлечь имя «bar» имени метода и спросить через XPath для метода «бар»?

и что, если «бар» на самом деле вызывает «бла», в котором происходит утверждение?

надеюсь, что это понятно ...

Спасибо за любую помощь

+1

Неясно, каков ваш формат AST. Я предполагаю, что вы создаете его конфигурацию XML. Если это правильно, укажите более подробные сведения о том, как вы используете метод call и assert. Я могу сказать, что я играл с источниками javac (доступен из проекта OpenJDK), и они программируют AST (в формате JCTree.JCCompilationUnit - http://xref.jsecurity.net/openjdk-6/langtools/dd/d25/ classcom_1_1sun_1_1tools_1_1javac_1_1tree_1_1_j_c_tree_1_1_j_c_compilation_unit.html). Легко выполнить вашу задачу через этот API, а затем использовать JCTree.JCCompilationUnit.accept (Посетитель). –

+0

Целью этого является создание правила XPath для PMD. Из-за обстоятельств я не могу использовать для этого реализацию Java. так что это возможно в XPath или я должен забыть всю идею ;-) Спасибо в любом случае – Marty

ответ

0

Один Xpath не является достаточным для выполнения этой задачи, которую вы пытаетесь достичь.

Во-первых, вам понадобится привязка типа (например, для поиска метода bar()).

Во-вторых, вам нужно разработать некий статический анализатор кода, который работает на АСТ рекурсивно и пытается выполнить условие, которое является «выражением утверждения существует» в стеке вызовов.

Возможно, вы посмотрите исходный код Eclipse JDT на то, как там применяется привязка типов. Когда у вас есть привязка, вы можете вызвать свою логику.

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