2010-03-25 4 views
1

encore, j'ai Java AST qui est créé à partirXPath élément de recherche en se basant sur l'élément ancêtre

public class Test { 
    String o = new String("hh"); 
    public void wrong1() { 
     synchronized(o) { 
      // huhu 
     } 
    } 
} 

je tente de créer une requête XPath qui trouve le bloc synchronisé dans lequel on utilise la variable chaîne o définie.

Comme la définition est au-dessus est un ancêtre de l'SynchronizedStatement, mais je ne le faire fonctionner

//SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=ancestor::ClassOrInterfaceBody[ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image]]] 

Je sais que /SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image= est exact, mon problème est de savoir comment aborder la partie ClassOrInterfaceBody ancêtre.

Espoir son clair ce que je veux dire ;-)

Merci

Répondre

2

Pour vérifier que les deux @image sont les mêmes.

//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image ] 

Pour tester également pour le type String, en supposant que FieldDeclaration et FieldVariableDeclaratorId ont un attribut commun (nom).

//SynchronizedStatement[ 
    Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = 
    ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId[ 
     @name = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration[Type/ReferenceType/ClassOrInterfaceType/@Image = 'String']/@name 
    ]/@Image 
] 

Si le @image du XPath d'origine est "String":

//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image[. = 'String'] ] 
+0

merci pour cela - qui fonctionne. Mais un autre problème - fondamentalement, je veux vérifier que les deux @Image sont les mêmes, MAIS seulement si la variable est une chaîne. donc Objet o = new Object(); ne devrait pas correspondre ... comment puis-je combiner ces deux conditions a) la vérification @Image et que l'élément ancêtre trouvé est également de type String. Je sais comment vérifier si c'est une chaîne, mais pas comment combiner aux recherches (qu'elles travaillent sur le même nœud). MERCI – martymcfly

+0

@martymcfly Quel est le test pour le type de chaîne, et sur quel noeud? –

+0

essentiellement dans l'ancêtre comme ci-dessus. pseudo comme l'image est comparée à ancêtre ': ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/VariableDeclarator/VariableDeclaratorId/@ Image' et la comparaison de chaîne est faite sur cet ancêtre ' ancêtre :: ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/Type/ReferenceType/ClassOrInterfaceType [@ Image = 'String'] ' Donc, fondamentalement' FieldDeclaration' est le noeud qui contient les informations sur String et le nom. Mais 'ClassOrInterfaceBody' est l'ancêtre commun pour ceci et le Synchron.Statements – martymcfly

Questions connexes