package org.eclipse.dltk.tcl.parser.printer;
import java.util.List;
import org.eclipse.dltk.tcl.ast.ComplexString;
import org.eclipse.dltk.tcl.ast.Script;
import org.eclipse.dltk.tcl.ast.StringArgument;
import org.eclipse.dltk.tcl.ast.Substitution;
import org.eclipse.dltk.tcl.ast.TclArgumentKind;
import org.eclipse.dltk.tcl.ast.TclArgument;
import org.eclipse.dltk.tcl.ast.TclArgumentList;
import org.eclipse.dltk.tcl.ast.TclCommand;
import org.eclipse.dltk.tcl.ast.VariableReference;
import org.eclipse.emf.common.util.EList;
public class SimpleCodePrinter {
private static final String SPACE = " "; //$NON-NLS-1$
private static final String QUOTE = "\""; //$NON-NLS-1$
private static final String LEFT_BRACKET = "["; //$NON-NLS-1$
private static final String RIGHT_BRACKET = "]"; //$NON-NLS-1$
private static final String LEFT_BRACE = "{"; //$NON-NLS-1$
private static final String RIGHT_BRACE = "}"; //$NON-NLS-1$
public static String getArgumentString(TclArgument arg, int pos) {
return getArgumentString(arg, pos, true);
}
/**
* @since 2.0
*/
public static String getArgumentString(TclArgument arg, int pos,
boolean addSpaces) {
StringBuilder buff = new StringBuilder();
int start = arg.getStart();
if (addSpaces && start > pos) {
for (int i = 0; i < (start - pos); ++i) {
buff.append(SPACE);
}
}
if (arg instanceof StringArgument) {
// Simple absolute or relative source'ing.
StringArgument argument = (StringArgument) arg;
String value = argument.getValue();
// value = nameFromBlock(value, '\"', '\"');
// value = nameFromBlock(value, '{', '}');
buff.append(value);
return buff.toString();
} else if (arg instanceof ComplexString) {
ComplexString carg = (ComplexString) arg;
// if (carg.getValue() != null) {
// return carg.getValue();
// }
EList<TclArgument> eList = carg.getArguments();
if (carg.getKind() == TclArgumentKind.BRACED) {
buff.append(LEFT_BRACE);
} else if (carg.getKind() == TclArgumentKind.QUOTED) {
buff.append(QUOTE);
}
for (TclArgument tclArgument : eList) {
buff.append(getArgumentString(tclArgument, pos + buff.length(),
addSpaces));
}
int end = arg.getEnd() - 1;
if (carg.getKind() == TclArgumentKind.SIMPLE) {
end++;
}
int npos = pos + buff.length();
if (addSpaces && end > npos) {
for (int i = 0; i < ((end) - npos); ++i) {
buff.append(SPACE);
}
}
if (carg.getKind() == TclArgumentKind.BRACED) {
buff.append(RIGHT_BRACE);
} else if (carg.getKind() == TclArgumentKind.QUOTED) {
buff.append(QUOTE);
}
return buff.toString();
} else if (arg instanceof Script) {
Script st = (Script) arg;
buff.append(LEFT_BRACE);
boolean added = false;
for (TclCommand command : st.getCommands()) {
if (!added) {
added = true;
} else {
buff.append("\n "); //$NON-NLS-1$
}
buff.append(getCommandString(command, pos + buff.length(),
addSpaces));
}
int end = arg.getEnd();
int npos = pos + buff.length();
if (addSpaces && end - 1 > npos) {
for (int i = 0; i < ((end - 1) - npos); ++i) {
buff.append(SPACE);
}
}
buff.append(RIGHT_BRACE);
return buff.toString();
} else if (arg instanceof VariableReference) {
VariableReference variableReference = (VariableReference) arg;
buff.append("$").append(variableReference.getName());
if (variableReference.getIndex() != null) {
buff.append("(").append(
getArgumentString(variableReference.getIndex(), pos
+ buff.length(), addSpaces)).append(")");
}
return buff.toString();
} else if (arg instanceof Substitution) {
Substitution st = (Substitution) arg;
buff.append(LEFT_BRACKET);
boolean added = false;
for (TclCommand command : st.getCommands()) {
if (!added) {
added = true;
} else {
buff.append("\n "); //$NON-NLS-1$
}
buff.append(getCommandString(command, pos + buff.length()));
}
int end = arg.getEnd() - 1;
int npos = pos + buff.length();
if (addSpaces && end > npos) {
for (int i = 0; i < ((end) - npos); ++i) {
buff.append(SPACE);
}
}
buff.append(RIGHT_BRACKET);
return buff.toString();
} else if (arg instanceof TclArgumentList) {
// We need to correct with appropriate number of spaces
TclArgumentList st = (TclArgumentList) arg;
EList<TclArgument> eList = st.getArguments();
if (st.getKind() == TclArgumentKind.BRACED) {
buff.append(LEFT_BRACE);
} else if (st.getKind() == TclArgumentKind.QUOTED) {
buff.append(QUOTE);
}
// boolean first = true;
for (TclArgument tclArgument : eList) {
buff.append(getArgumentString(tclArgument, pos + buff.length(),
addSpaces));
}
int end = arg.getEnd() - 1;
if (st.getKind() == TclArgumentKind.SIMPLE) {
end++;
}
int npos = pos + buff.length();
if (addSpaces && end > npos) {
for (int i = 0; i < ((end) - npos); ++i) {
buff.append(SPACE);
}
}
if (st.getKind() == TclArgumentKind.BRACED) {
buff.append(RIGHT_BRACE);
} else if (st.getKind() == TclArgumentKind.QUOTED) {
buff.append(QUOTE);
}
return buff.toString();
}
return "";
}
public static String getCommandString(TclCommand command, int pos) {
return getCommandString(command, pos, true);
}
/**
* @since 2.0
*/
public static String getCommandString(TclCommand command, int pos,
boolean addSpaces) {
StringBuilder buff = new StringBuilder();
int start = command.getStart();
if (addSpaces && start > pos) {
for (int i = 0; i < (start - pos); ++i) {
buff.append(SPACE);
}
}
buff.append(getArgumentString(command.getName(), start, addSpaces));
for (TclArgument tclArgument : command.getArguments()) {
buff.append(getArgumentString(tclArgument, pos + buff.length(),
addSpaces));
}
return buff.toString();
}
public static String getCommandsString(List<TclCommand> commands) {
return getCommandsString(commands, true);
}
/**
* @since 2.0
*/
public static String getCommandsString(List<TclCommand> commands,
boolean addSpaces) {
StringBuilder buff = new StringBuilder();
boolean first = false;
int pos = 0;
for (TclCommand command : commands) {
if (!first) {
first = true;
} else {
buff.append("\n");
}
String text = getCommandString(command, pos, addSpaces);
buff.append(text);
pos += text.length();
}
return buff.toString();
}
}