aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/lombok/core/AST.java15
-rw-r--r--src/core/lombok/eclipse/EclipseAST.java11
-rw-r--r--src/core/lombok/javac/JavacAST.java25
-rw-r--r--src/core/lombok/javac/handlers/HandleSynchronized.java2
-rw-r--r--src/delombok/lombok/delombok/Comment.java20
-rw-r--r--src/delombok/lombok/delombok/CommentCollectingScanner.java32
-rw-r--r--src/delombok/lombok/delombok/CommentPreservingParser.java4
-rw-r--r--src/delombok/lombok/delombok/PrettyCommentsPrinter.java69
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());