From 87cca2d322be09c51d1e63eea195addd1e99a7e2 Mon Sep 17 00:00:00 2001 From: peichhorn Date: Mon, 5 Dec 2011 22:42:50 +0100 Subject: [Issue 275] Allow @Delegate on no-argument methods --- test/transform/resource/after-ecj/DelegateOnMethods.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 test/transform/resource/after-ecj/DelegateOnMethods.java (limited to 'test/transform/resource/after-ecj') diff --git a/test/transform/resource/after-ecj/DelegateOnMethods.java b/test/transform/resource/after-ecj/DelegateOnMethods.java new file mode 100644 index 00000000..cb06d3c1 --- /dev/null +++ b/test/transform/resource/after-ecj/DelegateOnMethods.java @@ -0,0 +1 @@ +//ignore \ No newline at end of file -- cgit From 2242de2bf9886fc80858486bbb3aa171a5496885 Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Tue, 24 Jan 2012 02:52:13 +0100 Subject: Fix for issue 328: @Delegate on a field for which we also generate a getter will use the getter for delegation --- src/core/lombok/eclipse/handlers/HandleGetter.java | 23 +++++++++++-- src/core/lombok/javac/handlers/HandleGetter.java | 27 +++++++++++++++ .../lombok/eclipse/agent/PatchDelegate.java | 4 +++ src/utils/lombok/eclipse/Eclipse.java | 5 +-- .../resource/after-delombok/DelegateOnGetter.java | 35 +++++++++++++++++++ .../resource/after-ecj/DelegateOnGetter.java | 1 + .../resource/after-eclipse/DelegateOnGetter.java | 40 ++++++++++++++++++++++ .../resource/before/DelegateOnGetter.java | 18 ++++++++++ 8 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 test/transform/resource/after-delombok/DelegateOnGetter.java create mode 100644 test/transform/resource/after-ecj/DelegateOnGetter.java create mode 100644 test/transform/resource/after-eclipse/DelegateOnGetter.java create mode 100644 test/transform/resource/before/DelegateOnGetter.java (limited to 'test/transform/resource/after-ecj') diff --git a/src/core/lombok/eclipse/handlers/HandleGetter.java b/src/core/lombok/eclipse/handlers/HandleGetter.java index 1d59afb4..b7d9c5ed 100644 --- a/src/core/lombok/eclipse/handlers/HandleGetter.java +++ b/src/core/lombok/eclipse/handlers/HandleGetter.java @@ -24,18 +24,23 @@ package lombok.eclipse.handlers; import static lombok.eclipse.Eclipse.*; import static lombok.eclipse.handlers.EclipseHandlerUtil.*; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import lombok.AccessLevel; +import lombok.Delegate; import lombok.Getter; +import lombok.core.AST.Kind; import lombok.core.AnnotationValues; import lombok.core.TransformationsUtil; -import lombok.core.AST.Kind; import lombok.eclipse.EclipseAnnotationHandler; import lombok.eclipse.EclipseNode; +import lombok.eclipse.agent.PatchDelegate; +import lombok.eclipse.handlers.EclipseHandlerUtil.FieldAccess; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; @@ -69,6 +74,8 @@ import org.mangosdk.spi.ProviderFor; */ @ProviderFor(EclipseAnnotationHandler.class) public class HandleGetter extends EclipseAnnotationHandler { + private static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0]; + public boolean generateGetterForType(EclipseNode typeNode, EclipseNode pos, AccessLevel level, boolean checkForTypeLevelGetter) { if (checkForTypeLevelGetter) { if (typeNode != null) for (EclipseNode child : typeNode.down()) { @@ -205,13 +212,25 @@ public class HandleGetter extends EclipseAnnotationHandler { } MethodDeclaration method = generateGetter((TypeDeclaration) fieldNode.up().get(), fieldNode, getterName, modifier, source, lazy); - Annotation[] copiedAnnotations = copyAnnotations(source, findAnnotations(field, TransformationsUtil.NON_NULL_PATTERN), findAnnotations(field, TransformationsUtil.NULLABLE_PATTERN)); + Annotation[] copiedAnnotations = copyAnnotations(source, findAnnotations(field, TransformationsUtil.NON_NULL_PATTERN), findAnnotations(field, TransformationsUtil.NULLABLE_PATTERN), findDelegatesAndMarkAsHandled(fieldNode)); if (copiedAnnotations.length != 0) { method.annotations = copiedAnnotations; } injectMethod(fieldNode.up(), method); } + + private static Annotation[] findDelegatesAndMarkAsHandled(EclipseNode fieldNode) { + List delegates = new ArrayList(); + for (EclipseNode child : fieldNode.down()) { + if (annotationTypeMatches(Delegate.class, child)) { + Annotation delegate = (Annotation)child.get(); + PatchDelegate.markHandled(delegate); + delegates.add(delegate); + } + } + return delegates.toArray(EMPTY_ANNOTATIONS_ARRAY); + } private MethodDeclaration generateGetter(TypeDeclaration parent, EclipseNode fieldNode, String name, int modifier, ASTNode source, boolean lazy) { diff --git a/src/core/lombok/javac/handlers/HandleGetter.java b/src/core/lombok/javac/handlers/HandleGetter.java index fe3b86a4..c9d67d7f 100644 --- a/src/core/lombok/javac/handlers/HandleGetter.java +++ b/src/core/lombok/javac/handlers/HandleGetter.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.Map; import lombok.AccessLevel; +import lombok.Delegate; import lombok.Getter; import lombok.core.AnnotationValues; import lombok.core.TransformationsUtil; @@ -240,16 +241,42 @@ public class HandleGetter extends JavacAnnotationHandler { List nonNulls = findAnnotations(field, TransformationsUtil.NON_NULL_PATTERN); List nullables = findAnnotations(field, TransformationsUtil.NULLABLE_PATTERN); + List delegates = findDelegatesAndRemoveFromField(field); + List annsOnMethod = nonNulls.appendList(nullables); JCMethodDecl decl = recursiveSetGeneratedBy(treeMaker.MethodDef(treeMaker.Modifiers(access, annsOnMethod), methodName, methodType, methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source); if (toClearOfMarkers != null) recursiveSetGeneratedBy(toClearOfMarkers, null); + decl.mods.annotations = decl.mods.annotations.appendList(delegates); return decl; } + private static List findDelegatesAndRemoveFromField(JavacNode field) { + JCVariableDecl fieldNode = (JCVariableDecl) field.get(); + + List delegates = List.nil(); + for (JCAnnotation annotation : fieldNode.mods.annotations) { + if (typeMatches(Delegate.class, field, annotation.annotationType)) { + delegates = delegates.append(annotation); + } + } + + if (!delegates.isEmpty()) { + ListBuffer withoutDelegates = ListBuffer.lb(); + for (JCAnnotation annotation : fieldNode.mods.annotations) { + if (!delegates.contains(annotation)) { + withoutDelegates.append(annotation); + } + } + fieldNode.mods.annotations = withoutDelegates.toList(); + field.rebuild(); + } + return delegates; + } + private List createSimpleGetterBody(TreeMaker treeMaker, JavacNode field) { return List.of(treeMaker.Return(createFieldAccessor(treeMaker, field, FieldAccess.ALWAYS_FIELD))); } diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java index 31ec52f4..87335b4e 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java @@ -188,6 +188,10 @@ public class PatchDelegate { private static Map alreadyApplied = new WeakHashMap(); private static final Object MARKER = new Object(); + public static void markHandled(Annotation annotation) { + alreadyApplied.put(annotation, MARKER); + } + private static void fillMethodBindingsForFields(CompilationUnitDeclaration cud, ClassScope scope, List methodsToDelegate) { TypeDeclaration decl = scope.referenceContext; if (decl == null) return; diff --git a/src/utils/lombok/eclipse/Eclipse.java b/src/utils/lombok/eclipse/Eclipse.java index fce0773b..7d21faa2 100644 --- a/src/utils/lombok/eclipse/Eclipse.java +++ b/src/utils/lombok/eclipse/Eclipse.java @@ -43,6 +43,7 @@ import org.eclipse.jdt.internal.compiler.ast.TypeReference; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; public class Eclipse { + private static final Annotation[] EMPTY_ANNOTATIONS_ARRAY = new Annotation[0]; /** * Eclipse's Parser class is instrumented to not attempt to fill in the body of any method or initializer * or field initialization if this flag is set. Set it on the flag field of @@ -120,7 +121,7 @@ public class Eclipse { */ public static Annotation[] findAnnotations(FieldDeclaration field, Pattern namePattern) { List result = new ArrayList(); - if (field.annotations == null) return new Annotation[0]; + if (field.annotations == null) return EMPTY_ANNOTATIONS_ARRAY; for (Annotation annotation : field.annotations) { TypeReference typeRef = annotation.type; if (typeRef != null && typeRef.getTypeName()!= null) { @@ -131,7 +132,7 @@ public class Eclipse { } } } - return result.toArray(new Annotation[0]); + return result.toArray(EMPTY_ANNOTATIONS_ARRAY); } /** diff --git a/test/transform/resource/after-delombok/DelegateOnGetter.java b/test/transform/resource/after-delombok/DelegateOnGetter.java new file mode 100644 index 00000000..ee34018a --- /dev/null +++ b/test/transform/resource/after-delombok/DelegateOnGetter.java @@ -0,0 +1,35 @@ +class DelegateOnGetter { + private final java.util.concurrent.atomic.AtomicReference> bar = new java.util.concurrent.atomic.AtomicReference>(); + private interface Bar { + void setList(java.util.ArrayList list); + int getInt(); + } + @java.lang.SuppressWarnings("all") + public Bar getBar() { + java.util.concurrent.atomic.AtomicReference value = this.bar.get(); + if (value == null) { + synchronized (this.bar) { + value = this.bar.get(); + if (value == null) { + value = new java.util.concurrent.atomic.AtomicReference(new Bar(){ + public void setList(java.util.ArrayList list) { + } + public int getInt() { + return 42; + } + }); + this.bar.set(value); + } + } + } + return value.get(); + } + @java.lang.SuppressWarnings("all") + public void setList(final java.util.ArrayList list) { + this.getBar().setList(list); + } + @java.lang.SuppressWarnings("all") + public int getInt() { + return this.getBar().getInt(); + } +} \ No newline at end of file diff --git a/test/transform/resource/after-ecj/DelegateOnGetter.java b/test/transform/resource/after-ecj/DelegateOnGetter.java new file mode 100644 index 00000000..cb06d3c1 --- /dev/null +++ b/test/transform/resource/after-ecj/DelegateOnGetter.java @@ -0,0 +1 @@ +//ignore \ No newline at end of file diff --git a/test/transform/resource/after-eclipse/DelegateOnGetter.java b/test/transform/resource/after-eclipse/DelegateOnGetter.java new file mode 100644 index 00000000..7d5907e0 --- /dev/null +++ b/test/transform/resource/after-eclipse/DelegateOnGetter.java @@ -0,0 +1,40 @@ +import lombok.Delegate; +import lombok.Getter; +class DelegateOnGetter { + private interface Bar { + void setList(java.util.ArrayList list); + int getInt(); + } + private final @Delegate @Getter(lazy = true) java.util.concurrent.atomic.AtomicReference> bar = new java.util.concurrent.atomic.AtomicReference>(); + public @Delegate @java.lang.SuppressWarnings("all") Bar getBar() { + java.util.concurrent.atomic.AtomicReference value = this.bar.get(); + if ((value == null)) + { + synchronized (this.bar) + { + value = this.bar.get(); + if ((value == null)) + { + value = new java.util.concurrent.atomic.AtomicReference(new Bar() { + public void setList(java.util.ArrayList list) { + } + public int getInt() { + return 42; + } +}); + this.bar.set(value); + } + } + } + return value.get(); + } + public @java.lang.SuppressWarnings("all") int getInt() { + return this.getBar().getInt(); + } + public @java.lang.SuppressWarnings("all") void setList(final java.util.ArrayList list) { + this.getBar().setList(list); + } + DelegateOnGetter() { + super(); + } +} \ No newline at end of file diff --git a/test/transform/resource/before/DelegateOnGetter.java b/test/transform/resource/before/DelegateOnGetter.java new file mode 100644 index 00000000..afe09ff4 --- /dev/null +++ b/test/transform/resource/before/DelegateOnGetter.java @@ -0,0 +1,18 @@ +import lombok.Delegate; +import lombok.Getter; + +class DelegateOnGetter { + + @Delegate @Getter(lazy=true) private final Bar bar = new Bar() { + public void setList(java.util.ArrayList list) { + } + public int getInt() { + return 42; + } + }; + + private interface Bar { + void setList(java.util.ArrayList list); + int getInt(); + } +} \ No newline at end of file -- cgit From bf8b93701a8527dfc7f82d51d4ac22693b70c95c Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Tue, 24 Jan 2012 03:07:14 +0100 Subject: Added test for @Getter(AccessLevel.NONE) --- .../resource/after-delombok/DelegateOnGetterNone.java | 15 +++++++++++++++ .../transform/resource/after-delombok/GetterNone.java | 8 ++++++++ .../resource/after-ecj/DelegateOnGetterNone.java | 1 + test/transform/resource/after-ecj/GetterNone.java | 12 ++++++++++++ .../resource/after-eclipse/DelegateOnGetterNone.java | 19 +++++++++++++++++++ test/transform/resource/after-eclipse/GetterNone.java | 12 ++++++++++++ .../resource/before/DelegateOnGetterNone.java | 14 ++++++++++++++ test/transform/resource/before/GetterNone.java | 8 ++++++++ 8 files changed, 89 insertions(+) create mode 100644 test/transform/resource/after-delombok/DelegateOnGetterNone.java create mode 100644 test/transform/resource/after-delombok/GetterNone.java create mode 100644 test/transform/resource/after-ecj/DelegateOnGetterNone.java create mode 100644 test/transform/resource/after-ecj/GetterNone.java create mode 100644 test/transform/resource/after-eclipse/DelegateOnGetterNone.java create mode 100644 test/transform/resource/after-eclipse/GetterNone.java create mode 100644 test/transform/resource/before/DelegateOnGetterNone.java create mode 100644 test/transform/resource/before/GetterNone.java (limited to 'test/transform/resource/after-ecj') diff --git a/test/transform/resource/after-delombok/DelegateOnGetterNone.java b/test/transform/resource/after-delombok/DelegateOnGetterNone.java new file mode 100644 index 00000000..b3258f25 --- /dev/null +++ b/test/transform/resource/after-delombok/DelegateOnGetterNone.java @@ -0,0 +1,15 @@ +class DelegateOnGetterNone { + private final Bar bar; + private interface Bar { + void setList(java.util.ArrayList list); + int getInt(); + } + @java.lang.SuppressWarnings("all") + public void setList(final java.util.ArrayList list) { + this.bar.setList(list); + } + @java.lang.SuppressWarnings("all") + public int getInt() { + return this.bar.getInt(); + } +} \ No newline at end of file diff --git a/test/transform/resource/after-delombok/GetterNone.java b/test/transform/resource/after-delombok/GetterNone.java new file mode 100644 index 00000000..11b4fd09 --- /dev/null +++ b/test/transform/resource/after-delombok/GetterNone.java @@ -0,0 +1,8 @@ +class GetterNone { + int i; + int foo; + @java.lang.SuppressWarnings("all") + public int getI() { + return this.i; + } +} \ No newline at end of file diff --git a/test/transform/resource/after-ecj/DelegateOnGetterNone.java b/test/transform/resource/after-ecj/DelegateOnGetterNone.java new file mode 100644 index 00000000..cb06d3c1 --- /dev/null +++ b/test/transform/resource/after-ecj/DelegateOnGetterNone.java @@ -0,0 +1 @@ +//ignore \ No newline at end of file diff --git a/test/transform/resource/after-ecj/GetterNone.java b/test/transform/resource/after-ecj/GetterNone.java new file mode 100644 index 00000000..2ab252ea --- /dev/null +++ b/test/transform/resource/after-ecj/GetterNone.java @@ -0,0 +1,12 @@ +import lombok.AccessLevel; +import lombok.Getter; +@Getter class GetterNone { + int i; + @Getter(AccessLevel.NONE) int foo; + public @java.lang.SuppressWarnings("all") int getI() { + return this.i; + } + GetterNone() { + super(); + } +} \ No newline at end of file diff --git a/test/transform/resource/after-eclipse/DelegateOnGetterNone.java b/test/transform/resource/after-eclipse/DelegateOnGetterNone.java new file mode 100644 index 00000000..195797a8 --- /dev/null +++ b/test/transform/resource/after-eclipse/DelegateOnGetterNone.java @@ -0,0 +1,19 @@ +import lombok.AccessLevel; +import lombok.Delegate; +import lombok.Getter; +@Getter class DelegateOnGetterNone { + private interface Bar { + void setList(java.util.ArrayList list); + int getInt(); + } + private final @Delegate @Getter(AccessLevel.NONE) Bar bar; + public @java.lang.SuppressWarnings("all") int getInt() { + return this.bar.getInt(); + } + public @java.lang.SuppressWarnings("all") void setList(final java.util.ArrayList list) { + this.bar.setList(list); + } + DelegateOnGetterNone() { + super(); + } +} \ No newline at end of file diff --git a/test/transform/resource/after-eclipse/GetterNone.java b/test/transform/resource/after-eclipse/GetterNone.java new file mode 100644 index 00000000..2ab252ea --- /dev/null +++ b/test/transform/resource/after-eclipse/GetterNone.java @@ -0,0 +1,12 @@ +import lombok.AccessLevel; +import lombok.Getter; +@Getter class GetterNone { + int i; + @Getter(AccessLevel.NONE) int foo; + public @java.lang.SuppressWarnings("all") int getI() { + return this.i; + } + GetterNone() { + super(); + } +} \ No newline at end of file diff --git a/test/transform/resource/before/DelegateOnGetterNone.java b/test/transform/resource/before/DelegateOnGetterNone.java new file mode 100644 index 00000000..f9642e6b --- /dev/null +++ b/test/transform/resource/before/DelegateOnGetterNone.java @@ -0,0 +1,14 @@ +import lombok.AccessLevel; +import lombok.Delegate; +import lombok.Getter; + +@Getter +class DelegateOnGetterNone { + + @Delegate @Getter(AccessLevel.NONE) private final Bar bar; + + private interface Bar { + void setList(java.util.ArrayList list); + int getInt(); + } +} diff --git a/test/transform/resource/before/GetterNone.java b/test/transform/resource/before/GetterNone.java new file mode 100644 index 00000000..8497e4fc --- /dev/null +++ b/test/transform/resource/before/GetterNone.java @@ -0,0 +1,8 @@ +import lombok.AccessLevel; +import lombok.Getter; + +@Getter +class GetterNone { + int i; + @Getter(AccessLevel.NONE) int foo; +} \ No newline at end of file -- cgit