2012-04-13 3 views
4

현재 이클립스 AST로 소스 코드를 생성하고 있습니다. 대부분의 예제 이외에, 나는 이클립스 플러그인과는 반대로 처음부터 소스 코드를 생성하고 독립형 애플리케이션에서 소스 코드를 생성한다.Eclipse JDT AST : 생성 된 AST를 Java 파일에 쓰는 방법은 무엇입니까?

ASTParser에서 읽을 때 recordModifications()을 호출하여 수정 사항을 활성화 할 수 있지만 AST가 처음부터 작성된 경우에는 작동하지 않습니다. newCompilationUnit()으로 전화하십시오.

따라서 소스를 DocumentTextEdit을 통해 파일에 기록하는 것은 불가능합니다. 수정 기록이 활성화되지 않았다는 예외가 있습니다.
처음부터 AST를 생성하고 파일에 쓰는 데 어떤 경험이 있습니까? 감사합니다.

+0

많은 : 위의 답변을 바탕으로, 내가 찾은 가장 우아한 해결책은 지금까지처럼 보인다. 귀하의 질문에 Eclipse가 필요합니까? –

+0

왜 "생성 된 AST"를 파일에 쓰고 싶습니까?어쩌면 그것의 다만 말씨, 그러나 나는 원본 원본이 AST에서 생성되는 파일에 prettyprinted 근원 원본을 쓰고 싶은 인상을 얻는다. –

+0

글쎄, 널리 사용되기 때문에 이클립스를 사용하고 있으며 "Java Development Tools"(JDT) AST 구현은 라운드 트립 엔지니어링을 허용하므로 인 메모리 AST에서 코드를 생성하거나 기존 코드를 수정할 수있다. 최소한의 변경만으로 소스 코드를 수정할 수 있습니다. 이 경우 "생성 됨"은 AST가 프로그래밍 방식으로 메모리에 빌드됨을 의미합니다. –

답변

2

: 파일이 새로 생성 된 빈됩니다

ICompilationUnit unit = JavaCore.createCompilationUnitFrom(file); 
ASTParser parser = ASTParser.newParser(AST.JLS3); 
parser.setKind(ASTParser.K_COMPILATION_UNIT); 
parser.setResolveBindings(true); 
parser.setSource(unit); 
// Parse the source code and generate an AST. 
CompilationUnit ast = (CompilationUnit) parser.createAST(null); 

경우, 아마도 AST가 비어있을 것입니다, 당신은 다음을 대체 할 수 루트 ast 개체의 파일에 쓰기. 또한 Eclipse에 묶여 있지 않은 경우 JSR199 표준을 사용하여 동일한 작업을 수행하고 AST를 일반적인 방법으로 파일에 작성할 수 있습니다. 소개는 here을 참조하십시오.

+0

"예를 들어 ast 개체의 루트를 바꿀 수 있고 파일에 쓸 수 있습니다." 부품? – sevenforce

+0

흠. 내가 거기에서 아주 명확한 지 모르겠다. 만약 당신이 이미 자바 코드 파일을 생성했다면, 위의 코드에서'file'은 실제 자바 파일이고, 여기에 주어진 코드는 정확하게 파싱하고 함께 작업 할 수있는 AST를 제공해야합니다 ... – snim2

0

원본을 처음부터 생성하는 경우, 임시 파일에 구문 분석 할 수있는 최소한의 소스를 작성하고 Ast에 수정 사항을 적용한 다음 텍스트 편집으로 해당 파일에 다시 쓸 수 있습니다 그렇지 않으면합니다. 그런 다음 출처를 읽으십시오. 그런 다음 원하는 곳으로 전송할 수 있습니다.

아마도 더 좋은 해결책이있을 수 있지만 이것이 효과가있을 수 있습니다.

첫째,이 같은 그것에서 AST, 생성하는 파일을 작성하지 왜
2

의견을 보내 주셔서 감사합니다. 그동안 AST의 String 표현을 생성하는 내부 클래스 "ASTFlattener"를 통해 소스 코드를 내보내는 방법을 발견했습니다. 이것은 내가 뭘 AST에서 만든 컴파일 단위 후 .... 나를 위해 꽤 잘

+0

String을 얻었 기 때문에 가장 일반적인 질문 인 "AST에서 String을 얻는 방법"에 대한 답은 가장 좋은 대답입니다. 파일을 전혀 필요로하지 않는 경우에 유용합니다 (중간 결과로 테스트 할 때 ..). – sevenforce

0

을 작동합니다 ... 다음 컴파일 단위 및 채우기 ...

AST ast = AST.newAST(AST.JLS4);  
CompilationUnit unit = ast.newCompilationUnit(); 

package.createCompilationUnit(className + ".java", unit.toString(), true, null); 

장소 :
package = IPackageFragment
className = String (생성 된 클래스 이름)
,536 AST
true => 힘이 대체unit =>CompilationUnit
null => 진행 모니터

1

난 그냥 같은 질문에 대한 답을 찾기 위해 노력했습니다. 하지만 이클립스, 자바 컴파일 가능한하는 AST를 prettyPrinting를 경험

ASTParser parser = ASTParser.newParser(AST.JLS4); 
parser.setCompilerOptions(....); 

Document document = new Document(""); 
parser.setSource(document.get().toCharArray()); 
CompilationUnit unit = (CompilationUnit)parser.createAST(null); 
unit.recordModifications(); 

TextEdit edits = unit.rewrite(document, null); 
edits.apply(document); 

// now write document.get() to file