Search code examples
javaeclipseeclipse-jdt

Formatting Source Code programmatically with JDT


I am generating some classes with JDT. Afterwards I would like to format the whole ICompilationUnit, just as if I pressed Ctrl+Shift+F (Source > Format) in an open Editor without a selection.

Any pointers for the API in JDT to format the source code programmatically is highly appreciated.

Addition: I tried it like this, but the code isn't changed. What am I mssing?

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

Solution

  • This could be a bug, but using the JDK in Elcipse 4.2.2, it is necessary to create a working copy of the ICompilationUnit in order to apply a TextEdit to the file.

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

    The formatting itself is done like this:

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