aboutsummaryrefslogtreecommitdiff
path: root/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java')
-rw-r--r--src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java91
1 files changed, 85 insertions, 6 deletions
diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
index 6bfcf16e..c70e4e5c 100644
--- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
+++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
@@ -124,6 +124,7 @@ import lombok.core.handlers.HandlerUtil.FieldAccess;
import lombok.eclipse.Eclipse;
import lombok.eclipse.EclipseAST;
import lombok.eclipse.EclipseNode;
+import lombok.eclipse.Java14Bits;
import lombok.experimental.Accessors;
import lombok.experimental.Tolerate;
import lombok.permit.Permit;
@@ -332,6 +333,7 @@ public class EclipseHandlerUtil {
public static final Field TYPE_REFERENCE__ANNOTATIONS;
public static final Class<?> INTERSECTION_BINDING1, INTERSECTION_BINDING2;
public static final Field INTERSECTION_BINDING_TYPES1, INTERSECTION_BINDING_TYPES2;
+ public static final Field TYPE_DECLARATION_RECORD_COMPONENTS;
static {
STRING_LITERAL__LINE_NUMBER = getField(StringLiteral.class, "lineNumber");
ANNOTATION__MEMBER_VALUE_PAIR_NAME = getField(Annotation.class, "memberValuePairName");
@@ -340,6 +342,7 @@ public class EclipseHandlerUtil {
INTERSECTION_BINDING2 = getClass("org.eclipse.jdt.internal.compiler.lookup.IntersectionCastTypeBinding");
INTERSECTION_BINDING_TYPES1 = INTERSECTION_BINDING1 == null ? null : getField(INTERSECTION_BINDING1, "intersectingTypes");
INTERSECTION_BINDING_TYPES2 = INTERSECTION_BINDING2 == null ? null : getField(INTERSECTION_BINDING2, "intersectingTypes");
+ TYPE_DECLARATION_RECORD_COMPONENTS = getField(TypeDeclaration.class, "recordComponents");
}
public static int reflectInt(Field f, Object o) {
@@ -771,12 +774,10 @@ public class EclipseHandlerUtil {
}
public static boolean hasNonNullAnnotations(EclipseNode node) {
- AbstractVariableDeclaration avd = (AbstractVariableDeclaration) node.get();
- if (avd.annotations == null) return false;
- for (Annotation annotation : avd.annotations) {
- TypeReference typeRef = annotation.type;
- if (typeRef != null && typeRef.getTypeName() != null) {
- for (String bn : NONNULL_ANNOTATIONS) if (typeMatches(bn, node, typeRef)) return true;
+ for (EclipseNode child : node.down()) {
+ if (child.getKind() == Kind.ANNOTATION) {
+ Annotation annotation = (Annotation) child.get();
+ for (String bn : NONNULL_ANNOTATIONS) if (typeMatches(bn, node, annotation.type)) return true;
}
}
return false;
@@ -1888,6 +1889,31 @@ public class EclipseHandlerUtil {
}
/**
+ * Checks if there is a constructor generated by lombok.
+ *
+ * @param node Any node that represents the Type (TypeDeclaration) to look in, or any child node thereof.
+ */
+ public static boolean lombokConstructorExists(EclipseNode node) {
+ node = upToTypeNode(node);
+ if (node != null && node.get() instanceof TypeDeclaration) {
+ TypeDeclaration typeDecl = (TypeDeclaration)node.get();
+ if (typeDecl.methods != null) for (AbstractMethodDeclaration def : typeDecl.methods) {
+ if (def instanceof ConstructorDeclaration) {
+ if ((def.bits & (ASTNode.IsDefaultConstructor | Java14Bits.IsCanonicalConstructor)) != 0) continue;
+
+ if (isTolerate(node, def)) continue;
+
+ if (getGeneratedBy(def) != null) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
* Inserts a field into an existing type. The type must represent a {@code TypeDeclaration}.
* The field carries the &#64;{@link SuppressWarnings}("all") annotation.
*/
@@ -2635,4 +2661,57 @@ public class EclipseHandlerUtil {
setGeneratedBy(ref, source);
return ref;
}
+
+ static boolean isClass(EclipseNode typeNode) {
+ return isClassAndDoesNotHaveFlags(typeNode, ClassFileConstants.AccInterface | ClassFileConstants.AccEnum | ClassFileConstants.AccAnnotation | Java14Bits.AccRecord);
+ }
+
+ static boolean isClassOrEnum(EclipseNode typeNode) {
+ return isClassAndDoesNotHaveFlags(typeNode, ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | Java14Bits.AccRecord);
+ }
+
+ public static boolean isClassAndDoesNotHaveFlags(EclipseNode typeNode, long flags) {
+ TypeDeclaration typeDecl = null;
+ if (typeNode.get() instanceof TypeDeclaration) typeDecl = (TypeDeclaration) typeNode.get();
+ int modifiers = typeDecl == null ? 0 : typeDecl.modifiers;
+ return (modifiers & flags) == 0;
+ }
+
+ public static boolean isRecord(EclipseNode typeNode) {
+ return typeNode.getKind() == Kind.TYPE && isRecord((TypeDeclaration) typeNode.get());
+ }
+
+ public static boolean isRecord(TypeDeclaration typeDeclaration) {
+ return (typeDeclaration.modifiers & Java14Bits.AccRecord) != 0;
+ }
+
+ public static boolean isRecordField(EclipseNode fieldNode) {
+ return fieldNode.getKind() == Kind.FIELD && (((FieldDeclaration) fieldNode.get()).modifiers & Java14Bits.AccRecord) != 0;
+ }
+
+ public static AbstractVariableDeclaration[] getRecordComponents(TypeDeclaration typeDeclaration) {
+ if (!isRecord(typeDeclaration)) return null;
+ try {
+ return (AbstractVariableDeclaration[]) TYPE_DECLARATION_RECORD_COMPONENTS.get(typeDeclaration);
+ } catch (Exception e) {
+ // Ignore
+ }
+ return null;
+ }
+
+ public static Annotation[][] getRecordFieldAnnotations(TypeDeclaration typeDeclaration) {
+ if (typeDeclaration.fields == null) return null;
+ Annotation[][] annotations = new Annotation[typeDeclaration.fields.length][];
+
+ AbstractVariableDeclaration[] recordComponents = getRecordComponents(typeDeclaration);
+ if (recordComponents != null) {
+ int j = 0;
+ for (int i = 0; i < typeDeclaration.fields.length; i++) {
+ if ((typeDeclaration.fields[i].modifiers & Java14Bits.AccRecord) != 0) {
+ annotations[i] = recordComponents[j++].annotations;
+ }
+ }
+ }
+ return annotations;
+ }
}