2010-07-28 3 views
6

최근에 일부 Java 코드를 수정 (메소드 추가, 일부 필드의 서명 변경 및 메소드 제거) 할 필요가 생겼습니다. Eclipse SDK를 사용하여이 모든 작업을 완료 할 수 있다고 생각합니다. AST.Eclipse AST 사용하기

저는 일부 연구에서 소스 파일을 구문 분석하는 방법을 알고 있지만 위에서 언급 한 작업을 수행하는 방법을 모르겠습니다. 누구든지 좋은 설명서를 알고 있습니까? 아니면 누군가이 문제를 해결하는 방법에 대한 간단한 설명을 줄 수 있습니까?

고마워,

ExtremeCoder는


편집 :

나는 지금 JCodeModel에 더 많은 찾기 시작하고 난이 사용하는 것이 훨씬 쉬울 수 있다고 생각하지만 존재하는 문서가 문서에로드 될 수 있는지 여부를 모릅니다.

다시 한번 감사드립니다.

답변

4

꽤 오래 되었기 때문에 나는이 문제의 전체 소스 코드를 여기에 게시하지 않겠다. 당신이 필요합니다

모든 문서는 여기에 있습니다 :. 당신이 전달 소스 코드에서 당신을 위해 컴파일 단위를 생성합니다

Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n"); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setSource(document.get().toCharArray()); 
CompilationUnit cu = (CompilationUnit)parser.createAST(null); 
cu.recordModifications(); 

http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/dom/package-summary.html

지금 이것은 간단한 기능입니다 전달한 클래스 정의 내의 모든 메소드를 인쇄합니다.

List<AbstractTypeDeclaration> types = cu.types(); 
for(AbstractTypeDeclaration type : types) { 
    if(type.getNodeType() == ASTNode.TYPE_DECLARATION) { 
     // Class def found 
     List<BodyDeclaration> bodies = type.bodyDeclarations(); 
     for(BodyDeclaration body : bodies) { 
      if(body.getNodeType() == ASTNode.METHOD_DECLARATION) { 
       MethodDeclaration method = (MethodDeclaration)body; 
       System.out.println("method declaration: "); 
       System.out.println("name: " + method.getName().getFullyQualifiedName()); 
       System.out.println("modifiers: " + method.getModifiers()); 
       System.out.println("return type: " + method.getReturnType2().toString()); 
      } 
     } 
    } 
} 

이렇게하면 모두 시작됩니다.

이 작업에 익숙해 지려면 약간의 시간이 필요합니다 (제 경우는 많습니다). 그러나 그것은 효과가 있으며, 손을 댈 수있는 가장 좋은 방법입니다.

행운을 빕니다)

ExtremeCoder

편집

: 나는 잊어 버리기 전에

이 내가이 작업을 얻기 위해 사용되는 수입은 (내가 꽤했다 이러한 조직 준비 시간) :

org.eclipse.jdt.core_xxxx.jar 
org.eclipse.core.resources_xxxx.jar 
org.eclipse.core.jobs_xxxx.jar 
org.eclipse.core.runtime_xxxx.jar 
org.eclipse.core.contenttype_xxxx.jar 
org.eclipse.equinox.common_xxxx.jar 
org.eclipse.equinox.preferences_xxxx.jar 
org.eclipse.osgi_xxxx.jar 
org.eclipse.text_xxxx.jar 

여기서 xxxx는 버전 번호를 나타냅니다.

1

AST를 조작 할 수있는 API를 호출하여 Eclipse에서이 작업을 수행 할 수 있습니다.

또는 프로그램 변형을 적용하여 대서양 표준시의 미세한 세부 사항에 의존하지 않는 방식으로 효과를 얻을 수 있습니다.

add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters 
    " \p " -> " \p , int \i"; 

이 매개 변수 목록에 임의의 이름으로 정수 매개 변수를 추가 : 다음 프로그램 변환을 작성할 수 있습니다 예를 들어

. 이렇게하면 API 호출 전체와 동일한 효과를 얻을 수 있지만 언어의 표면 구문 (이 경우 자바)에 있기 때문에 훨씬 더 읽기 쉽습니다.

DMS Software Reengineering Toolkitprogram transformations을 허용하고 Java를 비롯한 여러 언어에 적용 할 수 있습니다.