From 12162391160713e67b5bee7d6b98cfbee54225b8 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Mon, 15 Jun 2009 23:58:52 +0200 Subject: Propagated the fact that you get the Node object belonging to the annotation, and not the field/type/local/method it goes with, all the way, so that you can easily generate a warning on an annotation in a handler. --- src/lombok/eclipse/EclipseAnnotationHandler.java | 2 +- src/lombok/eclipse/HandlerLibrary.java | 16 ++++++++-------- src/lombok/eclipse/TransformEclipseAST.java | 12 ++++++++---- src/lombok/eclipse/handlers/HandleGetter_ecj.java | 16 ++++++++++++---- 4 files changed, 29 insertions(+), 17 deletions(-) (limited to 'src/lombok/eclipse') diff --git a/src/lombok/eclipse/EclipseAnnotationHandler.java b/src/lombok/eclipse/EclipseAnnotationHandler.java index e760917b..c6cc23be 100644 --- a/src/lombok/eclipse/EclipseAnnotationHandler.java +++ b/src/lombok/eclipse/EclipseAnnotationHandler.java @@ -1,5 +1,5 @@ package lombok.eclipse; public interface EclipseAnnotationHandler { - void handle(T annotation, org.eclipse.jdt.internal.compiler.ast.Annotation ast, EclipseAST.Node node); + void handle(T annotation, org.eclipse.jdt.internal.compiler.ast.Annotation ast, EclipseAST.Node annotationNode); } diff --git a/src/lombok/eclipse/HandlerLibrary.java b/src/lombok/eclipse/HandlerLibrary.java index 70c7b267..3590d64a 100644 --- a/src/lombok/eclipse/HandlerLibrary.java +++ b/src/lombok/eclipse/HandlerLibrary.java @@ -45,8 +45,8 @@ public class HandlerLibrary { @SuppressWarnings("unchecked") public void handle(Object annInstance, org.eclipse.jdt.internal.compiler.ast.Annotation annotation, - Node node) { - handler.handle((T) annInstance, annotation, node); + Node annotationNode) { + handler.handle((T) annInstance, annotation, annotationNode); } } @@ -287,19 +287,19 @@ public class HandlerLibrary { return null; } - public void handle(CompilationUnitDeclaration ast, EclipseAST.Node node, + public void handle(CompilationUnitDeclaration ast, EclipseAST.Node annotationNode, org.eclipse.jdt.internal.compiler.ast.Annotation annotation) { - TypeResolver resolver = new TypeResolver(typeLibrary, node.top()); + TypeResolver resolver = new TypeResolver(typeLibrary, annotationNode.top()); TypeReference rawType = annotation.type; if ( rawType == null ) return; - for ( String fqn : resolver.findTypeMatches(node, annotation.type) ) { + for ( String fqn : resolver.findTypeMatches(annotationNode, annotation.type) ) { HandlerContainer container = handlers.get(fqn); if ( container == null ) continue; try { Object annInstance = createAnnotation(container.annotationClass, ast, annotation); - container.handle(annInstance, annotation, node); - } catch (EnumDecodeFail e) { - node.addError(e.getMessage(), e.pair.sourceStart, e.pair.sourceEnd); + container.handle(annInstance, annotation, annotationNode); + } catch ( EnumDecodeFail e ) { + annotationNode.addError(e.getMessage(), e.pair.sourceStart, e.pair.sourceEnd); } } } diff --git a/src/lombok/eclipse/TransformEclipseAST.java b/src/lombok/eclipse/TransformEclipseAST.java index afc4cdb3..6847fd94 100644 --- a/src/lombok/eclipse/TransformEclipseAST.java +++ b/src/lombok/eclipse/TransformEclipseAST.java @@ -113,22 +113,26 @@ public class TransformEclipseAST { private static class AnnotationVisitor extends EclipseASTAdapter { @Override public void visitAnnotationOnField(FieldDeclaration field, Node annotationNode, Annotation annotation) { - handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode.up(), annotation); + if ( annotationNode.isHandled() ) return; + handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode, annotation); annotationNode.setHandled(); } @Override public void visitAnnotationOnLocal(LocalDeclaration local, Node annotationNode, Annotation annotation) { - handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode.up(), annotation); + if ( annotationNode.isHandled() ) return; + handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode, annotation); annotationNode.setHandled(); } @Override public void visitAnnotationOnMethod(AbstractMethodDeclaration method, Node annotationNode, Annotation annotation) { - handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode.up(), annotation); + if ( annotationNode.isHandled() ) return; + handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode, annotation); annotationNode.setHandled(); } @Override public void visitAnnotationOnType(TypeDeclaration type, Node annotationNode, Annotation annotation) { - handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode.up(), annotation); + if ( annotationNode.isHandled() ) return; + handlers.handle((CompilationUnitDeclaration) annotationNode.top().node, annotationNode, annotation); annotationNode.setHandled(); } } diff --git a/src/lombok/eclipse/handlers/HandleGetter_ecj.java b/src/lombok/eclipse/handlers/HandleGetter_ecj.java index 8d00df9f..f9bbb884 100644 --- a/src/lombok/eclipse/handlers/HandleGetter_ecj.java +++ b/src/lombok/eclipse/handlers/HandleGetter_ecj.java @@ -24,15 +24,23 @@ import org.mangosdk.spi.ProviderFor; @ProviderFor(EclipseAnnotationHandler.class) public class HandleGetter_ecj implements EclipseAnnotationHandler { - @Override public void handle(Getter annotation, Annotation ast, Node node) { - FieldDeclaration field = (FieldDeclaration) node.getEclipseNode(); + private void generateDuplicateGetterWarning(Node annotationNode, String methodName) { + annotationNode.addWarning(String.format("Not generating %s(): A method with that name already exists", methodName)); + } + + @Override public void handle(Getter annotation, Annotation ast, Node annotationNode) { + if ( !(annotationNode.up().getEclipseNode() instanceof FieldDeclaration) ) return; + FieldDeclaration field = (FieldDeclaration) annotationNode.up().getEclipseNode(); TypeReference fieldType = field.type; String getterName = TransformationsUtil.toGetterName( new String(field.name), nameEquals(fieldType.getTypeName(), "boolean")); - TypeDeclaration parent = (TypeDeclaration) node.up().getEclipseNode(); + TypeDeclaration parent = (TypeDeclaration) annotationNode.up().up().getEclipseNode(); if ( parent.methods != null ) for ( AbstractMethodDeclaration method : parent.methods ) { - if ( method.selector != null && new String(method.selector).equals(getterName) ) return; + if ( method.selector != null && new String(method.selector).equals(getterName) ) { + generateDuplicateGetterWarning(annotationNode, getterName); + return; + } } MethodDeclaration method = new MethodDeclaration(parent.compilationResult); -- cgit