aboutsummaryrefslogtreecommitdiff
path: root/src/lombok/javac
diff options
context:
space:
mode:
Diffstat (limited to 'src/lombok/javac')
-rw-r--r--src/lombok/javac/JavacAST.java30
-rw-r--r--src/lombok/javac/handlers/HandleGetter.java23
-rw-r--r--src/lombok/javac/handlers/HandleSetter.java25
-rw-r--r--src/lombok/javac/handlers/PKG.java12
4 files changed, 74 insertions, 16 deletions
diff --git a/src/lombok/javac/JavacAST.java b/src/lombok/javac/JavacAST.java
index 7050df75..f0544256 100644
--- a/src/lombok/javac/JavacAST.java
+++ b/src/lombok/javac/JavacAST.java
@@ -94,6 +94,31 @@ public class JavacAST extends AST<JCTree> {
return symtab;
}
+ @Override protected Node buildTree(JCTree node, Kind kind) {
+ switch ( kind ) {
+ case COMPILATION_UNIT:
+ return buildCompilationUnit((JCCompilationUnit) node);
+ case TYPE:
+ return buildType((JCClassDecl) node);
+ case FIELD:
+ return buildField((JCVariableDecl) node);
+ case INITIALIZER:
+ return buildInitializer((JCBlock) node);
+ case METHOD:
+ return buildMethod((JCMethodDecl) node);
+ case ARGUMENT:
+ return buildLocalVar((JCVariableDecl) node, kind);
+ case LOCAL:
+ return buildLocalVar((JCVariableDecl) node, kind);
+ case STATEMENT:
+ return buildStatementOrExpression(node);
+ case ANNOTATION:
+ return buildAnnotation((JCAnnotation) node);
+ default:
+ throw new AssertionError("Did not expect: " + kind);
+ }
+ }
+
private Node buildCompilationUnit(JCCompilationUnit top) {
List<Node> childNodes = new ArrayList<Node>();
for ( JCTree s : top.defs ) {
@@ -310,6 +335,11 @@ public class JavacAST extends AST<JCTree> {
}
/** {@inheritDoc} */
+ @Override public Node getNodeFor(JCTree obj) {
+ return (Node) super.getNodeFor(obj);
+ }
+
+ /** {@inheritDoc} */
@Override public Node directUp() {
return (Node) super.directUp();
}
diff --git a/src/lombok/javac/handlers/HandleGetter.java b/src/lombok/javac/handlers/HandleGetter.java
index 651bc018..3405810b 100644
--- a/src/lombok/javac/handlers/HandleGetter.java
+++ b/src/lombok/javac/handlers/HandleGetter.java
@@ -29,8 +29,9 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@ProviderFor(JavacAnnotationHandler.class)
public class HandleGetter implements JavacAnnotationHandler<Getter> {
public void generateGetterForField(Node fieldNode, DiagnosticPosition pos) {
- AccessLevel level = Getter.DEFAULT_ACCESS_LEVEL;
+ AccessLevel level = AccessLevel.PUBLIC;
Node errorNode = fieldNode;
+ boolean whineIfExists = false;
for ( Node child : fieldNode.down() ) {
if ( child.getKind() == Kind.ANNOTATION ) {
@@ -38,21 +39,22 @@ public class HandleGetter implements JavacAnnotationHandler<Getter> {
level = Javac.createAnnotation(Getter.class, child).getInstance().value();
errorNode = child;
pos = child.get();
+ whineIfExists = true;
break;
}
}
}
- createGetterForField(level, fieldNode, errorNode, pos);
+ createGetterForField(level, fieldNode, errorNode, pos, whineIfExists);
}
@Override public boolean handle(AnnotationValues<Getter> annotation, JCAnnotation ast, Node annotationNode) {
Node fieldNode = annotationNode.up();
AccessLevel level = annotation.getInstance().value();
- return createGetterForField(level, fieldNode, annotationNode, annotationNode.get());
+ return createGetterForField(level, fieldNode, annotationNode, annotationNode.get(), true);
}
- private boolean createGetterForField(AccessLevel level, Node fieldNode, Node errorNode, DiagnosticPosition pos) {
+ private boolean createGetterForField(AccessLevel level, Node fieldNode, Node errorNode, DiagnosticPosition pos, boolean whineIfExists) {
if ( fieldNode.getKind() != Kind.FIELD ) {
errorNode.addError("@Getter is only supported on a field.");
return false;
@@ -61,10 +63,16 @@ public class HandleGetter implements JavacAnnotationHandler<Getter> {
JCVariableDecl fieldDecl = (JCVariableDecl)fieldNode.get();
String methodName = toGetterName(fieldDecl);
- if ( methodExists(methodName, fieldNode) ) {
- errorNode.addWarning(
+ switch ( methodExists(methodName, fieldNode) ) {
+ case EXISTS_BY_LOMBOK:
+ return true;
+ case EXISTS_BY_USER:
+ if ( whineIfExists ) errorNode.addWarning(
String.format("Not generating %s(): A method with that name already exists", methodName));
return false;
+ default:
+ case NOT_EXISTS:
+ //continue with creating the getter
}
JCClassDecl javacClassTree = (JCClassDecl) fieldNode.up().get();
@@ -73,6 +81,9 @@ public class HandleGetter implements JavacAnnotationHandler<Getter> {
JCMethodDecl getterMethod = createGetter(access, fieldNode, fieldNode.getTreeMaker());
javacClassTree.defs = javacClassTree.defs.append(getterMethod);
+
+ fieldNode.up().add(getterMethod, Kind.METHOD).recursiveSetHandled();
+
return true;
}
diff --git a/src/lombok/javac/handlers/HandleSetter.java b/src/lombok/javac/handlers/HandleSetter.java
index f1e73489..4999b5d8 100644
--- a/src/lombok/javac/handlers/HandleSetter.java
+++ b/src/lombok/javac/handlers/HandleSetter.java
@@ -31,8 +31,9 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
@ProviderFor(JavacAnnotationHandler.class)
public class HandleSetter implements JavacAnnotationHandler<Setter> {
public void generateSetterForField(Node fieldNode, DiagnosticPosition pos) {
- AccessLevel level = Setter.DEFAULT_ACCESS_LEVEL;
+ AccessLevel level = AccessLevel.PUBLIC;
Node errorNode = fieldNode;
+ boolean whineIfExists = false;
for ( Node child : fieldNode.down() ) {
if ( child.getKind() == Kind.ANNOTATION ) {
@@ -40,21 +41,22 @@ public class HandleSetter implements JavacAnnotationHandler<Setter> {
level = Javac.createAnnotation(Setter.class, child).getInstance().value();
errorNode = child;
pos = child.get();
+ whineIfExists = true;
break;
}
}
}
- createSetterForField(level, fieldNode, errorNode, pos);
+ createSetterForField(level, fieldNode, errorNode, pos, whineIfExists);
}
@Override public boolean handle(AnnotationValues<Setter> annotation, JCAnnotation ast, Node annotationNode) {
Node fieldNode = annotationNode.up();
AccessLevel level = annotation.getInstance().value();
- return createSetterForField(level, fieldNode, annotationNode, annotationNode.get());
+ return createSetterForField(level, fieldNode, annotationNode, annotationNode.get(), true);
}
- private boolean createSetterForField(AccessLevel level, Node fieldNode, Node errorNode, DiagnosticPosition pos) {
+ private boolean createSetterForField(AccessLevel level, Node fieldNode, Node errorNode, DiagnosticPosition pos, boolean whineIfExists) {
if ( fieldNode.getKind() != Kind.FIELD ) {
fieldNode.addError("@Setter is only supported on a field.");
return false;
@@ -63,11 +65,17 @@ public class HandleSetter implements JavacAnnotationHandler<Setter> {
JCVariableDecl fieldDecl = (JCVariableDecl)fieldNode.get();
String methodName = toSetterName(fieldDecl);
- if ( methodExists(methodName, fieldNode) ) {
- errorNode.addWarning(
+ switch ( methodExists(methodName, fieldNode) ) {
+ case EXISTS_BY_LOMBOK:
+ return true;
+ case EXISTS_BY_USER:
+ if ( whineIfExists ) errorNode.addWarning(
String.format("Not generating %s(%s %s): A method with that name already exists",
- methodName, fieldDecl.vartype, fieldDecl.name));
+ methodName, fieldDecl.vartype, fieldDecl.name));
return false;
+ default:
+ case NOT_EXISTS:
+ //continue with creating the setter
}
JCClassDecl javacClassTree = (JCClassDecl) fieldNode.up().get();
@@ -76,6 +84,9 @@ public class HandleSetter implements JavacAnnotationHandler<Setter> {
JCMethodDecl setterMethod = createSetter(access, fieldNode, fieldNode.getTreeMaker());
javacClassTree.defs = javacClassTree.defs.append(setterMethod);
+
+ fieldNode.up().add(setterMethod, Kind.METHOD).recursiveSetHandled();
+
return true;
}
diff --git a/src/lombok/javac/handlers/PKG.java b/src/lombok/javac/handlers/PKG.java
index 2c038b2d..138559a9 100644
--- a/src/lombok/javac/handlers/PKG.java
+++ b/src/lombok/javac/handlers/PKG.java
@@ -28,7 +28,11 @@ class PKG {
return TransformationsUtil.toSetterName(fieldName);
}
- static boolean methodExists(String methodName, JavacAST.Node node) {
+ enum MethodExistsResult {
+ NOT_EXISTS, EXISTS_BY_USER, EXISTS_BY_LOMBOK;
+ }
+
+ static MethodExistsResult methodExists(String methodName, JavacAST.Node node) {
while ( node != null && !(node.get() instanceof JCClassDecl) ) {
node = node.up();
}
@@ -37,13 +41,15 @@ class PKG {
for ( JCTree def : ((JCClassDecl)node.get()).defs ) {
if ( def instanceof JCMethodDecl ) {
if ( ((JCMethodDecl)def).name.contentEquals(methodName) ) {
- return true;
+ JavacAST.Node existing = node.getNodeFor(def);
+ if ( existing == null || !existing.isHandled() ) return MethodExistsResult.EXISTS_BY_USER;
+ return MethodExistsResult.EXISTS_BY_LOMBOK;
}
}
}
}
- return false;
+ return MethodExistsResult.NOT_EXISTS;
}
static int toJavacModifier(AccessLevel accessLevel) {