2009-10-20 10 views
1

existe-t-il un moyen (et si oui, comment?) De parcourir une requête XPath de manière récursive?Comment parcourir XPath récursivement?

J'ai un AST en Java avec le scénario suivant

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

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

Je veux trouver la méthode qui est annotées avec des thats (facile) « @Relevant » et vérifier si la méthode qui est appelée dans foo (barre ici) a une déclaration assert. Donc, a) comment extraire le nom de méthode 'barre' et demander via XPath la méthode appelée 'barre'? Et si «bar» appelle réellement «bla» dans lequel l'affirmation se produit?

espoir cela est compréhensible ...

Merci pour toute aide

+1

On ne sait pas quel est le format AST. Je suppose que vous créez sa configuration XML. Si cela est correct, fournissez plus de détails sur l'appel de méthode et la définition des instructions assertes que vous utilisez. Je peux dire que j'ai joué avec des sources javac (disponibles à partir du projet OpenJDK) et qu'ils construisent AST par programme (au format 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). Il est facile d'accomplir votre tâche via cette API, puis en utilisant JCTree.JCCompilationUnit.accept (Visitor). –

+0

le but pour cela est en train de créer une règle XPath pour PMD. En raison des circonstances, je ne peux pas utiliser une implémentation Java pour cela. donc c'est soit possible dans XPath ou je dois oublier l'idée entière ;-) Merci de toute façon – Marty

Répondre

0

ne suffit pas une seule XPath pour la tâche que vous essayez d'accomplir. D'abord, vous avez besoin d'une liaison de type (pour trouver une déclaration de méthode bar(), par exemple). Deuxièmement, vous devez développer une sorte d'analyseur de code statique, qui exécute récursivement sur ASTs et essaie de satisfaire une condition, qui est "une expression d'assertion existe" dans une pile d'appels.

Vous pouvez consulter le code source Eclipse JDT pour savoir comment la liaison de type est implémentée ici. Une fois que vous avez une liaison, vous pouvez invoquer votre logique dessus.

Questions connexes