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(); - } }