aboutsummaryrefslogtreecommitdiffstats
path: root/javaparser-core/src/main/java/com/github/javaparser/printer/SourcePrinter.java
diff options
context:
space:
mode:
Diffstat (limited to 'javaparser-core/src/main/java/com/github/javaparser/printer/SourcePrinter.java')
-rw-r--r--javaparser-core/src/main/java/com/github/javaparser/printer/SourcePrinter.java153
1 files changed, 153 insertions, 0 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/SourcePrinter.java b/javaparser-core/src/main/java/com/github/javaparser/printer/SourcePrinter.java
new file mode 100644
index 000000000..a53d90775
--- /dev/null
+++ b/javaparser-core/src/main/java/com/github/javaparser/printer/SourcePrinter.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
+ * Copyright (C) 2011, 2013-2016 The JavaParser Team.
+ *
+ * This file is part of JavaParser.
+ *
+ * JavaParser can be used either under the terms of
+ * a) the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * b) the terms of the Apache License
+ *
+ * You should have received a copy of both licenses in LICENCE.LGPL and
+ * LICENCE.APACHE. Please refer to those files for details.
+ *
+ * JavaParser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ */
+
+package com.github.javaparser.printer;
+
+import com.github.javaparser.Position;
+import com.github.javaparser.utils.Utils;
+
+public class SourcePrinter {
+
+ private final String indentation;
+ private final int indentationLength;
+ private final String endOfLineCharacter;
+ private int level = 0;
+ private boolean indented = false;
+ private final StringBuilder buf = new StringBuilder();
+ private Position cursor = new Position(1, 0);
+
+ SourcePrinter(final String indentation, final String endOfLineCharacter) {
+ this.indentation = indentation;
+ this.indentationLength = indentation.length();
+ this.endOfLineCharacter = endOfLineCharacter;
+ }
+
+ public SourcePrinter indent() {
+ level++;
+ return this;
+ }
+
+ public SourcePrinter unindent() {
+ level--;
+ return this;
+ }
+
+ private void makeIndent() {
+ for (int i = 0; i < level; i++) {
+ buf.append(indentation);
+ cursor = Position.pos(cursor.line, cursor.column + indentationLength);
+ }
+ }
+
+ /**
+ * Append the source string passed as argument to the buffer.
+ * If this is being appended at the beginning of a line, performs indentation first.
+ * <p>
+ * The source line to be printed should not contain newline/carriage-return characters;
+ * use {@link #println(String)} to automatically append a newline at the end of the source string.
+ * If the source line passed as argument contains newline/carriage-return characters would
+ * impredictably affect a correct computation of the current {@link #getCursor()} position.
+ *
+ * @see SourcePrinter#println(String)
+ * @param arg source line to be printed (should not contain newline/carriage-return characters)
+ * @return this instance, for nesting calls to method as fluent interface
+ */
+ public SourcePrinter print(final String arg) {
+ if (!indented) {
+ makeIndent();
+ indented = true;
+ }
+ buf.append(arg);
+ cursor = Position.pos(cursor.line, cursor.column + arg.length());
+ return this;
+ }
+
+ /**
+ * Append the source string passed as argument to the buffer, then append a newline.
+ * If this is being appended at the beginning of a line, performs indentation first.
+ * <p>
+ * The source line to be printed should not contain newline/carriage-return characters.
+ * If the source line passed as argument contains newline/carriage-return characters would
+ * impredictably affect a correct computation of the current {@link #getCursor()} position.
+ *
+ * @param arg source line to be printed (should not contain newline/carriage-return characters)
+ * @return this instance, for nesting calls to method as fluent interface
+ */
+ public SourcePrinter println(final String arg) {
+ print(arg);
+ println();
+ return this;
+ }
+
+ /**
+ * Append a newline to the buffer.
+ *
+ * @return this instance, for nesting calls to method as fluent interface
+ */
+ public SourcePrinter println() {
+ buf.append(endOfLineCharacter);
+ cursor = Position.pos(cursor.line + 1, 0);
+ indented = false;
+ return this;
+ }
+
+ /**
+ * Return the current cursor position (line, column) in the source printer buffer.
+ * <p>
+ * Please notice in order to guarantee a correct computation of the cursor position,
+ * this printer expect the contracts of the methods {@link #print(String)} and {@link #println(String)}
+ * has been respected through all method calls, meaning the source string passed as argument to those method
+ * calls did not contain newline/carriage-return characters.
+ *
+ * @return the current cursor position (line, column).
+ */
+ public Position getCursor() {
+ return cursor;
+ }
+
+ /**
+ * Performs a new line and indent, then prints enough space characters until aligned to the specified column.
+ * @param column the column to align to
+ */
+ public void wrapToColumn(int column) {
+ println();
+ if (!indented) {
+ makeIndent();
+ indented = true;
+ }
+ while ( cursor.column < column ) {
+ print(" ");
+ }
+ }
+
+ public String getSource() {
+ return buf.toString();
+ }
+
+ @Override
+ public String toString() {
+ return getSource();
+ }
+
+ public String normalizeEolInTextBlock(String content) {
+ return Utils.normalizeEolInTextBlock(content, endOfLineCharacter);
+ }
+}