2013-04-15 2 views
6

JDT로 일부 클래스를 생성 중입니다. Ctrl + Shift + F (소스> 포맷)를 선택하지 않고 열린 편집기에서 누른 것처럼 전체 ICompilationUnit을 포맷하고 싶습니다.JDT로 프로그래밍 방식으로 소스 코드 서식 지정

프로그래밍 방식으로 소스 코드를 형식화하기위한 JDT의 API에 대한 모든 포인터는 높이 평가됩니다.

추가 : 이렇게 시도했지만 코드는 변경되지 않았습니다. 내가 무슨 짓을하는거야?

private void formatUnitSourceCode(ICompilationUnit targetUnit, IProgressMonitor monitor) throws JavaModelException { 
    CodeFormatter formatter = ToolFactory.createCodeFormatter(null); 
    TextEdit formatEdit = formatter.format(CodeFormatter.K_COMPILATION_UNIT, targetUnit.getSource(), 0, targetUnit.getSource().length(), 0, null); 
    targetUnit.applyTextEdit(formatEdit, monitor); 
} 

답변

5

이것은 버그 일 수 있지만 Elcipse 4.2.2에서 JDK를 사용하면 파일에 TextEdit을 적용하기 위해 ICompilationUnit의 작업 복사본을 만들어야합니다.

public static void formatUnitSourceCode(ICompilationUnit unit, IProgressMonitor monitor) throws JavaModelException { 
    CodeFormatter formatter = ToolFactory.createCodeFormatter(null); 
    ISourceRange range = unit.getSourceRange(); 
    TextEdit formatEdit = formatter.format(CodeFormatter.K_COMPILATION_UNIT, unit.getSource(), range.getOffset(), range.getLength(), 0, null); 
    if (formatEdit != null && formatEdit.hasChildren()) { 
     unit.applyTextEdit(formatEdit, monitor); 
    } else { 
     monitor.done(); 
    } 
} 
2

generating some classes by using JDT 인 경우 "\ t"를 소스 코드에 넣을 수 있습니다. 또는 코드 포맷터를 사용하여 수행 한 작업과 비슷합니다. 나는 다음과 같은 코드를 테스트 한 :

public static void main(String[] args) 
{ 
    String code = "public class TestFormatter{public static void main(String[] args){System.out.println(\"Hello World\");}}"; 
    CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(null); 

    TextEdit textEdit = codeFormatter.format(CodeFormatter.K_UNKNOWN, code, 0,code.length(),0,null); 
    IDocument doc = new Document(code); 
    try { 
     textEdit.apply(doc); 
     System.out.println(doc.get()); 
    } catch (MalformedTreeException e) { 
     e.printStackTrace(); 
    } catch (BadLocationException e) { 
     e.printStackTrace(); 
    } 
} 

apply() 방법은 여기에 트릭을 수행합니다.

+0

이 도움이 파일을 자바 소스의 형식을 다음과 같은 방법을 사용하지만, 모든 해결 우아하게 넣은 사람은 아니다 :

targetUnit.becomeWorkingCopy(new SubProgressMonitor(monitor, 1)); ... do work on the source file ... formatUnitSourceCode(targetUnit, new SubProgressMonitor(monitor, 1)); targetUnit.commitWorkingCopy(true, new SubProgressMonitor(monitor, 1)); 

서식 자체는 다음과 같이 이루어집니다 원하는 형식의 I. e. 많은 매개 변수로 긴 메소드 선언을 수동으로 중단해야합니다. –

+0

매우 흥미로운 문제. 나는 네가하는 일을보고, 나는 나의 대답을 편집했다. 감사. – Ryan

+0

안녕하세요. Ryan, 위의 코드를 변경하여'CodeFormatter.K_UNKNOWN'을 사용했지만 위의 코드는 작동하지 않았습니다. 그런 다음'targetUnit.applyTextEdit' ('ICompilationUnit'의 내부 'IDocument'에'apply()'를 호출 한 후'targetUnit.getSource()'를 확인했습니다. 이상하게도 변경 사항이 적용된 것처럼 보입니다. 그러나 파일에는 적용되지 않습니다. 이 버그입니까, 아니면 뭔가 빠졌습니까? –

0

내가

public static void formatSource(ICompilationUnit cu, IProgressMonitor progressMonitor) throws JavaModelException{ 
    String source = cu.getSource(); 
    IJavaProject javaProject = cu.getJavaProject(); 

    Map options = javaProject.getOptions(true); 


      // Instantiate the default code formatter with the given options 
      final CodeFormatter codeFormatter = ToolFactory.createCodeFormatter(options); 


      final TextEdit edit = codeFormatter.format(
       CodeFormatter.K_COMPILATION_UNIT, // format a compilation unit 
       source, // source to format 
       0, // starting position 
       source.length(), // length 
       0, // initial indentation 
       System.getProperty("line.separator") // line separator 
      );   

      cu.becomeWorkingCopy(progressMonitor); 
      try { 
       cu.applyTextEdit(edit, progressMonitor); 
       //cu.reconcile(); 
       cu.commitWorkingCopy(true, progressMonitor); 
       //cu.save(progressMonitor, false); 

       JavaUI.openInEditor(cu); 


      } catch (MalformedTreeException e) { 
       e.printStackTrace(); 
      } catch (PartInitException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

} 
관련 문제