blob: 77d4bd1e275fa0162a23e904deadc4f3182bdafc [file] [log] [blame]
package org.jetbrains.protocolReader;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
public class TextOutput {
public static final char[] EMPTY_CHARS = new char[0];
private int identLevel;
private final static int indentGranularity = 2;
private char[][] indents = {EMPTY_CHARS};
private boolean justNewLined;
private final StringBuilder out;
public TextOutput(StringBuilder out) {
this.out = out;
}
public StringBuilder getOut() {
return out;
}
public TextOutput indentIn() {
++identLevel;
if (identLevel >= indents.length) {
// Cache a new level of indentation string.
char[] newIndentLevel = new char[identLevel * indentGranularity];
Arrays.fill(newIndentLevel, ' ');
char[][] newIndents = new char[indents.length + 1][];
System.arraycopy(indents, 0, newIndents, 0, indents.length);
newIndents[identLevel] = newIndentLevel;
indents = newIndents;
}
return this;
}
public TextOutput indentOut() {
--identLevel;
return this;
}
public TextOutput newLine() {
out.append('\n');
justNewLined = true;
return this;
}
public TextOutput append(double value) {
maybeIndent();
out.append(value);
return this;
}
public TextOutput append(boolean value) {
maybeIndent();
out.append(value);
return this;
}
public TextOutput append(int value) {
maybeIndent();
out.append(value);
return this;
}
public TextOutput append(char c) {
maybeIndent();
out.append(c);
return this;
}
public void append(char[] s) {
maybeIndent();
out.append(s);
}
public TextOutput append(CharSequence s) {
maybeIndent();
out.append(s);
return this;
}
public TextOutput append(CharSequence s, int start) {
maybeIndent();
out.append(s, start, s.length());
return this;
}
public TextOutput openBlock() {
openBlock(true);
return this;
}
public void openBlock(boolean addNewLine) {
space().append('{');
if (addNewLine) {
newLine();
}
indentIn();
}
public void closeBlock() {
indentOut().newLine().append('}');
}
public TextOutput comma() {
return append(',').append(' ');
}
public TextOutput space() {
return append(' ');
}
public TextOutput semi() {
return append(';');
}
public TextOutput doc(@Nullable String description) {
if (description == null) {
return this;
}
return append("/**").newLine().append(" * ").append(description).newLine().append(" */").newLine();
}
public TextOutput quote(CharSequence s) {
return append('"').append(s).append('"');
}
public void maybeIndent() {
if (justNewLined) {
out.append(indents[identLevel]);
justNewLined = false;
}
}
}