package org.rubypeople.rdt.internal.formatter;
import java.io.StringWriter;
import org.eclipse.text.edits.ReplaceEdit;
import org.eclipse.text.edits.TextEdit;
import org.jruby.ast.Node;
import org.rubypeople.rdt.core.formatter.CodeFormatter;
import org.rubypeople.rdt.core.formatter.EditableFormatHelper;
import org.rubypeople.rdt.core.formatter.ReWriteVisitor;
import org.rubypeople.rdt.core.formatter.ReWriterContext;
import org.rubypeople.rdt.core.formatter.ReWriterFactory;
import org.rubypeople.rdt.internal.core.parser.RubyParser;
import org.rubypeople.rdt.internal.core.parser.RubyParserWithComments;
public class ASTBasedCodeFormatter extends CodeFormatter
{
@Override
public TextEdit format(int kind, String source, int offset, int length, int indentationLevel, String lineSeparator)
{
StringWriter writer = new StringWriter();
EditableFormatHelper helper = new EditableFormatHelper();
helper.setLineDelimiter(lineSeparator);
helper.setSpacesBeforeAndAfterAssignments(true);
helper.setAlwaysParanthesizeMethodDefs(true);
source = source.substring(offset, length);
ReWriterContext context = new ReWriterContext(writer, source, helper);
ReWriterFactory factory = new ReWriterFactory(context);
ReWriteVisitor visitor = factory.createReWriteVisitor();
RubyParser parser = new RubyParserWithComments();
Node root = parser.parse(source).getAST();
root.accept(visitor);
writer.append(lineSeparator);
String result = writer.getBuffer().toString();
return new ReplaceEdit(offset, length, result);
}
}