Search code examples
javaeclipseeclipse-jdt

Eclipse JDT: Call 'correct indentation' programmatically?


I am working on an Eclipse plugin that modifies Java code in a user's project.

Basically the result of this plugin is that Java annotations are added to some methods, so

void foo() { ... }

becomes

@MyAnnotation
void foo() { ... }

Except that it doesn't quite look like that; the indentation on the newly inserted annotation is wack (specifically, the new annotation is all the way to the left-hand side of the line). I'd like to make all my changes to the file, and then programmatically call "Correct Indentation."

Does anyone know how to do this? I can't find the answer here or in the JDT forums, and all the classes that look relevant (IndentAction, JavaIndenter) are in internal packages which I'm not supposed to use...

Thanks!


Solution

  • Well I think I may have figured out the solution I want. Guess I should have spend more time searching before asking... but for future reference, here's what I did! The good stuff was in the ToolFactory...

    import org.eclipse.jdt.core.ToolFactory;
    import org.eclipse.jdt.core.formatter.CodeFormatter;
    import org.eclipse.jdt.core.ISourceRange;
    import org.eclipse.text.edits.TextEdit;
    import org.eclipse.jdt.core.ICompilationUnit;
    
    ...
    
    ICompilationUnit cu = ...
    
    ...
    
    CodeFormatter formatter = ToolFactory.createCodeFormatter(null);
    ISourceRange range = cu.getSourceRange();
    TextEdit indent_edit =
      formatter.format(CodeFormatter.K_COMPILATION_UNIT, 
        cu.getSource(), range.getOffset(), range.getLength(), 0, null);
    cu.applyTextEdit(indent_edit, null);
    
    cu.reconcile();
    

    This reformats the entire file. There are other options if you need to reformat less...