aboutsummaryrefslogtreecommitdiff
path: root/src/lombok/eclipse
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@tipit.to>2009-06-27 04:00:12 +0200
committerReinier Zwitserloot <reinier@tipit.to>2009-06-27 04:00:12 +0200
commitb4cab3f65c854ba4bda03528a87bff7654ccb817 (patch)
tree0fa16b171032b919ca8592a65a8e26c6f5e6aba0 /src/lombok/eclipse
parentb9714eae8ced8d22a319a471331be3a522ebccce (diff)
downloadlombok-b4cab3f65c854ba4bda03528a87bff7654ccb817.tar.gz
lombok-b4cab3f65c854ba4bda03528a87bff7654ccb817.tar.bz2
lombok-b4cab3f65c854ba4bda03528a87bff7654ccb817.zip
[IMPROVEMENT]
Eclipse will now also hold off on running @PrintAST handlers until the very end. Simple generators such as @Getter didn't need this, because PrintAST's handler will hold off until eclipse does a full parse, but when changing the innards of methods, you would likely not see what you did. Fixed that. Also, PrintAST has an option to, instead of diving into the ASTNodes of bodies (methods, initializers, etc), to just render the java code, to see if the AST creation/rewriting you've been doing looks like the java code you intended.
Diffstat (limited to 'src/lombok/eclipse')
-rw-r--r--src/lombok/eclipse/EclipseASTVisitor.java43
-rw-r--r--src/lombok/eclipse/HandlerLibrary.java14
-rw-r--r--src/lombok/eclipse/TransformEclipseAST.java3
-rw-r--r--src/lombok/eclipse/handlers/HandlePrintAST.java2
4 files changed, 51 insertions, 11 deletions
diff --git a/src/lombok/eclipse/EclipseASTVisitor.java b/src/lombok/eclipse/EclipseASTVisitor.java
index df7466d5..bebabc6b 100644
--- a/src/lombok/eclipse/EclipseASTVisitor.java
+++ b/src/lombok/eclipse/EclipseASTVisitor.java
@@ -84,26 +84,34 @@ public interface EclipseASTVisitor {
public static class Printer implements EclipseASTVisitor {
private final PrintStream out;
- public Printer() {
- this(System.out);
+ private final boolean printContent;
+ private int disablePrinting = 0;
+ private int indent = 0;
+
+ public Printer(boolean printContent) {
+ this(printContent, System.out);
}
- public Printer(File file) throws FileNotFoundException {
- this(new PrintStream(file));
+ public Printer(boolean printContent, File file) throws FileNotFoundException {
+ this(printContent, new PrintStream(file));
}
- public Printer(PrintStream out) {
+ public Printer(boolean printContent, PrintStream out) {
+ this.printContent = printContent;
this.out = out;
}
- int indent = 0;
- private void print(String text, Object... params) {
+ private void forcePrint(String text, Object... params) {
StringBuilder sb = new StringBuilder();
for ( int i = 0 ; i < indent ; i++ ) sb.append(" ");
out.printf(sb.append(text).append('\n').toString(), params);
out.flush();
}
+ private void print(String text, Object... params) {
+ if ( disablePrinting == 0 ) forcePrint(text, params);
+ }
+
private String str(char[] c) {
if ( c == null ) return "(NULL)";
else return new String(c);
@@ -140,7 +148,7 @@ public interface EclipseASTVisitor {
}
@Override public void visitAnnotationOnType(TypeDeclaration type, Node node, Annotation annotation) {
- print("<ANNOTATION: %s />", annotation);
+ forcePrint("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitType(Node node, TypeDeclaration type) {
@@ -155,9 +163,14 @@ public interface EclipseASTVisitor {
(initializer.modifiers & Modifier.STATIC) != 0 ? "static" : "instance",
s ? "filled" : "blank");
indent++;
+ if ( printContent ) {
+ if ( initializer.block != null ) print("%s", initializer.block);
+ disablePrinting++;
+ }
}
@Override public void endVisitInitializer(Node node, Initializer initializer) {
+ if ( printContent ) disablePrinting--;
indent--;
print("</%s INITIALIZER>", (initializer.modifiers & Modifier.STATIC) != 0 ? "static" : "instance");
}
@@ -165,13 +178,18 @@ public interface EclipseASTVisitor {
@Override public void visitField(Node node, FieldDeclaration field) {
print("<FIELD %s %s = %s>", str(field.type), str(field.name), field.initialization);
indent++;
+ if ( printContent ) {
+ if ( field.initialization != null ) print("%s", field.initialization);
+ disablePrinting++;
+ }
}
@Override public void visitAnnotationOnField(FieldDeclaration field, Node node, Annotation annotation) {
- print("<ANNOTATION: %s />", annotation);
+ forcePrint("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitField(Node node, FieldDeclaration field) {
+ if ( printContent ) disablePrinting--;
indent--;
print("</FIELD %s %s>", str(field.type), str(field.name));
}
@@ -180,13 +198,18 @@ public interface EclipseASTVisitor {
String type = method instanceof ConstructorDeclaration ? "CONSTRUCTOR" : "METHOD";
print("<%s %s: %s>", type, str(method.selector), method.statements != null ? "filled" : "blank");
indent++;
+ if ( printContent ) {
+ if ( method.statements != null ) print("%s", method);
+ disablePrinting++;
+ }
}
@Override public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node node, Annotation annotation) {
- print("<ANNOTATION: %s />", annotation);
+ forcePrint("<ANNOTATION: %s />", annotation);
}
@Override public void endVisitMethod(Node node, AbstractMethodDeclaration method) {
+ if ( printContent ) disablePrinting--;
String type = method instanceof ConstructorDeclaration ? "CONSTRUCTOR" : "METHOD";
indent--;
print("</%s %s>", type, str(method.selector));
diff --git a/src/lombok/eclipse/HandlerLibrary.java b/src/lombok/eclipse/HandlerLibrary.java
index 10180963..37610a33 100644
--- a/src/lombok/eclipse/HandlerLibrary.java
+++ b/src/lombok/eclipse/HandlerLibrary.java
@@ -12,6 +12,7 @@ import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import lombok.core.AnnotationValues;
+import lombok.core.PrintAST;
import lombok.core.SpiLoadUtil;
import lombok.core.TypeLibrary;
import lombok.core.TypeResolver;
@@ -44,6 +45,8 @@ public class HandlerLibrary {
new HashMap<String, AnnotationHandlerContainer<?>>();
private Collection<EclipseASTVisitor> visitorHandlers = new ArrayList<EclipseASTVisitor>();
+
+ private boolean skipPrintAST;
public static HandlerLibrary load() {
HandlerLibrary lib = new HandlerLibrary();
@@ -93,6 +96,8 @@ public class HandlerLibrary {
if ( rawType == null ) return false;
boolean handled = false;
for ( String fqn : resolver.findTypeMatches(annotationNode, toQualifiedName(annotation.type.getTypeName())) ) {
+ boolean isPrintAST = fqn.equals(PrintAST.class.getName());
+ if ( isPrintAST == skipPrintAST ) continue;
AnnotationHandlerContainer<?> container = annotationHandlers.get(fqn);
if ( container == null ) continue;
@@ -100,6 +105,7 @@ public class HandlerLibrary {
try {
handled |= container.handle(annotation, annotationNode);
} catch ( AnnotationValueDecodeFail fail ) {
+ fail.printStackTrace(); //TODO debug!
fail.owner.setError(fail.getMessage(), fail.idx);
} catch ( Throwable t ) {
Eclipse.error(ast, String.format("Lombok annotation handler %s failed", container.handler.getClass()), t);
@@ -117,4 +123,12 @@ public class HandlerLibrary {
String.format("Lombok visitor handler %s failed", visitor.getClass()), t);
}
}
+
+ public void skipPrintAST() {
+ skipPrintAST = true;
+ }
+
+ public void skipAllButPrintAST() {
+ skipPrintAST = false;
+ }
}
diff --git a/src/lombok/eclipse/TransformEclipseAST.java b/src/lombok/eclipse/TransformEclipseAST.java
index a43be699..66d663f4 100644
--- a/src/lombok/eclipse/TransformEclipseAST.java
+++ b/src/lombok/eclipse/TransformEclipseAST.java
@@ -103,8 +103,11 @@ public class TransformEclipseAST {
}
public void go() {
+ handlers.skipPrintAST();
ast.traverse(new AnnotationVisitor());
handlers.callASTVisitors(ast);
+ handlers.skipAllButPrintAST();
+ ast.traverse(new AnnotationVisitor());
}
private static class AnnotationVisitor extends EclipseASTAdapter {
diff --git a/src/lombok/eclipse/handlers/HandlePrintAST.java b/src/lombok/eclipse/handlers/HandlePrintAST.java
index ae34c5c2..cbd2cae1 100644
--- a/src/lombok/eclipse/handlers/HandlePrintAST.java
+++ b/src/lombok/eclipse/handlers/HandlePrintAST.java
@@ -27,7 +27,7 @@ public class HandlePrintAST implements EclipseAnnotationHandler<PrintAST> {
Lombok.sneakyThrow(e);
}
- annotationNode.up().traverse(new EclipseASTVisitor.Printer(stream));
+ annotationNode.up().traverse(new EclipseASTVisitor.Printer(annotation.getInstance().printContent(), stream));
return true;
}
}