Formatting Source Code programmatically with JDT

前端 未结 3 1423
-上瘾入骨i
-上瘾入骨i 2021-01-05 09:09

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 wi

相关标签:
3条回答
  • 2021-01-05 09:45

    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 讨论(0)
  • 2021-01-05 09:53

    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-05 09:56

    When generating some classes by using JDT, you can put "\t"s in your source code. Or like what you did, using code formatter. I have tested 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.

    0 讨论(0)
提交回复
热议问题