blob: ba9c8a01bc9e6cd4864e352133b2e34056356662 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.ruta.ide.formatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.antlr.runtime.CommonToken;
import org.apache.uima.ruta.ide.parser.ast.ActionFactory;
import org.apache.uima.ruta.ide.parser.ast.ComposedRuleElement;
import org.apache.uima.ruta.ide.parser.ast.ConditionFactory;
import org.apache.uima.ruta.ide.parser.ast.RutaAbstractDeclaration;
import org.apache.uima.ruta.ide.parser.ast.RutaAction;
import org.apache.uima.ruta.ide.parser.ast.RutaBinaryArithmeticExpression;
import org.apache.uima.ruta.ide.parser.ast.RutaBlock;
import org.apache.uima.ruta.ide.parser.ast.RutaBooleanNumberExpression;
import org.apache.uima.ruta.ide.parser.ast.RutaCondition;
import org.apache.uima.ruta.ide.parser.ast.RutaConditionConstants;
import org.apache.uima.ruta.ide.parser.ast.RutaDeclarationsStatement;
import org.apache.uima.ruta.ide.parser.ast.RutaDeclareDeclarationsStatement;
import org.apache.uima.ruta.ide.parser.ast.RutaExpression;
import org.apache.uima.ruta.ide.parser.ast.RutaFeatureDeclaration;
import org.apache.uima.ruta.ide.parser.ast.RutaListExpression;
import org.apache.uima.ruta.ide.parser.ast.RutaLogAction;
import org.apache.uima.ruta.ide.parser.ast.RutaPackageDeclaration;
import org.apache.uima.ruta.ide.parser.ast.RutaQuantifierLiteralExpression;
import org.apache.uima.ruta.ide.parser.ast.RutaRegExpRule;
import org.apache.uima.ruta.ide.parser.ast.RutaRule;
import org.apache.uima.ruta.ide.parser.ast.RutaRuleElement;
import org.apache.uima.ruta.ide.parser.ast.RutaStringExpression;
import org.apache.uima.ruta.ide.parser.ast.RutaStructureAction;
import org.apache.uima.ruta.ide.parser.ast.RutaTypeConstants;
import org.apache.uima.ruta.ide.parser.ast.RutaTypeDeclaration;
import org.apache.uima.ruta.ide.parser.ast.RutaVariableReference;
import org.eclipse.dltk.ast.ASTListNode;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.ASTVisitor;
import org.eclipse.dltk.ast.declarations.Declaration;
import org.eclipse.dltk.ast.declarations.MethodDeclaration;
import org.eclipse.dltk.ast.declarations.ModuleDeclaration;
import org.eclipse.dltk.ast.declarations.TypeDeclaration;
import org.eclipse.dltk.ast.expressions.Expression;
import org.eclipse.dltk.ast.expressions.StringLiteral;
import org.eclipse.dltk.ast.statements.Block;
import org.eclipse.dltk.ast.statements.Statement;
import org.eclipse.dltk.formatter.FormatterDocument;
import org.eclipse.dltk.formatter.IFormatterIndentGenerator;
/**
* Formats a document.<br>
* Use the append methods within the visit methods to preserve the comments.
*
*
*/
public class RutaFormattedPrinter extends ASTVisitor {
private FormatterDocument document;
private String lineDelimiter;
private static final String SEMI = ";";
private static final String CONCAT = " + ";
private static final String CONCAT_RULES = "% ";
private static final String COMMA = ",";
private static final int NL_DECLS_COUNT = 2;
private static final String CURLY_OPEN = "{";
private static final String CURLY_CLOSE = "}";
private static final String BRACK_OPEN = "[";
private static final String BRACK_CLOSE = "]";
private static final String THEN = "->";
private static final String PAR_OPEN = "(";
private static final String PAR_CLOSE = ")";
private static final String EQUALS = " = ";
private IFormatterIndentGenerator indentGenerator;
private StringBuilder output;
private List<CommonToken> comments;
private Iterator<CommonToken> iterator;
private CommonToken currentComment;
private int indentLevel = 0;
private int lines_before_long_declarations;
private int maxLineLength;
private boolean inBlockDeclaration = false;
private Map<Integer, Object> lastStatements = new HashMap<Integer, Object>();
private int commentLineSince = 0;
// hotfix: 0 = false, 1 = first rule element, 3 = not first rule element
private int inLargeRule = 0;
private boolean retainLB = true;
public RutaFormattedPrinter(FormatterDocument document, String lineDelimiter,
IFormatterIndentGenerator indentGenerator, List<CommonToken> comments, RutaFormatter tmf) {
this.document = document;
this.lineDelimiter = lineDelimiter;
this.indentGenerator = indentGenerator;
this.output = new StringBuilder();
// read format preferences
this.lines_before_long_declarations = tmf
.getInt(RutaFormatterConstants.LINES_BEFORE_LONG_DECLARATIONS);
this.maxLineLength = tmf.getInt(RutaFormatterConstants.MAX_LINE_LENGTH);
// comments
this.comments = comments == null ? new ArrayList<CommonToken>() : comments;
iterator = this.comments.iterator();
this.currentComment = iterator.hasNext() ? iterator.next() : null;
}
public String getOutput() {
appendLeftComments();
return this.output.toString();
}
@Override
public boolean visit(Statement s) throws Exception {
appendComments(s);
fillNewLines(s);
if (s instanceof RutaDeclarationsStatement) {
// append new lines before LONG DECLARATIONS
RutaDeclarationsStatement decls = (RutaDeclarationsStatement) s;
// if (decls.getDeclarationsCount() > NL_DECLS_COUNT) {
// for (int i = 0; i < lines_before_long_declarations; i++) {
// appendNewLine();
// }
// }
// format declarations:
// print type token
appendIntoNewLine(document.get(decls.getTypeTokenStart(), decls.getTypeTokenEnd()) + " ");
// print parent if available
if (s instanceof RutaDeclareDeclarationsStatement) {
RutaDeclareDeclarationsStatement dds = (RutaDeclareDeclarationsStatement) s;
ASTNode p = dds.getParent();
if (p != null) {
append(p);
append(" ");
}
}
// print identifiers
List<RutaAbstractDeclaration> declarations = decls.getDeclarations();
traverseAstNodes(declarations);
// print init expr
if (decls.getInitExpr() != null) {
append(EQUALS);
decls.getInitExpr().traverse(this);
}
appendStatementEnd();
return false;
}
if (s instanceof RutaRegExpRule) {
// traverse into container RutaRule to format RuleElements
if (!inBlockDeclaration) {
appendNewLine();
}
// Rules always just consists of RuleElements: whitespace separation
if (s.sourceEnd() - s.sourceStart() > 2 * maxLineLength) {
inLargeRule = 1;
indentLevel++;
}
RutaRule rule = (RutaRule) s;
List<Expression> expressions = rule.getExpressions();
if (expressions != null && !expressions.isEmpty()) {
append(expressions.get(0));
append(" " + THEN + " ");
if (expressions.size() > 1) {
for (int i = 1; i < expressions.size(); i++) {
Expression expression = expressions.get(i);
if (expression.getKind() == RutaTypeConstants.RUTA_TYPE_N && i < expressions.size() - 1) {
append(expression);
append(EQUALS);
append(expressions.get(++i));
} else {
append(expression);
}
if (i < expressions.size() - 1) {
append(COMMA + " ");
}
}
}
}
if (!inBlockDeclaration) {
appendStatementEnd();
}
if (inLargeRule > 0) {
indentLevel--;
inLargeRule = 0;
}
return false;
}
if (s instanceof RutaRule) {
// traverse into container RutaRule to format RuleElements
if (!inBlockDeclaration) {
appendNewLine();
}
// Rules always just consists of RuleElements: whitespace separation
if (s.sourceEnd() - s.sourceStart() > 2 * maxLineLength) {
inLargeRule = 1;
indentLevel++;
}
RutaRule rule = (RutaRule) s;
List<Expression> expressions = rule.getExpressions();
String sep = "";
traverseAstNodes(expressions, sep);
if (!inBlockDeclaration) {
appendStatementEnd();
}
if (inLargeRule > 0) {
indentLevel--;
inLargeRule = 0;
}
return false;
// return true;
}
if (s instanceof RutaTypeDeclaration) {
RutaTypeDeclaration rtd = (RutaTypeDeclaration) s;
append(document.get(rtd.getNameStart(), rtd.getNameEnd()));
List<RutaFeatureDeclaration> features = ((RutaTypeDeclaration) s).getFeatures();
if (features != null && !features.isEmpty()) {
append(PAR_OPEN);
for (RutaFeatureDeclaration each : features) {
append(each.getType());
append(" ");
append(each.getName());
if (features.indexOf(each) < features.size() - 1) {
append(COMMA + " ");
}
}
append(PAR_CLOSE);
}
return false;
}
if (s instanceof Declaration && !(s instanceof RutaPackageDeclaration)) {
append(s);
return false;
}
if (s instanceof RutaPackageDeclaration) {
append(s);
appendStatementEnd();
return false;
}
// append SEMIs for all other statements
appendIntoNewLine(s);
appendStatementEnd();
return false;
}
private void fillNewLines(Object s) {
Object last = lastStatements.get(indentLevel);
// if (last == null && indentLevel > 0) {
// last = lastStatements.get(indentLevel - 1);
// }
if (last != null && retainLB) {
int start = 0;
int end = 0;
if (s instanceof Statement) {
end = ((ASTNode) s).sourceStart();
} else if (s instanceof CommonToken) {
end = ((CommonToken) s).getStartIndex();
}
if (last instanceof Statement) {
start = ((ASTNode) last).sourceEnd() + 1;
} else if (last instanceof CommonToken) {
start = ((CommonToken) last).getStopIndex();
}
if (start < end) {
String string = document.get(start, end);
String replaceAll = string.replaceAll(lineDelimiter, "");
double d = (string.length() - replaceAll.length()) / lineDelimiter.length()
- commentLineSince;
if (s instanceof CommonToken && commentLineSince == 0) {
d++;
}
for (int i = 1; i < d; i++) {
appendNewLine();
}
if (d < 2 && s instanceof RutaDeclarationsStatement && !(last instanceof Declaration)) {
appendNewLine();
}
commentLineSince = 0;
}
} else if (inBlockDeclaration || s instanceof CommonToken) {
appendNewLine();
}
lastStatements.put(indentLevel, s);
}
@Override
public boolean endvisit(Statement s) throws Exception {
// if (s instanceof RutaRule) {
// append(SEMI);
// return true;
// }
return super.endvisit(s);
}
@Override
public boolean visit(Expression s) throws Exception {
// traverse Block (first child of root element:
if (s instanceof Block) {
return true;
}
if (s instanceof ComposedRuleElement) {
ComposedRuleElement cre = (ComposedRuleElement) s;
List<Expression> elements = cre.getElements();
// int length = cre.sourceEnd() - cre.sourceStart();
if (inLargeRule == 2) {
inLargeRule = 4;
}
if(cre.isAfterConcat()) {
append(CONCAT_RULES);
}
append(PAR_OPEN);
String sep = "";
if (cre.isDisjunctive() != null) {
if (cre.isDisjunctive()) {
sep = " |";
} else {
sep = " &";
}
}
traverseAstNodes(elements, sep);
append(PAR_CLOSE);
appendRuleElement(cre);
if (inLargeRule == 4) {
inLargeRule = 1;
}
return false;
}
// special format for RuleElements:
if (s instanceof RutaRuleElement) {
RutaRuleElement ruleEl = (RutaRuleElement) s;
if (inLargeRule == 2) {
appendNewLine();
} else if (inLargeRule == 1) {
inLargeRule = 2;
}
if(ruleEl.isAfterConcat()) {
append(CONCAT_RULES);
}
appendRuleElement(ruleEl);
return false;
}
// special format for actions
if (s instanceof RutaAction) {
RutaAction a = (RutaAction) s;
String name = document.get(a.getNameStart(), a.getNameEnd());
append(name);
List<? extends ASTNode> childs = a.getChilds();
if (childs != null && !childs.isEmpty()) {
boolean addPar = !a.getName().equals(ActionFactory.IMPLICIT);
if (addPar) {
append(PAR_OPEN);
}
// special format for create
if (a instanceof RutaStructureAction) {
if (name.equals("TRIE")) {
printStructureAction2(a);
} else {
printStructureAction(a);
}
} else {
traverseAstNodes(childs);
}
// special format for log
if (a instanceof RutaLogAction && ((RutaLogAction) a).isLogLevelAssigned()) {
appendSeparator(COMMA);
RutaLogAction logAction = (RutaLogAction) a;
append(logAction.getLogLevelStart(), logAction.getLogLevelEnd());
}
if (addPar) {
append(PAR_CLOSE);
}
}
return false;
}
// special format for conditions
if (s instanceof RutaCondition) {
RutaCondition c = (RutaCondition) s;
append(document.get(c.getNameStart(), c.getNameEnd()));
List<? extends ASTNode> childs = c.getChilds();
// minus is a condition without parameter parantheses:
boolean addPar = !c.getName().equals(ConditionFactory.IMPLICIT)
&& s.getKind() != RutaConditionConstants.COND_MINUS && childs != null
&& !childs.isEmpty();
if (addPar) {
append(PAR_OPEN);
}
traverseAstNodes(childs);
if (addPar) {
append(PAR_CLOSE);
}
return false;
}
// special format for boolean number expressions
if (s instanceof RutaBooleanNumberExpression) {
RutaBooleanNumberExpression tmbne = (RutaBooleanNumberExpression) s;
append(PAR_OPEN);
if (tmbne.getE1() != null) {
tmbne.getE1().traverse(this);
}
append(tmbne.getOperator());
if (tmbne.getE2() != null) {
tmbne.getE2().traverse(this);
}
append(PAR_CLOSE);
return false;
}
// special format for string expressions
if (s instanceof RutaStringExpression && ((RutaExpression) s).getExpression() != null) {
RutaStringExpression tmse = (RutaStringExpression) s;
List<?> childs = tmse.getExpression().getChilds();
Object object2 = childs.get(0);
if (object2 instanceof ASTNode) {
ASTNode astnode = (ASTNode) object2;
List<?> childs2 = astnode.getChilds();
for (Object object : childs2) {
if (object instanceof RutaExpression) {
RutaExpression expr = (RutaExpression) object;
// if (expr.isInParantheses()) {
// append(PAR_OPEN);
// append(expr);
// append(PAR_CLOSE);
// } else {
append(expr);
// }
} else if (object instanceof StringLiteral) {
StringLiteral sl = (StringLiteral) object;
String value = sl.getValue();
append(value);
} else if (object instanceof RutaVariableReference) {
RutaVariableReference vr = (RutaVariableReference) object;
append(vr.getName());
}
if (childs2.indexOf(object) < childs2.size() - 1) {
append(CONCAT);
}
}
} else {
append(s);
}
return false;
}
if (s instanceof RutaListExpression) {
RutaListExpression le = (RutaListExpression) s;
append(CURLY_OPEN);
ASTListNode exprs = le.getExprs();
traverseAstNodes(exprs.getChilds());
append(CURLY_CLOSE);
return false;
}
// special format for paranthesed expressions: (expression)
// if (s instanceof RutaExpression && ((RutaExpression) s).isInParantheses()) {
// append(PAR_OPEN);
// append(s);
// append(PAR_CLOSE);
// return false;
// }
if (s instanceof RutaBinaryArithmeticExpression) {
RutaBinaryArithmeticExpression ba = (RutaBinaryArithmeticExpression) s;
String operator = ba.getOperator();
append(operator);
append(PAR_OPEN);
traverseAstNodes(ba.getChilds());
append(PAR_CLOSE);
}
append(s);
return false;
}
/**
* structure actions like CREATE, FILL with assignments.
*
* @param a
*/
private void printStructureAction(RutaAction a) {
RutaStructureAction tmca = (RutaStructureAction) a;
// structure
if (tmca.getStructure() != null) {
append(tmca.getStructure());
}
append(COMMA);
append(" ");
// number expressions
List<ASTNode> indices = tmca.getExpressions();
if (indices != null) {
traverseAstNodes(indices);
if (!indices.isEmpty()) {
append(COMMA);
append(" ");
}
}
// assignments
Map<Expression, Expression> assignments = tmca.getAssignments();
Iterator it = assignments.entrySet().iterator();
while (it.hasNext()) {
if (assignments.size() > 3) {
appendNewLineAndIndent();
}
Map.Entry pairs = (Map.Entry) it.next();
try {
((Expression) pairs.getKey()).traverse(this);
} catch (Exception e) {
e.printStackTrace();
}
append(EQUALS);
try {
((Expression) pairs.getValue()).traverse(this);
} catch (Exception e) {
e.printStackTrace();
}
if (it.hasNext()) {
output.append(COMMA);
append(" ");
}
}
}
private void printStructureAction2(RutaAction a) {
RutaStructureAction tmca = (RutaStructureAction) a;
Map<Expression, Expression> assignments = tmca.getAssignments();
Iterator it = assignments.entrySet().iterator();
while (it.hasNext()) {
if (assignments.size() > 3) {
appendNewLineAndIndent();
}
Map.Entry pairs = (Map.Entry) it.next();
try {
((Expression) pairs.getKey()).traverse(this);
} catch (Exception e) {
e.printStackTrace();
}
append(EQUALS);
try {
((Expression) pairs.getValue()).traverse(this);
} catch (Exception e) {
e.printStackTrace();
}
output.append(COMMA);
append(" ");
}
// structure
if (tmca.getStructure() != null) {
append(tmca.getStructure());
}
append(COMMA);
append(" ");
// number expressions
List<ASTNode> indices = tmca.getExpressions();
if (indices != null) {
traverseAstNodes(indices);
}
// assignments
}
@Override
public boolean endvisit(Expression s) throws Exception {
return super.endvisit(s);
}
/**
* @param ruleEl
* @param conditions
* @param actions
* @throws Exception
*/
private void appendRuleElement(RutaRuleElement ruleEl) throws Exception {
// if (ruleEl instanceof ComposedRuleElement) {
// ComposedRuleElement cre = (ComposedRuleElement) ruleEl;
// List<Expression> elements = cre.getElements();
// append(PAR_OPEN);
// for (Expression expression : elements) {
//
// if (expression instanceof RutaRuleElement) {
// RutaRuleElement re = (RutaRuleElement) expression;
// appendRuleElement(re);
// }
// if (elements.indexOf(expression) < elements.size() - 1) {
// append(" ");
// }
//
// }
// append(PAR_CLOSE);
// } else
if (ruleEl.getHead() != null) {
append(ruleEl.getHead());
}
if(ruleEl.isWildcard()) {
append("#");
}
List<RutaCondition> conditions = ruleEl.getConditions();
List<RutaAction> actions = ruleEl.getActions();
// don't print {->} for empty rule elements
// print Quantifiers
List<? extends ASTNode> quantifierExpressions = ruleEl.getQuantifierExpressions();
if (quantifierExpressions != null && !quantifierExpressions.isEmpty()) {
if (quantifierExpressions.size() == 1) {
ASTNode astNode = quantifierExpressions.get(0);
if (astNode instanceof RutaQuantifierLiteralExpression) {
append(astNode);
} else {
append(BRACK_OPEN);
append(astNode);
append(BRACK_CLOSE);
}
} else if (quantifierExpressions.size() == 2) {
if (quantifierExpressions.get(1) instanceof RutaQuantifierLiteralExpression) {
append(BRACK_OPEN);
append(quantifierExpressions.get(0));
append(BRACK_CLOSE);
append(quantifierExpressions.get(1));
} else {
append(BRACK_OPEN);
append(quantifierExpressions.get(0));
append(COMMA + " ");
append(quantifierExpressions.get(1));
append(BRACK_CLOSE);
}
} else if (quantifierExpressions.size() == 3) {
append(BRACK_OPEN);
append(quantifierExpressions.get(0));
append(COMMA + " ");
append(quantifierExpressions.get(1));
append(BRACK_CLOSE);
append(quantifierExpressions.get(2));
}
}
if (!inBlockDeclaration && conditions == null && actions == null) {
return;
}
if (!inBlockDeclaration
&& ((conditions == null && actions.isEmpty()) || actions == null
&& (conditions != null) && conditions.isEmpty())) {
return;
}
append(CURLY_OPEN);
// print Conditions
if (conditions != null && !conditions.isEmpty()) {
traverseAstNodes(conditions);
}
if (conditions != null && !conditions.isEmpty()) {
}
// print Actions
if (actions != null && !actions.isEmpty()) {
if (conditions != null && !conditions.isEmpty()) {
append(" " + THEN + " ");
} else {
append(THEN + " ");
}
traverseAstNodes(actions);
}
append(CURLY_CLOSE);
if(ruleEl.getInlinedRules()!= null && !ruleEl.getInlinedRules().isEmpty()) {
String inlineMode = ruleEl.getInlineMode();
append(inlineMode);
append(CURLY_OPEN);
indentLevel++;
List<RutaRule> inlinedRules = ruleEl.getInlinedRules();
for (RutaRule rutaRule : inlinedRules) {
visit(rutaRule);
}
indentLevel--;
appendIntoNewLine(CURLY_CLOSE);
}
}
/**
* @param astnodes
*/
@SuppressWarnings("unchecked")
private void traverseAstNodes(List<? extends ASTNode> astnodes) {
traverseAstNodes(astnodes, COMMA);
}
/**
* @param astnodes
*/
@SuppressWarnings("unchecked")
private void traverseAstNodes(List<? extends ASTNode> astnodes, String separator) {
if (astnodes == null) {
return;
}
Iterator iterator2 = astnodes.iterator();
while (iterator2.hasNext()) {
ASTNode node = (ASTNode) iterator2.next();
try {
node.traverse(this);
} catch (Exception e) {
e.printStackTrace();
}
if (iterator2.hasNext()) {
appendSeparator(separator);
}
}
}
private void appendSeparator(String separator) {
output.append(separator);
append(" ");
}
@Override
public boolean visit(MethodDeclaration s) throws Exception {
appendComments(s);
fillNewLines(s);
// Statement last = lastStatements.get(indentLevel);
// // if (last == null && indentLevel > 0) {
// // last = lastStatements.get(indentLevel - 1);
// // }
// if (last != null && retainLB) {
// int start = last.sourceEnd() + 1;
// int end = s.sourceStart();
// if (start < end) {
// String string = document.get(start, end);
// String replaceAll = string.replaceAll(lineDelimiter, "");
// double d = (string.length() - replaceAll.length()) / lineDelimiter.length()
// - commentLineSince;
// for (int i = 1; i < d; i++) {
// appendNewLine();
// }
// commentLineSince = 0;
// }
// }
if (s instanceof RutaBlock) {
RutaBlock b = (RutaBlock) s;
appendIntoNewLine("BLOCK(");
append(b.getName());
append(") ");
this.inBlockDeclaration = true;
if (b.getRule() != null) {
b.getRule().traverse(this);
}
this.inBlockDeclaration = false;
append(" {");
indentLevel++;
b.getBody().traverse(this);
lastStatements.put(indentLevel, null);
indentLevel--;
lastStatements.put(indentLevel, s);
appendIntoNewLine("}");
appendNewLine();
return false;
}
return super.visit(s);
}
@Override
public boolean visit(ModuleDeclaration s) throws Exception {
return true;
}
@Override
public boolean visit(TypeDeclaration s) throws Exception {
return super.visit(s);
}
@Override
public boolean visitGeneral(ASTNode node) throws Exception {
return super.visitGeneral(node);
}
private void append(int begin, int end) {
append(document.get(begin, end));
}
private void append(String string) {
if (outputPosInLine() + string.length() > maxLineLength) {
appendNewLine();
indentGenerator.generateIndent(1, output);
}
output.append(string);
}
private void appendIntoNewLine(String string) {
appendNewLine();
output.append(string);
}
private void append(ASTNode s) {
appendComments(s);
// this.output.
append(document.get(s.sourceStart(), s.sourceEnd()));
}
private void appendIntoNewLine(ASTNode s) {
appendComments(s);
appendNewLine();
append(s);
}
private void appendNewLine() {
output.append(lineDelimiter);
indentGenerator.generateIndent(indentLevel, output);
}
private void appendNewLineAndIndent() {
output.append(lineDelimiter);
indentGenerator.generateIndent(indentLevel + 1, output);
}
private void appendStatementEnd() {
output.append(SEMI);
}
/**
* @param s
* @return
*/
private int appendComments(ASTNode s) {
return appendComments(s.sourceStart());
}
/**
* @param start
* @return
*/
private int appendComments(int start) {
while (currentComment != null && currentComment.getStartIndex() < start) {
String text = currentComment.getText().trim();
fillNewLines(currentComment);
append("" + text);
currentComment = iterator.hasNext() ? iterator.next() : null;
commentLineSince++;
}
return start;
}
private void appendLeftComments() {
while (currentComment != null) {
append(currentComment.getText());
currentComment = iterator.hasNext() ? iterator.next() : null;
}
}
private int outputPosInLine() {
String out = output.toString();
int lastIndexOf = out.lastIndexOf("\n");
return out.length() - lastIndexOf;
}
}