martymcfly
martymcfly

Reputation: 63

XPath find element based on ancestor element

again I have Java AST which is created from

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

I try to create a XPath query which finds the synchronized block in which the defined String variable o is used.

As the definition is above it is an ancestor of the SynchronizedStatement, but I dont get it working

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

I know that /SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image= is correct, my problem is how to address the ancestor ClassOrInterfaceBody part.

Hope its clear what i mean ;-)

Thanks

Upvotes: 1

Views: 626

Answers (1)

Lachlan Roche
Lachlan Roche

Reputation: 25966

To test that the two @Image are the same.

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

To also test for String type, assuming that FieldDeclaration and FieldVariableDeclaratorId have a common attribute (name).

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

If the @Image from the original XPath is "String":

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

Upvotes: 2

Related Questions