2010-05-20 6 views
6

Ich arbeite an einem Eclipse-Plugin, das Java-Code in einem Benutzerprojekt ändert.Eclipse JDT: Rufen Sie 'richtigen Einzug' programmgesteuert auf?

Grundsätzlich ist das Ergebnis dieser Plugin ist, dass Java-Annotationen zu einigen Methoden hinzugefügt werden, so

void foo() { ... } 

wird

@MyAnnotation 
void foo() { ... } 

Abgesehen davon, dass es nicht ganz so aussehen wird; Die Einrückung auf der neu eingefügten Annotation ist wack (die neue Annotation befindet sich ganz auf der linken Seite der Zeile). Ich möchte alle meine Änderungen an der Datei vornehmen und programmgesteuert dann "Correct Indentation" aufrufen.

Weiß jemand, wie man das macht? Ich kann die Antwort hier oder in den JDT-Foren nicht finden, und alle relevanten Klassen (IndentAction, JavaIndenter) sind in internen Paketen, die ich nicht verwenden soll ...

Vielen Dank!

+0

Sieht aus wie ein guter Ausgangspunkt sein kann: org.eclipse.jdt.core.formatter.CodeFormatterApplication –

Antwort

6

Nun, ich denke, ich habe vielleicht die Lösung, die ich will. Ich denke, ich hätte mehr Zeit mit der Suche verbringen sollen, bevor ich gefragt habe ... aber für eine zukünftige Referenz, hier ist, was ich getan habe! Das gute Zeug war in der 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(); 

Dies formatiert die gesamte Datei neu. Es gibt andere Optionen, wenn Sie weniger umformatieren müssen ...

+1

Ich denke, das wird den Standard-Formatierer verwenden. Hast du herausgefunden, wie man einen anderen Formatierer spezifiziert? –

-1

Es ist wahrscheinlich einfacher, den Einzug hinzuzufügen, während Sie den Java-Code verarbeiten.

Ihr Eclipse-Plugin musste die void foo() { ... } Zeile lesen, um die @MyAnnotation, oder? Holen Sie einfach die Einrückung aus der Java-Zeile und hängen Sie Ihre Anmerkung an die Einrückung an.

+0

Dank Gilbert, aber eigentlich habe ich nicht gelesen, die Linie ... Ich bekomme den Speicherort der Methode von MethodDeclaration.getStartPosition() wo MethodDeclaration ist in dem Paket org.eclipse.jdt.core.dom. Jetzt könnte ich zurückgehen und kopieren, was vor der Methodendeklaration vom Anfang der Zeile ist, aber ich will keinen Haufen Müll kopieren, wenn der Programmierer eine alternative Formatierung verwendet ... –

+0

Ok, ich habe diese nicht gesehen org.eclipse.jdt Pakete vorher. Wie fügen Sie Ihre Anmerkung zum Java-Quellcode hinzu? –