diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/core/lombok/core/AST.java | 15 | ||||
-rw-r--r-- | src/core/lombok/eclipse/EclipseAST.java | 11 | ||||
-rw-r--r-- | src/core/lombok/javac/JavacAST.java | 25 | ||||
-rw-r--r-- | src/core/lombok/javac/handlers/HandleSynchronized.java | 2 | ||||
-rw-r--r-- | src/delombok/lombok/delombok/Comment.java | 20 | ||||
-rw-r--r-- | src/delombok/lombok/delombok/CommentCollectingScanner.java | 32 | ||||
-rw-r--r-- | src/delombok/lombok/delombok/CommentPreservingParser.java | 4 | ||||
-rw-r--r-- | src/delombok/lombok/delombok/PrettyCommentsPrinter.java | 69 |
8 files changed, 117 insertions, 61 deletions
diff --git a/src/core/lombok/core/AST.java b/src/core/lombok/core/AST.java index e769ce34..07d6ec6c 100644 --- a/src/core/lombok/core/AST.java +++ b/src/core/lombok/core/AST.java @@ -30,6 +30,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; @@ -52,12 +53,16 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>, private L top; private final String fileName; + private final String packageDeclaration; + private final Collection<String> imports; Map<N, Void> identityDetector = new IdentityHashMap<N, Void>(); private Map<N, L> nodeMap = new IdentityHashMap<N, L>(); private boolean changed = false; - protected AST(String fileName) { + protected AST(String fileName, String packageDeclaration, Collection<String> imports) { this.fileName = fileName == null ? "(unknown).java" : fileName; + this.packageDeclaration = packageDeclaration; + this.imports = Collections.unmodifiableCollection(new ArrayList<String>(imports)); } protected void setChanged() { @@ -82,14 +87,18 @@ public abstract class AST<A extends AST<A, L, N>, L extends LombokNode<A, L, N>, * * Example: "java.util". */ - public abstract String getPackageDeclaration(); + public final String getPackageDeclaration() { + return packageDeclaration; + } /** * Return the contents of each non-static import statement on this AST's top (Compilation Unit) node. * * Example: "java.util.IOException". */ - public abstract Collection<String> getImportStatements(); + public final Collection<String> getImportStatements() { + return imports; + } /** * Puts the given node in the map so that javac/Eclipse's own internal AST object can be translated to diff --git a/src/core/lombok/eclipse/EclipseAST.java b/src/core/lombok/eclipse/EclipseAST.java index 7f436ddf..7ed83bfe 100644 --- a/src/core/lombok/eclipse/EclipseAST.java +++ b/src/core/lombok/eclipse/EclipseAST.java @@ -56,30 +56,25 @@ public class EclipseAST extends AST<EclipseAST, EclipseNode, ASTNode> { * @param ast The compilation unit, which serves as the top level node in the tree to be built. */ public EclipseAST(CompilationUnitDeclaration ast) { - super(toFileName(ast)); + super(toFileName(ast), packageDeclaration(ast), imports(ast)); this.compilationUnitDeclaration = ast; setTop(buildCompilationUnit(ast)); this.completeParse = isComplete(ast); clearChanged(); } - /** {@inheritDoc} */ - @Override public String getPackageDeclaration() { - CompilationUnitDeclaration cud = (CompilationUnitDeclaration) top().get(); + private static String packageDeclaration(CompilationUnitDeclaration cud) { ImportReference pkg = cud.currentPackage; return pkg == null ? null : Eclipse.toQualifiedName(pkg.getImportName()); } - /** {@inheritDoc} */ - @Override public Collection<String> getImportStatements() { + private static Collection<String> imports(CompilationUnitDeclaration cud) { List<String> imports = new ArrayList<String>(); - CompilationUnitDeclaration cud = (CompilationUnitDeclaration) top().get(); if (cud.imports == null) return imports; for (ImportReference imp : cud.imports) { if (imp == null) continue; imports.add(Eclipse.toQualifiedName(imp.getImportName())); } - return imports; } diff --git a/src/core/lombok/javac/JavacAST.java b/src/core/lombok/javac/JavacAST.java index e231f1d8..33c167f9 100644 --- a/src/core/lombok/javac/JavacAST.java +++ b/src/core/lombok/javac/JavacAST.java @@ -71,7 +71,7 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> { * @param top The compilation unit, which serves as the top level node in the tree to be built. */ public JavacAST(Messager messager, Context context, JCCompilationUnit top) { - super(top.sourcefile == null ? null : top.sourcefile.toString()); + super(sourceName(top), packageDeclaration(top), imports(top)); setTop(buildCompilationUnit(top)); this.context = context; this.messager = messager; @@ -81,30 +81,29 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> { this.symtab = Symtab.instance(context); clearChanged(); } - - public Context getContext() { - return context; + + private static String sourceName(JCCompilationUnit cu) { + return cu.sourcefile == null ? null : cu.sourcefile.toString(); } - /** {@inheritDoc} */ - @Override public String getPackageDeclaration() { - JCCompilationUnit unit = (JCCompilationUnit)top().get(); - return unit.pid instanceof JCFieldAccess ? unit.pid.toString() : null; + private static String packageDeclaration(JCCompilationUnit cu) { + return cu.pid instanceof JCFieldAccess ? cu.pid.toString() : null; } - /** {@inheritDoc} */ - @Override public Collection<String> getImportStatements() { + private static Collection<String> imports(JCCompilationUnit cu) { List<String> imports = new ArrayList<String>(); - JCCompilationUnit unit = (JCCompilationUnit)top().get(); - for (JCTree def : unit.defs) { + for (JCTree def : cu.defs) { if (def instanceof JCImport) { imports.add(((JCImport)def).qualid.toString()); } } - return imports; } + public Context getContext() { + return context; + } + /** * Runs through the entire AST, starting at the compilation unit, calling the provided visitor's visit methods * for each node, depth first. diff --git a/src/core/lombok/javac/handlers/HandleSynchronized.java b/src/core/lombok/javac/handlers/HandleSynchronized.java index eaa0ad6d..3602e74b 100644 --- a/src/core/lombok/javac/handlers/HandleSynchronized.java +++ b/src/core/lombok/javac/handlers/HandleSynchronized.java @@ -87,7 +87,7 @@ public class HandleSynchronized implements JavacAnnotationHandler<Synchronized> JCNewArray newObjectArray = maker.NewArray(chainDots(maker, methodNode, "java", "lang", "Object"), List.<JCExpression>of(maker.Literal(TypeTags.INT, 0)), null); JCVariableDecl fieldDecl = maker.VarDef( - maker.Modifiers(Flags.FINAL | (isStatic ? Flags.STATIC : 0)), + maker.Modifiers(Flags.PRIVATE | Flags.FINAL | (isStatic ? Flags.STATIC : 0)), methodNode.toName(lockName), objectType, newObjectArray); injectField(methodNode.up(), fieldDecl); } diff --git a/src/delombok/lombok/delombok/Comment.java b/src/delombok/lombok/delombok/Comment.java index 55a5c46d..170ffe22 100644 --- a/src/delombok/lombok/delombok/Comment.java +++ b/src/delombok/lombok/delombok/Comment.java @@ -22,22 +22,28 @@ package lombok.delombok; public final class Comment { + + public enum StartConnection { + START_OF_LINE, + ON_NEXT_LINE, + DIRECT_AFTER_PREVIOUS, + AFTER_PREVIOUS + } + final int pos; final int prevEndPos; final String content; final int endPos; - final boolean newLine; + final StartConnection start; + final boolean newLineAfter; - public Comment(int prevEndPos, int pos, int endPos, String content, boolean newLine) { + public Comment(int prevEndPos, int pos, int endPos, String content, StartConnection start, boolean newLineAfter) { this.pos = pos; this.prevEndPos = prevEndPos; this.endPos = endPos; this.content = content; - this.newLine = newLine; - } - - public boolean isConnected() { - return !newLine && prevEndPos == pos; + this.start = start; + this.newLineAfter = newLineAfter; } public String summary() { diff --git a/src/delombok/lombok/delombok/CommentCollectingScanner.java b/src/delombok/lombok/delombok/CommentCollectingScanner.java index 361d975c..8c77a0d3 100644 --- a/src/delombok/lombok/delombok/CommentCollectingScanner.java +++ b/src/delombok/lombok/delombok/CommentCollectingScanner.java @@ -23,6 +23,7 @@ package lombok.delombok; import java.nio.CharBuffer; +import lombok.delombok.Comment.StartConnection; import lombok.delombok.CommentPreservingParser.Comments; import com.sun.tools.javac.parser.Scanner; @@ -79,17 +80,32 @@ public class CommentCollectingScanner extends Scanner { protected void processComment(CommentStyle style) { int prevEndPos = prevEndPos(); int pos = pos(); - boolean newLine = containsNewLine(prevEndPos, pos); - String content = new String(getRawCharacters(pos, endPos())); - comments.add(prevEndPos, pos, endPos(), content, newLine); + int endPos = endPos(); + String content = new String(getRawCharacters(pos, endPos)); + boolean lineBreakAfter = isNewLine(getRawCharacters(endPos, endPos + 1)[0]); + StartConnection start = determineStartConnection(prevEndPos, pos); + Comment comment = new Comment(prevEndPos, pos, endPos, content, start, lineBreakAfter); + + comments.add(comment); } - private boolean containsNewLine(int from, int to) { - for (char c : getRawCharacters(from, to)) { - if (c == '\n' || c == '\r') { - return true; + private StartConnection determineStartConnection(int from, int to) { + if (from == to) { + return StartConnection.DIRECT_AFTER_PREVIOUS; + } + char[] between = getRawCharacters(from, to); + if (isNewLine(between[between.length - 1])) { + return StartConnection.START_OF_LINE; + } + for (char c : between) { + if (isNewLine(c)) { + return StartConnection.ON_NEXT_LINE; } } - return false; + return StartConnection.AFTER_PREVIOUS; + } + + private boolean isNewLine(char c) { + return c == '\n' || c == '\r'; } } diff --git a/src/delombok/lombok/delombok/CommentPreservingParser.java b/src/delombok/lombok/delombok/CommentPreservingParser.java index c776a224..2f1de8e5 100644 --- a/src/delombok/lombok/delombok/CommentPreservingParser.java +++ b/src/delombok/lombok/delombok/CommentPreservingParser.java @@ -101,8 +101,8 @@ public class CommentPreservingParser { static class Comments { List<Comment> comments = List.nil(); - void add(int prevEndPos, int pos, int endPos, String content, boolean newLine) { - comments = comments.append(new Comment(prevEndPos, pos, endPos, content, newLine)); + void add(Comment comment) { + comments = comments.append(comment); } } diff --git a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java index f1ba0adf..695e94da 100644 --- a/src/delombok/lombok/delombok/PrettyCommentsPrinter.java +++ b/src/delombok/lombok/delombok/PrettyCommentsPrinter.java @@ -38,6 +38,8 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Map; +import lombok.delombok.Comment.StartConnection; + import com.sun.source.tree.Tree; import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Symbol; @@ -154,6 +156,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { private List<Comment> comments; private final JCCompilationUnit cu; private boolean newLine = true; + private boolean indent = false; private boolean inParams = false; public PrettyCommentsPrinter(Writer out, JCCompilationUnit cu, List<Comment> comments) { @@ -168,13 +171,16 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { private void consumeComments(int till) throws IOException { boolean shouldIndent = !newLine; - while (comments.nonEmpty() && comments.head.pos < till) { - if (newLine) { - align(); - } - print(comments.head.content); - println(); + boolean found = false; + Comment head = comments.head; + while (comments.nonEmpty() && head.pos < till) { + found = true; + printComment(head); comments = comments.tail; + head = comments.head; + } + if (found && !newLine && !indent) { + print(" "); } if (newLine && shouldIndent) { align(); @@ -186,18 +192,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { Comment head = comments.head; while (comments.nonEmpty() && head.prevEndPos == from) { from = head.endPos; - if (!head.isConnected()) { - if (head.newLine) { - if (!newLine) { - println(); - align(); - } - } - else { - print(" "); - } - } - print(head.content); + printComment(head); comments = comments.tail; head = comments.head; } @@ -206,6 +201,39 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { } } + private void printComment(Comment comment) throws IOException { + prepareComment(comment.start); + print(comment.content); + if (comment.newLineAfter) { + println(); + } + } + + private void prepareComment(StartConnection start) throws IOException { + switch (start) { + case DIRECT_AFTER_PREVIOUS: + break; + case AFTER_PREVIOUS: + if (!newLine && !indent) { + print(" "); + } + break; + case START_OF_LINE: + if (!newLine) { + println(); + } + break; + case ON_NEXT_LINE: + if (!newLine && !indent) { + println(); + } + if (!indent) { + align(); + } + break; + } + } + /** The output stream on which trees are printed. */ Writer out; @@ -227,6 +255,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { */ void align() throws IOException { newLine = false; + indent = true; for (int i = 0; i < lmargin; i++) out.write("\t"); } @@ -264,6 +293,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { */ public void print(Object s) throws IOException { newLine = false; + indent = false; out.write(Convert.escapeUnicode(s.toString())); } @@ -271,6 +301,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { */ public void println() throws IOException { newLine = true; + indent = false; out.write(lineSep); } @@ -306,7 +337,7 @@ public class PrettyCommentsPrinter extends JCTree.Visitor { tree.accept(this); int endPos = endPos(tree); consumeTrailingComments(endPos); - consumeComments(endPos); +// consumeComments(endPos); } } catch (UncheckedIOException ex) { IOException e = new IOException(ex.getMessage()); |