diff options
Diffstat (limited to 'src/lombok')
-rw-r--r-- | src/lombok/javac/handlers/HandleGetter.java | 9 | ||||
-rw-r--r-- | src/lombok/javac/handlers/HandleSetter.java | 19 | ||||
-rw-r--r-- | src/lombok/javac/handlers/PKG.java | 22 |
3 files changed, 43 insertions, 7 deletions
diff --git a/src/lombok/javac/handlers/HandleGetter.java b/src/lombok/javac/handlers/HandleGetter.java index 781598a2..da1b7107 100644 --- a/src/lombok/javac/handlers/HandleGetter.java +++ b/src/lombok/javac/handlers/HandleGetter.java @@ -25,12 +25,19 @@ import com.sun.tools.javac.util.Name; @ProviderFor(JavacAnnotationHandler.class) public class HandleGetter implements JavacAnnotationHandler<Getter> { @Override public void handle(AnnotationValues<Getter> annotation, JCAnnotation ast, JavacAST.Node annotationNode) { - //TODO Check for existence of the getter and skip it (+ warn) if it's already there. if ( annotationNode.up().getKind() != Kind.FIELD ) { annotationNode.addError("@Getter is only supported on a field."); return; } + String methodName = toGetterName((JCVariableDecl) annotationNode.up().get()); + + if ( methodExists(methodName, annotationNode.up()) ) { + annotationNode.addWarning( + String.format("Not generating %s(): A method with that name already exists", methodName)); + return; + } + Getter getter = annotation.getInstance(); JCClassDecl javacClassTree = (JCClassDecl) annotationNode.up().up().get(); diff --git a/src/lombok/javac/handlers/HandleSetter.java b/src/lombok/javac/handlers/HandleSetter.java index 30702701..0fbfe8ae 100644 --- a/src/lombok/javac/handlers/HandleSetter.java +++ b/src/lombok/javac/handlers/HandleSetter.java @@ -1,10 +1,6 @@ package lombok.javac.handlers; -import static lombok.javac.handlers.PKG.toJavacModifier; -import static lombok.javac.handlers.PKG.toSetterName; - -import org.mangosdk.spi.ProviderFor; - +import static lombok.javac.handlers.PKG.*; import lombok.Setter; import lombok.core.AnnotationValues; import lombok.core.AST.Kind; @@ -12,6 +8,8 @@ import lombok.javac.JavacAST; import lombok.javac.JavacAnnotationHandler; import lombok.javac.JavacAST.Node; +import org.mangosdk.spi.ProviderFor; + import com.sun.tools.javac.tree.TreeMaker; import com.sun.tools.javac.tree.JCTree.JCAnnotation; import com.sun.tools.javac.tree.JCTree.JCAssign; @@ -29,12 +27,21 @@ import com.sun.tools.javac.util.Name; @ProviderFor(JavacAnnotationHandler.class) public class HandleSetter implements JavacAnnotationHandler<Setter> { @Override public void handle(AnnotationValues<Setter> annotation, JCAnnotation ast, Node annotationNode) { - //TODO Check for existence of the setter and skip it (+ warn) if it's already there. if ( annotationNode.up().getKind() != Kind.FIELD ) { annotationNode.addError("@Setter is only supported on a field."); return; } + JCVariableDecl fieldNode = (JCVariableDecl) annotationNode.up().get(); + String methodName = toSetterName(fieldNode); + + if ( methodExists(methodName, annotationNode.up()) ) { + annotationNode.addWarning( + String.format("Not generating %s(%s %s): A method with that name already exists", + methodName, fieldNode.vartype, fieldNode.name)); + return; + } + Setter setter = annotation.getInstance(); JCClassDecl javacClassTree = (JCClassDecl) annotationNode.up().up().get(); diff --git a/src/lombok/javac/handlers/PKG.java b/src/lombok/javac/handlers/PKG.java index 4ea44274..161248c8 100644 --- a/src/lombok/javac/handlers/PKG.java +++ b/src/lombok/javac/handlers/PKG.java @@ -2,10 +2,14 @@ package lombok.javac.handlers; import java.lang.reflect.Modifier; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.JCClassDecl; +import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import lombok.AccessLevel; import lombok.core.TransformationsUtil; +import lombok.javac.JavacAST; class PKG { static String toGetterName(JCVariableDecl field) { @@ -22,6 +26,24 @@ class PKG { return TransformationsUtil.toSetterName(fieldName); } + static boolean methodExists(String methodName, JavacAST.Node node) { + while ( node != null && !(node.get() instanceof JCClassDecl) ) { + node = node.up(); + } + + if ( node.get() instanceof JCClassDecl ) { + for ( JCTree def : ((JCClassDecl)node.get()).defs ) { + if ( def instanceof JCMethodDecl ) { + if ( ((JCMethodDecl)def).name.contentEquals(methodName) ) { + return true; + } + } + } + } + + return false; + } + static int toJavacModifier(AccessLevel accessLevel) { switch ( accessLevel ) { case MODULE: |