2013-04-15 73 views
6

我正在使用JDT生成一些類。之後,我想格式化整個ICompilationUnit,就好像我在沒有選擇的情況下在打開的編輯器中按Ctrl + Shift + F(Source> Format)。通過編程與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時,需要創建ICompilationUnit的工作副本,以便將TextEdit應用於該文件。

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)); 

的格式本身是這樣完成的:

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

這會有所幫助,但它好好嘗試一下完美地解決所有想要的格式。 I. e。你需要用很多參數手動打破長方法聲明。 –

+0

非常有趣的問題。我明白你在做什麼,我只是編輯了我的答案。謝謝。 – Ryan

+0

嗨瑞安,我改變了我的代碼上面使用'CodeFormatter.K_UNKNOWN',但那也沒有工作。之後,我在調用'targetUnit.applyTextEdit'(在'ICompilationUnit'的內部'IDocument'上做'apply()''')之後,檢查了'targetUnit.getSource()',奇怪的是這些改變似乎被應用了。但它們不適用於該文件。這是一個錯誤,還是我錯過了什麼? –

0

我用下面的方法來格式化一個Java源文件

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(); 
      } 

}