Formatting source code programmatically using JDT

I am creating some classes with JDT. Subsequently, I would like to format the entire ICompilationUnit, as if I had pressed Ctrl + Shift + F (Source> Format) in an open editor without selection.

Any API pointers in JDT for formatting source code are programmatically appreciated.

Addition: I tried it like this, but the code was not changed. What am I doing?

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); } 
+6
source share
3 answers

This may be a mistake, but using the JDK in Elcipse 4.2.2 you need to create a working copy of ICompilationUnit to apply 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)); 

Formatting itself is performed as follows:

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

When generating some classes using JDT , you can put "\ t" in the source code. Or like what you did using code formatting. I checked the following code:

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

The apply() method does the trick here.

+2
source

I use the following method to format a Java source file

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

All Articles