1

我又有了 Java AST,它是从

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

我尝试创建一个 XPath 查询,该查询查找使用定义的字符串变量的同步块o

正如上面的定义,它是 SynchronizedStatement 的祖先,但我没有让它工作

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

我知道这/SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=是正确的,我的问题是如何解决祖先 ClassOrInterfaceBody 部分。

希望它清楚我的意思;-)

谢谢

4

1 回答 1

2

测试两个@Image 是否相同。

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

还要测试 String 类型,假设 FieldDeclaration 和 FieldVariableDeclaratorId 具有共同的属性(名称)。

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

如果原始 XPath 中的 @Image 是“字符串”:

//SynchronizedStatement[ Expression/PrimaryExpression/PrimaryPrefix/Name/@Image = ancestor::ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldVariableDeclaratorId/@Image[. = 'String'] ]
于 2010-03-25T13:07:10.443 回答