aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@zwitserloot.com>2021-09-16 02:04:12 +0200
committerGitHub <noreply@github.com>2021-09-16 02:04:12 +0200
commit485c3533bb1b84887f17243c258fdf485b8ea15a (patch)
treee4d0522989907cdeb514e86f125a697fe51009a6
parent602a68b8f8ad0504b2aaf7c939328617dc2f2326 (diff)
parent0f358d38c5e8dc3253503b081c91458c07f71685 (diff)
downloadlombok-485c3533bb1b84887f17243c258fdf485b8ea15a.tar.gz
lombok-485c3533bb1b84887f17243c258fdf485b8ea15a.tar.bz2
lombok-485c3533bb1b84887f17243c258fdf485b8ea15a.zip
Merge pull request #2866 from Rawi01/anonymous-inner-class
Handle anonymous classes properly
-rw-r--r--src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java24
-rwxr-xr-xsrc/core/lombok/eclipse/handlers/HandleBuilder.java5
-rwxr-xr-xsrc/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java9
-rw-r--r--src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java14
-rw-r--r--src/core/lombok/eclipse/handlers/HandleLog.java5
-rw-r--r--src/core/lombok/eclipse/handlers/HandleSuperBuilder.java4
-rw-r--r--src/core/lombok/eclipse/handlers/HandleToString.java4
-rw-r--r--src/core/lombok/javac/handlers/HandleBuilder.java5
-rw-r--r--src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java2
-rw-r--r--src/core/lombok/javac/handlers/HandleFieldNameConstants.java14
-rw-r--r--src/core/lombok/javac/handlers/HandleLog.java5
-rw-r--r--src/core/lombok/javac/handlers/HandleSuperBuilder.java4
-rw-r--r--src/core/lombok/javac/handlers/HandleToString.java7
-rw-r--r--src/core/lombok/javac/handlers/JavacHandlerUtil.java25
-rw-r--r--test/transform/resource/after-delombok/AccessorsInAnonymousClass.java22
-rw-r--r--test/transform/resource/after-delombok/BuilderInAnonymousClass.java8
-rw-r--r--test/transform/resource/after-delombok/ConstructorsInAnonymousClass.java34
-rw-r--r--test/transform/resource/after-delombok/DataInAnonymousClass.java56
-rw-r--r--test/transform/resource/after-delombok/EqualsAndHashCodeInAnonymousClass.java36
-rw-r--r--test/transform/resource/after-delombok/FieldNameConstantsInAnonymousClass.java8
-rw-r--r--test/transform/resource/after-delombok/GetterInAnonymousClass.java13
-rw-r--r--test/transform/resource/after-delombok/GetterLazyInAnonymousClass.java24
-rw-r--r--test/transform/resource/after-delombok/LoggerSlf4jInAnonymousClass.java7
-rw-r--r--test/transform/resource/after-delombok/SetterInAnonymousClass.java13
-rw-r--r--test/transform/resource/after-delombok/SuperBuilderInAnonymousClass.java12
-rw-r--r--test/transform/resource/after-delombok/SynchronizedInAnonymousClass.java15
-rw-r--r--test/transform/resource/after-delombok/ToStringInAnonymousClass.java14
-rw-r--r--test/transform/resource/after-delombok/UtilityClassInAnonymousClass.java8
-rw-r--r--test/transform/resource/after-delombok/ValueInAnonymousClass.java46
-rw-r--r--test/transform/resource/after-delombok/WithByInAnonymousClass.java17
-rw-r--r--test/transform/resource/after-delombok/WithInAnonymousClass.java19
-rw-r--r--test/transform/resource/after-ecj/AccessorsInAnonymousClass.java29
-rw-r--r--test/transform/resource/after-ecj/BuilderInAnonymousClass.java17
-rw-r--r--test/transform/resource/after-ecj/ConstructorsInAnonymousClass.java38
-rw-r--r--test/transform/resource/after-ecj/DataInAnonymousClass.java50
-rw-r--r--test/transform/resource/after-ecj/EqualsAndHashCodeInAnonymousClass.java41
-rw-r--r--test/transform/resource/after-ecj/FieldNameConstantsInAnonymousClass.java17
-rw-r--r--test/transform/resource/after-ecj/GetterInAnonymousClass.java20
-rw-r--r--test/transform/resource/after-ecj/GetterLazyInAnonymousClass.java34
-rw-r--r--test/transform/resource/after-ecj/LoggerSlf4jInAnonymousClass.java16
-rw-r--r--test/transform/resource/after-ecj/SetterInAnonymousClass.java20
-rw-r--r--test/transform/resource/after-ecj/SuperBuilderInAnonymousClass.java23
-rw-r--r--test/transform/resource/after-ecj/SynchronizedInAnonymousClass.java23
-rw-r--r--test/transform/resource/after-ecj/ToStringInAnonymousClass.java20
-rw-r--r--test/transform/resource/after-ecj/UtilityClassInAnonymousClass.java17
-rw-r--r--test/transform/resource/after-ecj/ValueInAnonymousClass.java43
-rw-r--r--test/transform/resource/after-ecj/WithByInAnonymousClass.java20
-rw-r--r--test/transform/resource/after-ecj/WithInAnonymousClass.java23
-rw-r--r--test/transform/resource/before/AccessorsInAnonymousClass.java14
-rw-r--r--test/transform/resource/before/BuilderInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/ConstructorsInAnonymousClass.java18
-rw-r--r--test/transform/resource/before/DataInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/EqualsAndHashCodeInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/FieldNameConstantsInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/GetterInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/GetterLazyInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/LoggerSlf4jInAnonymousClass.java9
-rw-r--r--test/transform/resource/before/SetterInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/SuperBuilderInAnonymousClass.java15
-rw-r--r--test/transform/resource/before/SynchronizedInAnonymousClass.java12
-rw-r--r--test/transform/resource/before/ToStringInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/UtilityClassInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/ValueInAnonymousClass.java10
-rw-r--r--test/transform/resource/before/WithByInAnonymousClass.java13
-rw-r--r--test/transform/resource/before/WithInAnonymousClass.java12
-rw-r--r--test/transform/resource/messages-delombok/BuilderInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-delombok/FieldNameConstantsInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-delombok/LoggerSlf4jInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-delombok/SuperBuilderInAnonymousClass.java.messages2
-rw-r--r--test/transform/resource/messages-delombok/UtilityClassInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/BuilderInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/FieldNameConstantsInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/LoggerSlf4jInAnonymousClass.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/SuperBuilderInAnonymousClass.java.messages2
-rw-r--r--test/transform/resource/messages-ecj/UtilityClassInAnonymousClass.java.messages1
75 files changed, 1107 insertions, 28 deletions
diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
index 5eea980c..a9f435fd 100644
--- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
+++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
@@ -1042,7 +1042,7 @@ public class EclipseHandlerUtil {
res[count] = name;
n = parent;
- while (n != null && n.getKind() == Kind.TYPE && n.get() instanceof TypeDeclaration) {
+ while (count > 0) {
TypeDeclaration td = (TypeDeclaration) n.get();
res[--count] = td.name;
n = n.up();
@@ -2636,6 +2636,13 @@ public class EclipseHandlerUtil {
}
/**
+ * Returns {@code true} if the provided node is an actual class, an enum or a record and not some other type declaration (so, not an annotation definition or interface).
+ */
+ public static boolean isClassEnumOrRecord(EclipseNode typeNode) {
+ return isTypeAndDoesNotHaveFlags(typeNode, ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation);
+ }
+
+ /**
* Returns {@code true} if the provided node is a record declaration (so, not an annotation definition, interface, enum, or plain class).
*/
public static boolean isRecord(EclipseNode typeNode) {
@@ -2662,6 +2669,21 @@ public class EclipseHandlerUtil {
return (modifiers & flags) == 0;
}
+ /**
+ * Returns {@code true} if the provided node supports static methods and types (top level or static class)
+ */
+ public static boolean isStaticAllowed(EclipseNode typeNode) {
+ boolean staticAllowed = true;
+
+ while (typeNode.getKind() != Kind.COMPILATION_UNIT) {
+ if (!staticAllowed) return false;
+
+ staticAllowed = typeNode.isStatic();
+ typeNode = typeNode.up();
+ }
+ return true;
+ }
+
public static AbstractVariableDeclaration[] getRecordComponents(TypeDeclaration typeDeclaration) {
if (typeDeclaration == null || (typeDeclaration.modifiers & AccRecord) == 0) return null;
try {
diff --git a/src/core/lombok/eclipse/handlers/HandleBuilder.java b/src/core/lombok/eclipse/handlers/HandleBuilder.java
index dab774f3..82d3bfcf 100755
--- a/src/core/lombok/eclipse/handlers/HandleBuilder.java
+++ b/src/core/lombok/eclipse/handlers/HandleBuilder.java
@@ -293,6 +293,11 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
List<EclipseNode> nonFinalNonDefaultedFields = null;
+ if (!isStaticAllowed(upToTypeNode(parent))) {
+ annotationNode.addError("@Builder is not supported on non-static nested classes.");
+ return;
+ }
+
if (parent.get() instanceof TypeDeclaration) {
if (!isClass(parent) && !isRecord(parent)) {
annotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);
diff --git a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
index 12a3c315..a5e8dfb5 100755
--- a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
@@ -538,14 +538,15 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
if (addWildcards) genericsCount.add(arraySizeOf(((TypeDeclaration) type.get()).typeParameters));
boolean staticContext = (((TypeDeclaration) type.get()).modifiers & ClassFileConstants.AccStatic) != 0;
EclipseNode tNode = type.up();
- if (!staticContext && tNode.getKind() == Kind.TYPE && (((TypeDeclaration) tNode.get()).modifiers & ClassFileConstants.AccInterface) != 0) staticContext = true;
while (tNode != null && tNode.getKind() == Kind.TYPE) {
+ TypeDeclaration td = (TypeDeclaration) tNode.get();
+ if (td.name == null || td.name.length == 0) break;
list.add(tNode.getName());
- if (addWildcards) genericsCount.add(staticContext ? 0 : arraySizeOf(((TypeDeclaration) tNode.get()).typeParameters));
- if (!staticContext) staticContext = (((TypeDeclaration) tNode.get()).modifiers & Modifier.STATIC) != 0;
+ if (!staticContext && tNode.getKind() == Kind.TYPE && (td.modifiers & ClassFileConstants.AccInterface) != 0) staticContext = true;
+ if (addWildcards) genericsCount.add(staticContext ? 0 : arraySizeOf(td.typeParameters));
+ if (!staticContext) staticContext = (td.modifiers & Modifier.STATIC) != 0;
tNode = tNode.up();
- if (!staticContext && tNode.getKind() == Kind.TYPE && (((TypeDeclaration) tNode.get()).modifiers & ClassFileConstants.AccInterface) != 0) staticContext = true;
}
Collections.reverse(list);
if (addWildcards) Collections.reverse(genericsCount);
diff --git a/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java b/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java
index cc1a5c3f..071dcdfb 100644
--- a/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java
+++ b/src/core/lombok/eclipse/handlers/HandleFieldNameConstants.java
@@ -60,14 +60,12 @@ public class HandleFieldNameConstants extends EclipseAnnotationHandler<FieldName
private static final IdentifierName FIELDS = IdentifierName.valueOf("Fields");
public void generateFieldNameConstantsForType(EclipseNode typeNode, EclipseNode errorNode, AccessLevel level, boolean asEnum, IdentifierName innerTypeName, boolean onlyExplicit, boolean uppercase) {
- TypeDeclaration typeDecl = null;
- if (typeNode.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) typeNode.get();
-
- int modifiers = typeDecl == null ? 0 : typeDecl.modifiers;
- boolean notAClass = (modifiers & (ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation)) != 0;
-
- if (typeDecl == null || notAClass) {
- errorNode.addError("@FieldNameConstants is only supported on a class or an enum.");
+ if (!isClassEnumOrRecord(typeNode)) {
+ errorNode.addError("@FieldNameConstants is only supported on a class, an enum or a record.");
+ return;
+ }
+ if (!isStaticAllowed(typeNode)) {
+ errorNode.addError("@FieldNameConstants is not supported on non-static nested classes.");
return;
}
diff --git a/src/core/lombok/eclipse/handlers/HandleLog.java b/src/core/lombok/eclipse/handlers/HandleLog.java
index 1cac2de7..db9104ef 100644
--- a/src/core/lombok/eclipse/handlers/HandleLog.java
+++ b/src/core/lombok/eclipse/handlers/HandleLog.java
@@ -88,6 +88,11 @@ public class HandleLog {
return;
}
+ if (useStatic && !isStaticAllowed(owner)) {
+ annotationNode.addError(framework.getAnnotationAsString() + " is not supported on non-static nested classes.");
+ return;
+ }
+
Object valueGuess = annotation.getValueGuess("topic");
Expression loggerTopic = (Expression) annotation.getActualExpression("topic");
diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
index 4d5d2448..5bc6c125 100644
--- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
+++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
@@ -184,6 +184,10 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
annotationNode.addError("@SuperBuilder is only supported on classes.");
return;
}
+ if (!isStaticAllowed(parent)) {
+ annotationNode.addError("@SuperBuilder is not supported on non-static nested classes.");
+ return;
+ }
job.parentType = parent;
TypeDeclaration td = (TypeDeclaration) parent.get();
diff --git a/src/core/lombok/eclipse/handlers/HandleToString.java b/src/core/lombok/eclipse/handlers/HandleToString.java
index 171402b3..05b0e069 100644
--- a/src/core/lombok/eclipse/handlers/HandleToString.java
+++ b/src/core/lombok/eclipse/handlers/HandleToString.java
@@ -315,7 +315,9 @@ public class HandleToString extends EclipseAnnotationHandler<ToString> {
String typeName = getSingleTypeName(type);
EclipseNode upType = type.up();
while (upType.getKind() == Kind.TYPE) {
- typeName = getSingleTypeName(upType) + "." + typeName;
+ String upTypeName = getSingleTypeName(upType);
+ if (upTypeName.isEmpty()) break;
+ typeName = upTypeName + "." + typeName;
upType = upType.up();
}
return typeName;
diff --git a/src/core/lombok/javac/handlers/HandleBuilder.java b/src/core/lombok/javac/handlers/HandleBuilder.java
index c23dc14c..bb852b55 100644
--- a/src/core/lombok/javac/handlers/HandleBuilder.java
+++ b/src/core/lombok/javac/handlers/HandleBuilder.java
@@ -234,6 +234,11 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
ArrayList<JavacNode> nonFinalNonDefaultedFields = null;
+ if (!isStaticAllowed(upToTypeNode(parent))) {
+ annotationNode.addError("@Builder is not supported on non-static nested classes.");
+ return;
+ }
+
if (parent.get() instanceof JCClassDecl) {
if (!isClass(parent) && !isRecord(parent)) {
annotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);
diff --git a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
index ffe882d8..dace3521 100644
--- a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
@@ -385,7 +385,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
boolean staticContext = (((JCClassDecl) type.get()).getModifiers().flags & Flags.STATIC) != 0;
JavacNode tNode = type.up();
- while (tNode != null && tNode.getKind() == Kind.TYPE) {
+ while (tNode != null && tNode.getKind() == Kind.TYPE && !tNode.getName().isEmpty()) {
list.add(tNode.getName());
if (addWildcards) genericsCount.add(staticContext ? 0 : ((JCClassDecl) tNode.get()).typarams.size());
if (!staticContext) staticContext = (((JCClassDecl) tNode.get()).getModifiers().flags & Flags.STATIC) != 0;
diff --git a/src/core/lombok/javac/handlers/HandleFieldNameConstants.java b/src/core/lombok/javac/handlers/HandleFieldNameConstants.java
index f3c879d5..1fc6beb1 100644
--- a/src/core/lombok/javac/handlers/HandleFieldNameConstants.java
+++ b/src/core/lombok/javac/handlers/HandleFieldNameConstants.java
@@ -57,14 +57,12 @@ public class HandleFieldNameConstants extends JavacAnnotationHandler<FieldNameCo
private static final IdentifierName FIELDS = IdentifierName.valueOf("Fields");
public void generateFieldNameConstantsForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean asEnum, IdentifierName innerTypeName, boolean onlyExplicit, boolean uppercase) {
- JCClassDecl typeDecl = null;
- if (typeNode.get() instanceof JCClassDecl) typeDecl = (JCClassDecl) typeNode.get();
-
- long modifiers = typeDecl == null ? 0 : typeDecl.mods.flags;
- boolean notAClass = (modifiers & (Flags.INTERFACE | Flags.ANNOTATION)) != 0;
-
- if (typeDecl == null || notAClass) {
- errorNode.addError("@FieldNameConstants is only supported on a class or an enum.");
+ if (!isClassEnumOrRecord(typeNode)) {
+ errorNode.addError("@FieldNameConstants is only supported on a class, an enum or a record.");
+ return;
+ }
+ if (!isStaticAllowed(typeNode)) {
+ errorNode.addError("@FieldNameConstants is not supported on non-static nested classes.");
return;
}
diff --git a/src/core/lombok/javac/handlers/HandleLog.java b/src/core/lombok/javac/handlers/HandleLog.java
index 40f7ff08..957f5581 100644
--- a/src/core/lombok/javac/handlers/HandleLog.java
+++ b/src/core/lombok/javac/handlers/HandleLog.java
@@ -80,6 +80,11 @@ public class HandleLog {
return;
}
+ if (useStatic && !isStaticAllowed(typeNode)) {
+ annotationNode.addError(framework.getAnnotationAsString() + " is not supported on non-static nested classes.");
+ return;
+ }
+
Object valueGuess = annotation.getValueGuess("topic");
JCExpression loggerTopic = (JCExpression) annotation.getActualExpression("topic");
diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java
index 87b18576..50193f99 100644
--- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java
+++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java
@@ -163,6 +163,10 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
annotationNode.addError("@SuperBuilder is only supported on classes.");
return;
}
+ if (!isStaticAllowed(parent)) {
+ annotationNode.addError("@SuperBuilder is not supported on non-static nested classes.");
+ return;
+ }
job.parentType = parent;
JCClassDecl td = (JCClassDecl) parent.get();
diff --git a/src/core/lombok/javac/handlers/HandleToString.java b/src/core/lombok/javac/handlers/HandleToString.java
index 3fc6a4e4..249993ee 100644
--- a/src/core/lombok/javac/handlers/HandleToString.java
+++ b/src/core/lombok/javac/handlers/HandleToString.java
@@ -44,7 +44,6 @@ import com.sun.tools.javac.code.Flags;
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
import com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;
import com.sun.tools.javac.tree.JCTree.JCBlock;
-import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
@@ -252,10 +251,10 @@ public class HandleToString extends JavacAnnotationHandler<ToString> {
}
public static String getTypeName(JavacNode typeNode) {
- String typeName = ((JCClassDecl) typeNode.get()).name.toString();
+ String typeName = typeNode.getName();
JavacNode upType = typeNode.up();
- while (upType.getKind() == Kind.TYPE) {
- typeName = ((JCClassDecl) upType.get()).name.toString() + "." + typeName;
+ while (upType.getKind() == Kind.TYPE && !upType.getName().isEmpty()) {
+ typeName = upType.getName() + "." + typeName;
upType = upType.up();
}
return typeName;
diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
index 78c20d39..8fdf9a7f 100644
--- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java
+++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java
@@ -1286,6 +1286,7 @@ public class JavacHandlerUtil {
static Type classEnter(JCTree tree, JavacNode parent) {
Enter enter = Enter.instance(parent.getContext());
Env<AttrContext> classEnv = enter.getEnv((TypeSymbol) parent.getElement());
+ if (classEnv == null) return null;
Type type = (Type) Permit.invokeSneaky(classEnter, enter, tree, classEnv);
if (type == null) return null;
type.complete();
@@ -1902,7 +1903,7 @@ public class JavacHandlerUtil {
public static JCExpression namePlusTypeParamsToTypeReference(JavacTreeMaker maker, JavacNode parentType, Name typeName, boolean instance, List<JCTypeParameter> params, List<JCAnnotation> annotations) {
JCExpression r = null;
- if (parentType != null && parentType.getKind() == Kind.TYPE) {
+ if (parentType != null && parentType.getKind() == Kind.TYPE && !parentType.getName().isEmpty()) {
JCClassDecl td = (JCClassDecl) parentType.get();
boolean outerInstance = instance && ((td.mods.flags & Flags.STATIC) == 0);
List<JCTypeParameter> outerParams = instance ? td.typarams : List.<JCTypeParameter>nil();
@@ -1979,6 +1980,13 @@ public class JavacHandlerUtil {
}
/**
+ * Returns {@code true} if the provided node is an actual class, an enum or a record and not some other type declaration (so, not an annotation definition or interface).
+ */
+ public static boolean isClassEnumOrRecord(JavacNode typeNode) {
+ return isClassAndDoesNotHaveFlags(typeNode, Flags.INTERFACE | Flags.ANNOTATION);
+ }
+
+ /**
* Returns {@code true} if the provided node is a record declaration (so, not an annotation definition, interface, enum, or plain class).
*/
public static boolean isRecord(JavacNode typeNode) {
@@ -1994,6 +2002,21 @@ public class JavacHandlerUtil {
return (typeDeclflags & flags) == 0;
}
+ /**
+ * Returns {@code true} if the provided node supports static methods and types (top level or static class)
+ */
+ public static boolean isStaticAllowed(JavacNode typeNode) {
+ boolean staticAllowed = true;
+
+ while (typeNode.getKind() != Kind.COMPILATION_UNIT) {
+ if (!staticAllowed) return false;
+
+ staticAllowed = typeNode.isStatic();
+ typeNode = typeNode.up();
+ }
+ return true;
+ }
+
public static JavacNode upToTypeNode(JavacNode node) {
if (node == null) throw new NullPointerException("node");
while ((node != null) && !(node.get() instanceof JCClassDecl)) node = node.up();
diff --git a/test/transform/resource/after-delombok/AccessorsInAnonymousClass.java b/test/transform/resource/after-delombok/AccessorsInAnonymousClass.java
new file mode 100644
index 00000000..27fab509
--- /dev/null
+++ b/test/transform/resource/after-delombok/AccessorsInAnonymousClass.java
@@ -0,0 +1,22 @@
+public class AccessorsInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+
+ @java.lang.SuppressWarnings("all")
+ public String string() {
+ return this.string;
+ }
+
+ /**
+ * @return {@code this}.
+ */
+ @java.lang.SuppressWarnings("all")
+ public Inner string(final String string) {
+ this.string = string;
+ return this;
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/BuilderInAnonymousClass.java b/test/transform/resource/after-delombok/BuilderInAnonymousClass.java
new file mode 100644
index 00000000..4810a0a8
--- /dev/null
+++ b/test/transform/resource/after-delombok/BuilderInAnonymousClass.java
@@ -0,0 +1,8 @@
+public class BuilderInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/ConstructorsInAnonymousClass.java b/test/transform/resource/after-delombok/ConstructorsInAnonymousClass.java
new file mode 100644
index 00000000..7483718f
--- /dev/null
+++ b/test/transform/resource/after-delombok/ConstructorsInAnonymousClass.java
@@ -0,0 +1,34 @@
+//version 8:
+import lombok.NonNull;
+
+public class ConstructorsInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+ @NonNull
+ private String string2;
+
+ @java.lang.SuppressWarnings("all")
+ public Inner(final String string, @NonNull final String string2) {
+ if (string2 == null) {
+ throw new java.lang.NullPointerException("string2 is marked non-null but is null");
+ }
+ this.string = string;
+ this.string2 = string2;
+ }
+
+ @java.lang.SuppressWarnings("all")
+ public Inner(@NonNull final String string2) {
+ if (string2 == null) {
+ throw new java.lang.NullPointerException("string2 is marked non-null but is null");
+ }
+ this.string2 = string2;
+ }
+
+ @java.lang.SuppressWarnings("all")
+ public Inner() {
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/DataInAnonymousClass.java b/test/transform/resource/after-delombok/DataInAnonymousClass.java
new file mode 100644
index 00000000..788d7be5
--- /dev/null
+++ b/test/transform/resource/after-delombok/DataInAnonymousClass.java
@@ -0,0 +1,56 @@
+public class DataInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+
+ @java.lang.SuppressWarnings("all")
+ public Inner() {
+ }
+
+ @java.lang.SuppressWarnings("all")
+ public String getString() {
+ return this.string;
+ }
+
+ @java.lang.SuppressWarnings("all")
+ public void setString(final String string) {
+ this.string = string;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public boolean equals(final java.lang.Object o) {
+ if (o == this) return true;
+ if (!(o instanceof Inner)) return false;
+ final Inner other = (Inner) o;
+ if (!other.canEqual((java.lang.Object) this)) return false;
+ final java.lang.Object this$string = this.getString();
+ final java.lang.Object other$string = other.getString();
+ if (this$string == null ? other$string != null : !this$string.equals(other$string)) return false;
+ return true;
+ }
+
+ @java.lang.SuppressWarnings("all")
+ protected boolean canEqual(final java.lang.Object other) {
+ return other instanceof Inner;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final java.lang.Object $string = this.getString();
+ result = result * PRIME + ($string == null ? 43 : $string.hashCode());
+ return result;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public java.lang.String toString() {
+ return "Inner(string=" + this.getString() + ")";
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/EqualsAndHashCodeInAnonymousClass.java b/test/transform/resource/after-delombok/EqualsAndHashCodeInAnonymousClass.java
new file mode 100644
index 00000000..6f0b5738
--- /dev/null
+++ b/test/transform/resource/after-delombok/EqualsAndHashCodeInAnonymousClass.java
@@ -0,0 +1,36 @@
+public class EqualsAndHashCodeInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public boolean equals(final java.lang.Object o) {
+ if (o == this) return true;
+ if (!(o instanceof Inner)) return false;
+ final Inner other = (Inner) o;
+ if (!other.canEqual((java.lang.Object) this)) return false;
+ final java.lang.Object this$string = this.string;
+ final java.lang.Object other$string = other.string;
+ if (this$string == null ? other$string != null : !this$string.equals(other$string)) return false;
+ return true;
+ }
+
+ @java.lang.SuppressWarnings("all")
+ protected boolean canEqual(final java.lang.Object other) {
+ return other instanceof Inner;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final java.lang.Object $string = this.string;
+ result = result * PRIME + ($string == null ? 43 : $string.hashCode());
+ return result;
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/FieldNameConstantsInAnonymousClass.java b/test/transform/resource/after-delombok/FieldNameConstantsInAnonymousClass.java
new file mode 100644
index 00000000..1f7e7d7a
--- /dev/null
+++ b/test/transform/resource/after-delombok/FieldNameConstantsInAnonymousClass.java
@@ -0,0 +1,8 @@
+public class FieldNameConstantsInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/GetterInAnonymousClass.java b/test/transform/resource/after-delombok/GetterInAnonymousClass.java
new file mode 100644
index 00000000..3c990545
--- /dev/null
+++ b/test/transform/resource/after-delombok/GetterInAnonymousClass.java
@@ -0,0 +1,13 @@
+public class GetterInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+
+ @java.lang.SuppressWarnings("all")
+ public String getString() {
+ return this.string;
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/GetterLazyInAnonymousClass.java b/test/transform/resource/after-delombok/GetterLazyInAnonymousClass.java
new file mode 100644
index 00000000..4476e463
--- /dev/null
+++ b/test/transform/resource/after-delombok/GetterLazyInAnonymousClass.java
@@ -0,0 +1,24 @@
+public class GetterLazyInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private final java.util.concurrent.atomic.AtomicReference<java.lang.Object> string = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
+
+ @java.lang.SuppressWarnings({"all", "unchecked"})
+ public String getString() {
+ java.lang.Object value = this.string.get();
+ if (value == null) {
+ synchronized (this.string) {
+ value = this.string.get();
+ if (value == null) {
+ final String actualValue = "test";
+ value = actualValue == null ? this.string : actualValue;
+ this.string.set(value);
+ }
+ }
+ }
+ return (String) (value == this.string ? null : value);
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/LoggerSlf4jInAnonymousClass.java b/test/transform/resource/after-delombok/LoggerSlf4jInAnonymousClass.java
new file mode 100644
index 00000000..1ec25d92
--- /dev/null
+++ b/test/transform/resource/after-delombok/LoggerSlf4jInAnonymousClass.java
@@ -0,0 +1,7 @@
+public class LoggerSlf4jInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/SetterInAnonymousClass.java b/test/transform/resource/after-delombok/SetterInAnonymousClass.java
new file mode 100644
index 00000000..ced2be52
--- /dev/null
+++ b/test/transform/resource/after-delombok/SetterInAnonymousClass.java
@@ -0,0 +1,13 @@
+public class SetterInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+
+ @java.lang.SuppressWarnings("all")
+ public void setString(final String string) {
+ this.string = string;
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/SuperBuilderInAnonymousClass.java b/test/transform/resource/after-delombok/SuperBuilderInAnonymousClass.java
new file mode 100644
index 00000000..cc654919
--- /dev/null
+++ b/test/transform/resource/after-delombok/SuperBuilderInAnonymousClass.java
@@ -0,0 +1,12 @@
+public class SuperBuilderInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class InnerParent {
+ private String string;
+ }
+
+ class InnerChild {
+ private String string;
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/SynchronizedInAnonymousClass.java b/test/transform/resource/after-delombok/SynchronizedInAnonymousClass.java
new file mode 100644
index 00000000..904487a3
--- /dev/null
+++ b/test/transform/resource/after-delombok/SynchronizedInAnonymousClass.java
@@ -0,0 +1,15 @@
+public class SynchronizedInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ @java.lang.SuppressWarnings("all")
+ private final java.lang.Object $lock = new java.lang.Object[0];
+
+ public void foo() {
+ synchronized (this.$lock) {
+ String foo = "bar";
+ }
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/ToStringInAnonymousClass.java b/test/transform/resource/after-delombok/ToStringInAnonymousClass.java
new file mode 100644
index 00000000..aa3651bb
--- /dev/null
+++ b/test/transform/resource/after-delombok/ToStringInAnonymousClass.java
@@ -0,0 +1,14 @@
+public class ToStringInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public java.lang.String toString() {
+ return "Inner(string=" + this.string + ")";
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/UtilityClassInAnonymousClass.java b/test/transform/resource/after-delombok/UtilityClassInAnonymousClass.java
new file mode 100644
index 00000000..3df9b559
--- /dev/null
+++ b/test/transform/resource/after-delombok/UtilityClassInAnonymousClass.java
@@ -0,0 +1,8 @@
+public class UtilityClassInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private String string;
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/ValueInAnonymousClass.java b/test/transform/resource/after-delombok/ValueInAnonymousClass.java
new file mode 100644
index 00000000..5bab4093
--- /dev/null
+++ b/test/transform/resource/after-delombok/ValueInAnonymousClass.java
@@ -0,0 +1,46 @@
+public class ValueInAnonymousClass {
+ Object annonymous = new Object() {
+
+ final class Inner {
+ private final String string;
+
+ @java.lang.SuppressWarnings("all")
+ public Inner(final String string) {
+ this.string = string;
+ }
+
+ @java.lang.SuppressWarnings("all")
+ public String getString() {
+ return this.string;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public boolean equals(final java.lang.Object o) {
+ if (o == this) return true;
+ if (!(o instanceof Inner)) return false;
+ final Inner other = (Inner) o;
+ final java.lang.Object this$string = this.getString();
+ final java.lang.Object other$string = other.getString();
+ if (this$string == null ? other$string != null : !this$string.equals(other$string)) return false;
+ return true;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final java.lang.Object $string = this.getString();
+ result = result * PRIME + ($string == null ? 43 : $string.hashCode());
+ return result;
+ }
+
+ @java.lang.Override
+ @java.lang.SuppressWarnings("all")
+ public java.lang.String toString() {
+ return "Inner(string=" + this.getString() + ")";
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/WithByInAnonymousClass.java b/test/transform/resource/after-delombok/WithByInAnonymousClass.java
new file mode 100644
index 00000000..d84955b6
--- /dev/null
+++ b/test/transform/resource/after-delombok/WithByInAnonymousClass.java
@@ -0,0 +1,17 @@
+//version 8:
+public class WithByInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private Inner(String string) {
+ }
+
+ private String string;
+
+ @java.lang.SuppressWarnings("all")
+ public Inner withStringBy(final java.util.function.Function<? super String, ? extends String> transformer) {
+ return new Inner(transformer.apply(this.string));
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-delombok/WithInAnonymousClass.java b/test/transform/resource/after-delombok/WithInAnonymousClass.java
new file mode 100644
index 00000000..02490533
--- /dev/null
+++ b/test/transform/resource/after-delombok/WithInAnonymousClass.java
@@ -0,0 +1,19 @@
+public class WithInAnonymousClass {
+ Object annonymous = new Object() {
+
+ class Inner {
+ private Inner(String string) {
+ }
+
+ private String string;
+
+ /**
+ * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).
+ */
+ @java.lang.SuppressWarnings("all")
+ public Inner withString(final String string) {
+ return this.string == string ? this : new Inner(string);
+ }
+ }
+ };
+}
diff --git a/test/transform/resource/after-ecj/AccessorsInAnonymousClass.java b/test/transform/resource/after-ecj/AccessorsInAnonymousClass.java
new file mode 100644
index 00000000..34db4f2d
--- /dev/null
+++ b/test/transform/resource/after-ecj/AccessorsInAnonymousClass.java
@@ -0,0 +1,29 @@
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+public class AccessorsInAnonymousClass {
+ Object annonymous = new Object() {
+ @Getter @Setter @Accessors(fluent = true) class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ public @java.lang.SuppressWarnings("all") String string() {
+ return this.string;
+ }
+ /**
+ * @return {@code this}.
+ */
+ public @java.lang.SuppressWarnings("all") Inner string(final String string) {
+ this.string = string;
+ return this;
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public AccessorsInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/BuilderInAnonymousClass.java b/test/transform/resource/after-ecj/BuilderInAnonymousClass.java
new file mode 100644
index 00000000..67660822
--- /dev/null
+++ b/test/transform/resource/after-ecj/BuilderInAnonymousClass.java
@@ -0,0 +1,17 @@
+import lombok.Builder;
+public class BuilderInAnonymousClass {
+ Object annonymous = new Object() {
+ @Builder class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public BuilderInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/ConstructorsInAnonymousClass.java b/test/transform/resource/after-ecj/ConstructorsInAnonymousClass.java
new file mode 100644
index 00000000..545ab04d
--- /dev/null
+++ b/test/transform/resource/after-ecj/ConstructorsInAnonymousClass.java
@@ -0,0 +1,38 @@
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+public class ConstructorsInAnonymousClass {
+ Object annonymous = new Object() {
+ @AllArgsConstructor @RequiredArgsConstructor @NoArgsConstructor class Inner {
+ private String string;
+ private @NonNull String string2;
+ public @java.lang.SuppressWarnings("all") Inner(final String string, final @NonNull String string2) {
+ super();
+ if ((string2 == null))
+ {
+ throw new java.lang.NullPointerException("string2 is marked non-null but is null");
+ }
+ this.string = string;
+ this.string2 = string2;
+ }
+ public @java.lang.SuppressWarnings("all") Inner(final @NonNull String string2) {
+ super();
+ if ((string2 == null))
+ {
+ throw new java.lang.NullPointerException("string2 is marked non-null but is null");
+ }
+ this.string2 = string2;
+ }
+ public @java.lang.SuppressWarnings("all") Inner() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public ConstructorsInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/DataInAnonymousClass.java b/test/transform/resource/after-ecj/DataInAnonymousClass.java
new file mode 100644
index 00000000..c6e22f80
--- /dev/null
+++ b/test/transform/resource/after-ecj/DataInAnonymousClass.java
@@ -0,0 +1,50 @@
+import lombok.Data;
+public class DataInAnonymousClass {
+ Object annonymous = new Object() {
+ @Data class Inner {
+ private String string;
+ public @java.lang.SuppressWarnings("all") String getString() {
+ return this.string;
+ }
+ public @java.lang.SuppressWarnings("all") void setString(final String string) {
+ this.string = string;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
+ if ((o == this))
+ return true;
+ if ((! (o instanceof Inner)))
+ return false;
+ final Inner other = (Inner) o;
+ if ((! other.canEqual((java.lang.Object) this)))
+ return false;
+ final java.lang.Object this$string = this.getString();
+ final java.lang.Object other$string = other.getString();
+ if (((this$string == null) ? (other$string != null) : (! this$string.equals(other$string))))
+ return false;
+ return true;
+ }
+ protected @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Inner);
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final java.lang.Object $string = this.getString();
+ result = ((result * PRIME) + (($string == null) ? 43 : $string.hashCode()));
+ return result;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
+ return (("Inner(string=" + this.getString()) + ")");
+ }
+ public @java.lang.SuppressWarnings("all") Inner() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public DataInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/EqualsAndHashCodeInAnonymousClass.java b/test/transform/resource/after-ecj/EqualsAndHashCodeInAnonymousClass.java
new file mode 100644
index 00000000..e66850bb
--- /dev/null
+++ b/test/transform/resource/after-ecj/EqualsAndHashCodeInAnonymousClass.java
@@ -0,0 +1,41 @@
+import lombok.EqualsAndHashCode;
+public class EqualsAndHashCodeInAnonymousClass {
+ Object annonymous = new Object() {
+ @EqualsAndHashCode class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
+ if ((o == this))
+ return true;
+ if ((! (o instanceof Inner)))
+ return false;
+ final Inner other = (Inner) o;
+ if ((! other.canEqual((java.lang.Object) this)))
+ return false;
+ final java.lang.Object this$string = this.string;
+ final java.lang.Object other$string = other.string;
+ if (((this$string == null) ? (other$string != null) : (! this$string.equals(other$string))))
+ return false;
+ return true;
+ }
+ protected @java.lang.SuppressWarnings("all") boolean canEqual(final java.lang.Object other) {
+ return (other instanceof Inner);
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final java.lang.Object $string = this.string;
+ result = ((result * PRIME) + (($string == null) ? 43 : $string.hashCode()));
+ return result;
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public EqualsAndHashCodeInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/FieldNameConstantsInAnonymousClass.java b/test/transform/resource/after-ecj/FieldNameConstantsInAnonymousClass.java
new file mode 100644
index 00000000..b04bef51
--- /dev/null
+++ b/test/transform/resource/after-ecj/FieldNameConstantsInAnonymousClass.java
@@ -0,0 +1,17 @@
+import lombok.experimental.FieldNameConstants;
+public class FieldNameConstantsInAnonymousClass {
+ Object annonymous = new Object() {
+ @FieldNameConstants class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public FieldNameConstantsInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/GetterInAnonymousClass.java b/test/transform/resource/after-ecj/GetterInAnonymousClass.java
new file mode 100644
index 00000000..30e6338d
--- /dev/null
+++ b/test/transform/resource/after-ecj/GetterInAnonymousClass.java
@@ -0,0 +1,20 @@
+import lombok.Getter;
+public class GetterInAnonymousClass {
+ Object annonymous = new Object() {
+ @Getter class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ public @java.lang.SuppressWarnings("all") String getString() {
+ return this.string;
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public GetterInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/GetterLazyInAnonymousClass.java b/test/transform/resource/after-ecj/GetterLazyInAnonymousClass.java
new file mode 100644
index 00000000..ab8bc599
--- /dev/null
+++ b/test/transform/resource/after-ecj/GetterLazyInAnonymousClass.java
@@ -0,0 +1,34 @@
+import lombok.Getter;
+public class GetterLazyInAnonymousClass {
+ Object annonymous = new Object() {
+ class Inner {
+ private final @Getter(lazy = true) java.util.concurrent.atomic.AtomicReference<java.lang.Object> string = new java.util.concurrent.atomic.AtomicReference<java.lang.Object>();
+ Inner() {
+ super();
+ }
+ public @java.lang.SuppressWarnings({"all", "unchecked"}) String getString() {
+ java.lang.Object value = this.string.get();
+ if ((value == null))
+ {
+ synchronized (this.string)
+ {
+ value = this.string.get();
+ if ((value == null))
+ {
+ final String actualValue = "test";
+ value = ((actualValue == null) ? this.string : actualValue);
+ this.string.set(value);
+ }
+ }
+ }
+ return (String) ((value == this.string) ? null : value);
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public GetterLazyInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/LoggerSlf4jInAnonymousClass.java b/test/transform/resource/after-ecj/LoggerSlf4jInAnonymousClass.java
new file mode 100644
index 00000000..0c78a288
--- /dev/null
+++ b/test/transform/resource/after-ecj/LoggerSlf4jInAnonymousClass.java
@@ -0,0 +1,16 @@
+import lombok.extern.slf4j.Slf4j;
+public class LoggerSlf4jInAnonymousClass {
+ Object annonymous = new Object() {
+ @Slf4j class Inner {
+ Inner() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public LoggerSlf4jInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/SetterInAnonymousClass.java b/test/transform/resource/after-ecj/SetterInAnonymousClass.java
new file mode 100644
index 00000000..fc0bf2d8
--- /dev/null
+++ b/test/transform/resource/after-ecj/SetterInAnonymousClass.java
@@ -0,0 +1,20 @@
+import lombok.Setter;
+public class SetterInAnonymousClass {
+ Object annonymous = new Object() {
+ @Setter class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ public @java.lang.SuppressWarnings("all") void setString(final String string) {
+ this.string = string;
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public SetterInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/SuperBuilderInAnonymousClass.java b/test/transform/resource/after-ecj/SuperBuilderInAnonymousClass.java
new file mode 100644
index 00000000..238f42df
--- /dev/null
+++ b/test/transform/resource/after-ecj/SuperBuilderInAnonymousClass.java
@@ -0,0 +1,23 @@
+import lombok.experimental.SuperBuilder;
+public class SuperBuilderInAnonymousClass {
+ Object annonymous = new Object() {
+ @SuperBuilder class InnerParent {
+ private String string;
+ InnerParent() {
+ super();
+ }
+ }
+ @SuperBuilder class InnerChild {
+ private String string;
+ InnerChild() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public SuperBuilderInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/SynchronizedInAnonymousClass.java b/test/transform/resource/after-ecj/SynchronizedInAnonymousClass.java
new file mode 100644
index 00000000..77013f2f
--- /dev/null
+++ b/test/transform/resource/after-ecj/SynchronizedInAnonymousClass.java
@@ -0,0 +1,23 @@
+import lombok.Synchronized;
+public class SynchronizedInAnonymousClass {
+ Object annonymous = new Object() {
+ class Inner {
+ private final java.lang.Object $lock = new java.lang.Object[0];
+ Inner() {
+ super();
+ }
+ public @Synchronized void foo() {
+ synchronized (this.$lock)
+ {
+ String foo = "bar";
+ }
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public SynchronizedInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/ToStringInAnonymousClass.java b/test/transform/resource/after-ecj/ToStringInAnonymousClass.java
new file mode 100644
index 00000000..02ad2a88
--- /dev/null
+++ b/test/transform/resource/after-ecj/ToStringInAnonymousClass.java
@@ -0,0 +1,20 @@
+import lombok.ToString;
+public class ToStringInAnonymousClass {
+ Object annonymous = new Object() {
+ @ToString class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
+ return (("Inner(string=" + this.string) + ")");
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public ToStringInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/UtilityClassInAnonymousClass.java b/test/transform/resource/after-ecj/UtilityClassInAnonymousClass.java
new file mode 100644
index 00000000..e836636d
--- /dev/null
+++ b/test/transform/resource/after-ecj/UtilityClassInAnonymousClass.java
@@ -0,0 +1,17 @@
+import lombok.experimental.UtilityClass;
+public class UtilityClassInAnonymousClass {
+ Object annonymous = new Object() {
+ @UtilityClass class Inner {
+ private String string;
+ Inner() {
+ super();
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public UtilityClassInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/ValueInAnonymousClass.java b/test/transform/resource/after-ecj/ValueInAnonymousClass.java
new file mode 100644
index 00000000..49cf8fc2
--- /dev/null
+++ b/test/transform/resource/after-ecj/ValueInAnonymousClass.java
@@ -0,0 +1,43 @@
+import lombok.Value;
+public class ValueInAnonymousClass {
+ Object annonymous = new Object() {
+ final @Value class Inner {
+ private final String string;
+ public @java.lang.SuppressWarnings("all") String getString() {
+ return this.string;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") boolean equals(final java.lang.Object o) {
+ if ((o == this))
+ return true;
+ if ((! (o instanceof Inner)))
+ return false;
+ final Inner other = (Inner) o;
+ final java.lang.Object this$string = this.getString();
+ final java.lang.Object other$string = other.getString();
+ if (((this$string == null) ? (other$string != null) : (! this$string.equals(other$string))))
+ return false;
+ return true;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") int hashCode() {
+ final int PRIME = 59;
+ int result = 1;
+ final java.lang.Object $string = this.getString();
+ result = ((result * PRIME) + (($string == null) ? 43 : $string.hashCode()));
+ return result;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
+ return (("Inner(string=" + this.getString()) + ")");
+ }
+ public @java.lang.SuppressWarnings("all") Inner(final String string) {
+ super();
+ this.string = string;
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public ValueInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/WithByInAnonymousClass.java b/test/transform/resource/after-ecj/WithByInAnonymousClass.java
new file mode 100644
index 00000000..1bc3e80c
--- /dev/null
+++ b/test/transform/resource/after-ecj/WithByInAnonymousClass.java
@@ -0,0 +1,20 @@
+import lombok.experimental.WithBy;
+public class WithByInAnonymousClass {
+ Object annonymous = new Object() {
+ @WithBy class Inner {
+ private String string;
+ private Inner(String string) {
+ super();
+ }
+ public @java.lang.SuppressWarnings("all") Inner withStringBy(final java.util.function.Function<? super String, ? extends String> transformer) {
+ return new Inner(transformer.apply(this.string));
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public WithByInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/after-ecj/WithInAnonymousClass.java b/test/transform/resource/after-ecj/WithInAnonymousClass.java
new file mode 100644
index 00000000..fef96022
--- /dev/null
+++ b/test/transform/resource/after-ecj/WithInAnonymousClass.java
@@ -0,0 +1,23 @@
+import lombok.With;
+public class WithInAnonymousClass {
+ Object annonymous = new Object() {
+ @With class Inner {
+ private String string;
+ private Inner(String string) {
+ super();
+ }
+ /**
+ * @return a clone of this object, except with this updated property (returns {@code this} if an identical value is passed).
+ */
+ public @java.lang.SuppressWarnings("all") Inner withString(final String string) {
+ return ((this.string == string) ? this : new Inner(string));
+ }
+ }
+ x() {
+ super();
+ }
+ };
+ public WithInAnonymousClass() {
+ super();
+ }
+}
diff --git a/test/transform/resource/before/AccessorsInAnonymousClass.java b/test/transform/resource/before/AccessorsInAnonymousClass.java
new file mode 100644
index 00000000..0bbab1d6
--- /dev/null
+++ b/test/transform/resource/before/AccessorsInAnonymousClass.java
@@ -0,0 +1,14 @@
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+public class AccessorsInAnonymousClass {
+ Object annonymous = new Object() {
+ @Getter
+ @Setter
+ @Accessors(fluent = true)
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/BuilderInAnonymousClass.java b/test/transform/resource/before/BuilderInAnonymousClass.java
new file mode 100644
index 00000000..8291e678
--- /dev/null
+++ b/test/transform/resource/before/BuilderInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.Builder;
+
+public class BuilderInAnonymousClass {
+ Object annonymous = new Object() {
+ @Builder
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/ConstructorsInAnonymousClass.java b/test/transform/resource/before/ConstructorsInAnonymousClass.java
new file mode 100644
index 00000000..a74a7f11
--- /dev/null
+++ b/test/transform/resource/before/ConstructorsInAnonymousClass.java
@@ -0,0 +1,18 @@
+//version 8:
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+
+public class ConstructorsInAnonymousClass {
+ Object annonymous = new Object() {
+ @AllArgsConstructor
+ @RequiredArgsConstructor
+ @NoArgsConstructor
+ class Inner {
+ private String string;
+ @NonNull
+ private String string2;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/DataInAnonymousClass.java b/test/transform/resource/before/DataInAnonymousClass.java
new file mode 100644
index 00000000..3de5ac0b
--- /dev/null
+++ b/test/transform/resource/before/DataInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.Data;
+
+public class DataInAnonymousClass {
+ Object annonymous = new Object() {
+ @Data
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/EqualsAndHashCodeInAnonymousClass.java b/test/transform/resource/before/EqualsAndHashCodeInAnonymousClass.java
new file mode 100644
index 00000000..0f0995b6
--- /dev/null
+++ b/test/transform/resource/before/EqualsAndHashCodeInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.EqualsAndHashCode;
+
+public class EqualsAndHashCodeInAnonymousClass {
+ Object annonymous = new Object() {
+ @EqualsAndHashCode
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/FieldNameConstantsInAnonymousClass.java b/test/transform/resource/before/FieldNameConstantsInAnonymousClass.java
new file mode 100644
index 00000000..86325ce5
--- /dev/null
+++ b/test/transform/resource/before/FieldNameConstantsInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.experimental.FieldNameConstants;
+
+public class FieldNameConstantsInAnonymousClass {
+ Object annonymous = new Object() {
+ @FieldNameConstants
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/GetterInAnonymousClass.java b/test/transform/resource/before/GetterInAnonymousClass.java
new file mode 100644
index 00000000..e8195021
--- /dev/null
+++ b/test/transform/resource/before/GetterInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.Getter;
+
+public class GetterInAnonymousClass {
+ Object annonymous = new Object() {
+ @Getter
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/GetterLazyInAnonymousClass.java b/test/transform/resource/before/GetterLazyInAnonymousClass.java
new file mode 100644
index 00000000..e342e636
--- /dev/null
+++ b/test/transform/resource/before/GetterLazyInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.Getter;
+
+public class GetterLazyInAnonymousClass {
+ Object annonymous = new Object() {
+ class Inner {
+ @Getter(lazy = true)
+ private final String string = "test";
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/LoggerSlf4jInAnonymousClass.java b/test/transform/resource/before/LoggerSlf4jInAnonymousClass.java
new file mode 100644
index 00000000..4839c7aa
--- /dev/null
+++ b/test/transform/resource/before/LoggerSlf4jInAnonymousClass.java
@@ -0,0 +1,9 @@
+import lombok.extern.slf4j.Slf4j;
+
+public class LoggerSlf4jInAnonymousClass {
+ Object annonymous = new Object() {
+ @Slf4j
+ class Inner {
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/SetterInAnonymousClass.java b/test/transform/resource/before/SetterInAnonymousClass.java
new file mode 100644
index 00000000..1b3c817b
--- /dev/null
+++ b/test/transform/resource/before/SetterInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.Setter;
+
+public class SetterInAnonymousClass {
+ Object annonymous = new Object() {
+ @Setter
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/SuperBuilderInAnonymousClass.java b/test/transform/resource/before/SuperBuilderInAnonymousClass.java
new file mode 100644
index 00000000..bff871aa
--- /dev/null
+++ b/test/transform/resource/before/SuperBuilderInAnonymousClass.java
@@ -0,0 +1,15 @@
+import lombok.experimental.SuperBuilder;
+
+public class SuperBuilderInAnonymousClass {
+ Object annonymous = new Object() {
+ @SuperBuilder
+ class InnerParent {
+ private String string;
+ }
+
+ @SuperBuilder
+ class InnerChild {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/SynchronizedInAnonymousClass.java b/test/transform/resource/before/SynchronizedInAnonymousClass.java
new file mode 100644
index 00000000..11c623ce
--- /dev/null
+++ b/test/transform/resource/before/SynchronizedInAnonymousClass.java
@@ -0,0 +1,12 @@
+import lombok.Synchronized;
+
+public class SynchronizedInAnonymousClass {
+ Object annonymous = new Object() {
+ class Inner {
+ @Synchronized
+ public void foo() {
+ String foo = "bar";
+ }
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/ToStringInAnonymousClass.java b/test/transform/resource/before/ToStringInAnonymousClass.java
new file mode 100644
index 00000000..87a7a6c1
--- /dev/null
+++ b/test/transform/resource/before/ToStringInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.ToString;
+
+public class ToStringInAnonymousClass {
+ Object annonymous = new Object() {
+ @ToString
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/UtilityClassInAnonymousClass.java b/test/transform/resource/before/UtilityClassInAnonymousClass.java
new file mode 100644
index 00000000..41757502
--- /dev/null
+++ b/test/transform/resource/before/UtilityClassInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.experimental.UtilityClass;
+
+public class UtilityClassInAnonymousClass {
+ Object annonymous = new Object() {
+ @UtilityClass
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/ValueInAnonymousClass.java b/test/transform/resource/before/ValueInAnonymousClass.java
new file mode 100644
index 00000000..c0bde2ab
--- /dev/null
+++ b/test/transform/resource/before/ValueInAnonymousClass.java
@@ -0,0 +1,10 @@
+import lombok.Value;
+
+public class ValueInAnonymousClass {
+ Object annonymous = new Object() {
+ @Value
+ class Inner {
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/WithByInAnonymousClass.java b/test/transform/resource/before/WithByInAnonymousClass.java
new file mode 100644
index 00000000..afed6adf
--- /dev/null
+++ b/test/transform/resource/before/WithByInAnonymousClass.java
@@ -0,0 +1,13 @@
+//version 8:
+import lombok.experimental.WithBy;
+
+public class WithByInAnonymousClass {
+ Object annonymous = new Object() {
+ @WithBy
+ class Inner {
+ private Inner(String string) { }
+
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/before/WithInAnonymousClass.java b/test/transform/resource/before/WithInAnonymousClass.java
new file mode 100644
index 00000000..daf1bce5
--- /dev/null
+++ b/test/transform/resource/before/WithInAnonymousClass.java
@@ -0,0 +1,12 @@
+import lombok.With;
+
+public class WithInAnonymousClass {
+ Object annonymous = new Object() {
+ @With
+ class Inner {
+ private Inner(String string) { }
+
+ private String string;
+ }
+ };
+} \ No newline at end of file
diff --git a/test/transform/resource/messages-delombok/BuilderInAnonymousClass.java.messages b/test/transform/resource/messages-delombok/BuilderInAnonymousClass.java.messages
new file mode 100644
index 00000000..7607e734
--- /dev/null
+++ b/test/transform/resource/messages-delombok/BuilderInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @Builder is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-delombok/FieldNameConstantsInAnonymousClass.java.messages b/test/transform/resource/messages-delombok/FieldNameConstantsInAnonymousClass.java.messages
new file mode 100644
index 00000000..b9d4887f
--- /dev/null
+++ b/test/transform/resource/messages-delombok/FieldNameConstantsInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @FieldNameConstants is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-delombok/LoggerSlf4jInAnonymousClass.java.messages b/test/transform/resource/messages-delombok/LoggerSlf4jInAnonymousClass.java.messages
new file mode 100644
index 00000000..d4da9f99
--- /dev/null
+++ b/test/transform/resource/messages-delombok/LoggerSlf4jInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @Slf4j is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-delombok/SuperBuilderInAnonymousClass.java.messages b/test/transform/resource/messages-delombok/SuperBuilderInAnonymousClass.java.messages
new file mode 100644
index 00000000..f0cf3243
--- /dev/null
+++ b/test/transform/resource/messages-delombok/SuperBuilderInAnonymousClass.java.messages
@@ -0,0 +1,2 @@
+5 @SuperBuilder is not supported on non-static nested classes.
+10 @SuperBuilder is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-delombok/UtilityClassInAnonymousClass.java.messages b/test/transform/resource/messages-delombok/UtilityClassInAnonymousClass.java.messages
new file mode 100644
index 00000000..8884e02d
--- /dev/null
+++ b/test/transform/resource/messages-delombok/UtilityClassInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @UtilityClass automatically makes the class static, however, this class cannot be made static.
diff --git a/test/transform/resource/messages-ecj/BuilderInAnonymousClass.java.messages b/test/transform/resource/messages-ecj/BuilderInAnonymousClass.java.messages
new file mode 100644
index 00000000..7607e734
--- /dev/null
+++ b/test/transform/resource/messages-ecj/BuilderInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @Builder is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-ecj/FieldNameConstantsInAnonymousClass.java.messages b/test/transform/resource/messages-ecj/FieldNameConstantsInAnonymousClass.java.messages
new file mode 100644
index 00000000..b9d4887f
--- /dev/null
+++ b/test/transform/resource/messages-ecj/FieldNameConstantsInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @FieldNameConstants is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-ecj/LoggerSlf4jInAnonymousClass.java.messages b/test/transform/resource/messages-ecj/LoggerSlf4jInAnonymousClass.java.messages
new file mode 100644
index 00000000..d4da9f99
--- /dev/null
+++ b/test/transform/resource/messages-ecj/LoggerSlf4jInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @Slf4j is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-ecj/SuperBuilderInAnonymousClass.java.messages b/test/transform/resource/messages-ecj/SuperBuilderInAnonymousClass.java.messages
new file mode 100644
index 00000000..f0cf3243
--- /dev/null
+++ b/test/transform/resource/messages-ecj/SuperBuilderInAnonymousClass.java.messages
@@ -0,0 +1,2 @@
+5 @SuperBuilder is not supported on non-static nested classes.
+10 @SuperBuilder is not supported on non-static nested classes.
diff --git a/test/transform/resource/messages-ecj/UtilityClassInAnonymousClass.java.messages b/test/transform/resource/messages-ecj/UtilityClassInAnonymousClass.java.messages
new file mode 100644
index 00000000..8884e02d
--- /dev/null
+++ b/test/transform/resource/messages-ecj/UtilityClassInAnonymousClass.java.messages
@@ -0,0 +1 @@
+5 @UtilityClass automatically makes the class static, however, this class cannot be made static.