1

再び私はから作成されたJavaASTを持っています

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

o定義されたString変数が使用されている同期ブロックを見つけるXPathクエリを作成しようとしています。

定義が上にあるので、それはSynchronizedStatementの祖先ですが、私はそれを機能させません

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

私はそれ/SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=が正しいことを知っています、私の問題は祖先のClassOrInterfaceBody部分にどのように対処するかです。

私が何を意味するのかが明確になることを願っています;-)

ありがとう

4

1 に答える 1

2

2 つの @Image が同じであることをテストします。

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

FieldDeclaration と FieldVariableDeclaratorId に共通の属性 (名前) があると仮定して、String 型もテストします。

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

元の XPath の @Image が "String" の場合:

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