blob: d5c9def8c10f20b5e0b98c92db70a8a9ffc4652e [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed 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 com.google.gwt.codegen.server;
/**
* Base implementation of {@link SourceWriter} that implements all the indenting
* and keeping track of comments.
* <p>
* Experimental API - subject to change.
*/
public abstract class SourceWriterBase implements SourceWriter {
private boolean atStart;
/**
* Are we currently in a comment?
*/
private boolean inComment;
private int indent;
public abstract void abort();
public void beginJavaDocComment() {
println("\n/**");
inComment = true;
}
public void close() {
outdent();
println("}");
}
public void endJavaDocComment() {
inComment = false;
println("\n */");
}
public void indent() {
indent++;
}
public void indentln(String string) {
indent();
println(string);
outdent();
}
public void indentln(String format, Object... args) {
indentln(String.format(format, args));
}
public void outdent() {
if (indent > 0) {
--indent;
}
}
public void print(String s) {
// If we just printed a newline, print an indent.
//
if (atStart) {
for (int j = 0; j < indent; ++j) {
writeString(" ");
}
if (inComment) {
writeString(" * ");
}
atStart = false;
}
// Now print up to the end of the string or the next newline.
//
String rest = null;
int i = s.indexOf("\n");
if (i > -1 && i < s.length() - 1) {
rest = s.substring(i + 1);
s = s.substring(0, i + 1);
}
writeString(s);
// If rest is non-null, then s ended with a newline and we recurse.
//
if (rest != null) {
atStart = true;
print(rest);
}
}
public void print(String format, Object... args) {
print(String.format(format, args));
}
public void println() {
print("\n");
atStart = true;
}
public void println(String string) {
print(string);
println();
}
public void println(String format, Object... args) {
println(String.format(format, args));
}
/**
* Write a string to the underlying output.
*
* @param s
*/
protected abstract void writeString(String s);
}