Skip to content

Commit

Permalink
Simpler SnapshotPrinterTokenWriter based on PrinterTokenWriterDelegate
Browse files Browse the repository at this point in the history
  • Loading branch information
pvojtechovsky committed Sep 28, 2017
1 parent 573cf67 commit 4a0b356
Show file tree
Hide file tree
Showing 2 changed files with 135 additions and 149 deletions.
152 changes: 109 additions & 43 deletions src/main/java/spoon/reflect/visitor/PrinterTokenWriterDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<T extends PrinterTokenWriterDelegate<?>> implements PrinterTokenWriter {

private PrinterTokenWriter next;
protected PrinterTokenWriter next;

PrinterTokenWriterDelegate() {
}
Expand Down Expand Up @@ -55,92 +55,158 @@ public void reset() {
next.reset();
}

/**
* Defines type of token produced by PrettyPrinter
*/
public enum TokenType {
/**
* One of the separator characters (){}[];,.:@=&lt;&gt;?
*/
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;
}
}
132 changes: 26 additions & 106 deletions src/main/java/spoon/reflect/visitor/SnapshotPrinterTokenWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,78 +19,45 @@
import java.util.ArrayDeque;

import spoon.SpoonException;
import spoon.reflect.code.CtComment;

/**
* The special {@link PrinterTokenWriter} implementation,
* detects whether some identifier, keyword, literal, operator or separator.
* 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<SnapshotPrinterTokenWriter> {

private int countOfTokens = 0;
private ArrayDeque<Integer> 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<Integer> 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`
Expand All @@ -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();
}
}

0 comments on commit 4a0b356

Please sign in to comment.