From 4a0b356fc5027b58f4014cab2fd14a6b8bb7c80a Mon Sep 17 00:00:00 2001
From: Pavel Vojtechovsky
Date: Thu, 28 Sep 2017 22:14:32 +0200
Subject: [PATCH] Simpler SnapshotPrinterTokenWriter based on
PrinterTokenWriterDelegate
---
.../visitor/PrinterTokenWriterDelegate.java | 152 +++++++++++++-----
.../visitor/SnapshotPrinterTokenWriter.java | 132 +++------------
2 files changed, 135 insertions(+), 149 deletions(-)
diff --git a/src/main/java/spoon/reflect/visitor/PrinterTokenWriterDelegate.java b/src/main/java/spoon/reflect/visitor/PrinterTokenWriterDelegate.java
index 95434b28eae..f5ec7cdb900 100644
--- a/src/main/java/spoon/reflect/visitor/PrinterTokenWriterDelegate.java
+++ b/src/main/java/spoon/reflect/visitor/PrinterTokenWriterDelegate.java
@@ -23,9 +23,9 @@
* {@link PrinterTokenWriter} implementation, which simply sends all tokens to next {@link PrinterTokenWriter}
* Inherit your own implementation from this class to manipulates print tokens - e.g. to change formatting of printed output
*/
-public class PrinterTokenWriterDelegate implements PrinterTokenWriter {
+public class PrinterTokenWriterDelegate> implements PrinterTokenWriter {
- private PrinterTokenWriter next;
+ protected PrinterTokenWriter next;
PrinterTokenWriterDelegate() {
}
@@ -55,92 +55,158 @@ public void reset() {
next.reset();
}
+ /**
+ * Defines type of token produced by PrettyPrinter
+ */
+ public enum TokenType {
+ /**
+ * One of the separator characters (){}[];,.:@=<>?
+ */
+ SEPARATOR,
+ /**
+ * The operator of an expression. For example "==", "*", ...
+ */
+ OPERATOR,
+ /**
+ * java keyword. For example "class", "public", ...
+ */
+ KEYWORD,
+ /**
+ * identifier. For example "TheNameOfMyClass_Or_VariableEtc"
+ */
+ IDENTIFIER,
+ /**
+ * all the spaces, new lines and tabs
+ */
+ WHITESPACE,
+ /**
+ * the java literals. For example
+ * "I am string"
+ * 'c'
+ * -4785.45
+ * 4456.65e10
+ * 0x00101011B
+ */
+ LITERAL,
+ /**
+ * The java comment. The token is instance of {@link CtComment}
+ */
+ COMMENT,
+ /**
+ * Special case of printing of CtCodeSnippetStatement.
+ * The tokens are not resolved here!
+ * Note: the token value is {@link CtComment}
+ */
+ CODE_SNIPPET,
+ /**
+ * represents new line
+ * Note: there is no token value expected here
+ */
+ NEW_LINE,
+ /**
+ * prints the indentation - expected number of tabs or spaces
+ * Note: there is no token value expected here
+ */
+ TABS,
+ /**
+ * increments the indentation
+ * Note: there is no token value expected here
+ */
+ INCREMENT_TABS,
+ /**
+ * decrements the indentation
+ * Note: there is no token value expected here
+ */
+ DECREMENT_TABS;
+ }
+
+ /**
+ * Called at the beginning of each token handler
+ */
+ protected void onToken(TokenType tokenType, Object token) {
+ }
+
@Override
- public PrinterTokenWriterDelegate writeWhitespace(String token) {
- onToken();
+ public T writeWhitespace(String token) {
+ onToken(TokenType.WHITESPACE, token);
next.writeWhitespace(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeSeparator(String token) {
- onToken();
+ public T writeSeparator(String token) {
+ onToken(TokenType.SEPARATOR, token);
next.writeSeparator(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeOperator(String token) {
- onToken();
+ public T writeOperator(String token) {
+ onToken(TokenType.OPERATOR, token);
next.writeOperator(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeLiteral(String token) {
- onToken();
+ public T writeLiteral(String token) {
+ onToken(TokenType.LITERAL, token);
next.writeLiteral(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeKeyword(String token) {
- onToken();
+ public T writeKeyword(String token) {
+ onToken(TokenType.KEYWORD, token);
next.writeKeyword(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeIdentifier(String token) {
- onToken();
+ public T writeIdentifier(String token) {
+ onToken(TokenType.IDENTIFIER, token);
next.writeIdentifier(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeCodeSnippet(String token) {
- onToken();
+ public T writeCodeSnippet(String token) {
+ onToken(TokenType.CODE_SNIPPET, token);
next.writeCodeSnippet(token);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeComment(CtComment comment) {
- onToken();
+ public T writeComment(CtComment comment) {
+ onToken(TokenType.COMMENT, comment);
next.writeComment(comment);
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeln() {
- onToken();
+ public T writeln() {
+ onToken(TokenType.NEW_LINE, null);
next.writeln();
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate writeTabs() {
- onToken();
+ public T writeTabs() {
+ onToken(TokenType.TABS, null);
next.writeTabs();
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate incTab() {
- onToken();
+ public T incTab() {
+ onToken(TokenType.INCREMENT_TABS, null);
next.incTab();
- return this;
+ return (T) this;
}
@Override
- public PrinterTokenWriterDelegate decTab() {
- onToken();
+ public T decTab() {
+ onToken(TokenType.DECREMENT_TABS, null);
next.decTab();
- return this;
- }
- /**
- * Called at the beginning of each token handler
- */
- protected void onToken() {
+ return (T) this;
}
}
diff --git a/src/main/java/spoon/reflect/visitor/SnapshotPrinterTokenWriter.java b/src/main/java/spoon/reflect/visitor/SnapshotPrinterTokenWriter.java
index cf1e3a6f791..9d439525e84 100644
--- a/src/main/java/spoon/reflect/visitor/SnapshotPrinterTokenWriter.java
+++ b/src/main/java/spoon/reflect/visitor/SnapshotPrinterTokenWriter.java
@@ -19,7 +19,6 @@
import java.util.ArrayDeque;
import spoon.SpoonException;
-import spoon.reflect.code.CtComment;
/**
* The special {@link PrinterTokenWriter} implementation,
@@ -27,70 +26,38 @@
* Comments, white spaces, tabs and new lines are ignored, because they can appear in the middle of printed elements.
* was written since last call of {@link #snapshotLength()}
*/
-class SnapshotPrinterTokenWriter implements PrinterTokenWriter {
-
- private PrinterTokenWriter next;
-
- SnapshotPrinterTokenWriter(PrinterTokenWriter next) {
- this.next = next;
- }
-
- public PrinterTokenWriter getNext() {
- return next;
- }
-
- public void setNext(PrinterTokenWriter next) {
- if (next == null) {
- throw new SpoonException("Next PrinterTokenWriter must not be null");
- }
- this.next = next;
- }
+class SnapshotPrinterTokenWriter extends PrinterTokenWriterDelegate {
private int countOfTokens = 0;
+ private ArrayDeque lengths = new ArrayDeque<>();
- SnapshotPrinterTokenWriter writeSpace() {
- writeWhitespace(" ");
- return this;
- }
-
-
- @Override
- public SnapshotPrinterTokenWriter writeIdentifier(String token) {
- countOfTokens++;
- next.writeIdentifier(token);
- return this;
- }
-
- @Override
- public SnapshotPrinterTokenWriter writeKeyword(String token) {
- countOfTokens++;
- next.writeKeyword(token);
- return this;
- }
-
- @Override
- public SnapshotPrinterTokenWriter writeLiteral(String token) {
- countOfTokens++;
- next.writeLiteral(token);
- return this;
- }
-
- @Override
- public SnapshotPrinterTokenWriter writeOperator(String token) {
- countOfTokens++;
- next.writeOperator(token);
- return this;
+ SnapshotPrinterTokenWriter(PrinterTokenWriter next) {
+ super(next);
}
@Override
- public SnapshotPrinterTokenWriter writeSeparator(String token) {
- countOfTokens++;
- next.writeSeparator(token);
- return this;
+ protected void onToken(TokenType tokenType, Object token) {
+ switch (tokenType) {
+ case IDENTIFIER:
+ case KEYWORD:
+ case LITERAL:
+ case OPERATOR:
+ case SEPARATOR:
+ case CODE_SNIPPET:
+ countOfTokens++;
+ break;
+ case COMMENT:
+ case INCREMENT_TABS:
+ case DECREMENT_TABS:
+ case TABS:
+ case NEW_LINE:
+ case WHITESPACE:
+ break;
+ default:
+ throw new SpoonException("Unexpected token type: " + tokenType.name());
+ }
}
- private ArrayDeque lengths = new ArrayDeque<>();
-
/** stores the length of the printer */
public void snapshotLength() {
//if the buffer contains some data then flush them first to send that token and use correct `countOfTokens`
@@ -102,55 +69,8 @@ public boolean hasNewContent() {
return lengths.pollLast() < countOfTokens;
}
- @Override
- public PrinterTokenWriter writeWhitespace(String token) {
- next.writeWhitespace(token);
- return this;
- }
-
- @Override
- public PrinterTokenWriter writeCodeSnippet(String token) {
- next.writeCodeSnippet(token);
- return this;
- }
-
- @Override
- public PrinterTokenWriter writeComment(CtComment comment) {
- next.writeComment(comment);
- return this;
- }
-
- @Override
- public PrinterTokenWriter writeln() {
- next.writeln();
- return this;
- }
-
- @Override
- public PrinterTokenWriter writeTabs() {
- next.writeTabs();
- return this;
- }
-
- @Override
- public PrinterTokenWriter incTab() {
- next.incTab();
- return this;
- }
-
- @Override
- public PrinterTokenWriter decTab() {
- next.decTab();
+ public SnapshotPrinterTokenWriter writeSpace() {
+ writeWhitespace(" ");
return this;
}
-
- @Override
- public PrinterHelper getPrinterHelper() {
- return next.getPrinterHelper();
- }
-
- @Override
- public void reset() {
- next.reset();
- }
}