2010-03-25 2 views
1

에 기반을 다시 나는 내가 o 변수에 정의 된 문자열이 사용되는 동기화 블록을 찾는 XPath 쿼리를 만들려고의 XPath 찾기 요소는 상위 요소

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

에서 만든 자바 AST 있습니다. 내 문제는 조상 ClassOrInterfaceBody 부분을 해결하는 방법은, 그것은 SynchronizedStatement의 조상 위의 정의로

입니다,하지만 난 /SynchronizedStatement[Expression/PrimaryExpression/PrimaryPrefix/Name[@Image=이 올 것을 알고

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

작업을 얻을니까.

내가 두 @image이 동일한 지 테스트하려면 ;-)

감사

답변

2

을 무엇을 의미하는지는 명확를 바랍니다.

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

FieldDeclaration 및 FieldVariableDeclaratorId이 공통 속성 (이름)이 있다고 가정 문자열 유형도 테스트에. - 작품을위한

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

감사 :

//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 인 경우에만 두 개의 @Image가 동일하다는 것을 확인하고 싶습니다. 그래서 Object o = new Object(); 일치하지 않아야합니다 ... 어떻게 이러한 두 조건을 결합 할 수 있습니까? @Image 검사와 발견 된 조상 요소도 String 유형입니다. 나는 그 문자열이 있는지 확인하는 방법을 알고 있지만 검색과 결합하는 방법은 아닙니다 (그들은 같은 노드에서 작업 중입니다). 고맙습니다 – martymcfly

+0

@martymcfly String 유형 및 노드 테스트는 어떻게됩니까? 기본적으로 위와 같은 조상에 –

+0

이 있습니다. Image' ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration/VariableDeclarator/VariableDeclaratorId/@ 및 문자열 비교는 그 조상 '조상 :: ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration /에 구성됩니다 의사 같은 이미지가 '조상과 비교 FieldDeclaration/Type/ReferenceType/ClassOrInterfaceType [@ Image = 'String']' 기본적으로'FieldDeclaration'은 String과 Name에 대한 정보를 포함하고있는 노드입니다. 그러나 ClassOrInterfaceBody는 이것과 Synchron.Statements에 대한 공통 조상입니다 – martymcfly