[fixes #3364] Generate JCTree clones to prevent duplicate nodes

This commit is contained in:
Rawi01 authored and Reinier Zwitserloot committed 2023-03-22 12:33:59 +01:00
1 parent 3b968fe57c
commit 8c0081a806
12 files changed
+125 -83

No files matched your search

@@ -796,10 +796,11 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
List<JCAnnotation> annsOnMethod = job.checkerFramework.generateSideEffectFree() ? List.of(maker.Annotation(genTypeRef(job.builderType, CheckerFrameworkVersion.NAME__SIDE_EFFECT_FREE), List.<JCExpression>nil())) : List.<JCAnnotation>nil();
JCVariableDecl recv = generateReceiver(job);
JCMethodDecl methodDef;
JCExpression returnTypeCopy = cloneType(maker, returnType, job.sourceNode);
if (recv != null && maker.hasMethodDefWithRecvParam()) {
methodDef = maker.MethodDefWithRecvParam(maker.Modifiers(toJavacModifier(job.accessInners), annsOnMethod), job.toName(job.buildMethodName), returnType, List.<JCTypeParameter>nil(), recv, List.<JCVariableDecl>nil(), thrownExceptions, body, null);
methodDef = maker.MethodDefWithRecvParam(maker.Modifiers(toJavacModifier(job.accessInners), annsOnMethod), job.toName(job.buildMethodName), returnTypeCopy, List.<JCTypeParameter>nil(), recv, List.<JCVariableDecl>nil(), thrownExceptions, body, null);
} else {
methodDef = maker.MethodDef(maker.Modifiers(toJavacModifier(job.accessInners), annsOnMethod), job.toName(job.buildMethodName), returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);
methodDef = maker.MethodDef(maker.Modifiers(toJavacModifier(job.accessInners), annsOnMethod), job.toName(job.buildMethodName), returnTypeCopy, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);
}
if (staticName == null) createRelevantNonNullAnnotation(job.builderType, methodDef);
return methodDef;
@@ -440,7 +440,7 @@ public class HandleConstructor {
if (!type.typarams.isEmpty()) {
for (JCTypeParameter param : type.typarams) {
typeParams.append(maker.TypeParameter(param.name, param.bounds));
typeParams.append(maker.TypeParameter(param.name, cloneTypes(maker, param.bounds, source)));
}
}
List<JCAnnotation> annsOnReturnType = List.nil();
@@ -191,7 +191,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
injectMethod(typeNode, equalsMethod);
if (needsCanEqual && canEqualExists == MemberExistsResult.NOT_EXISTS) {
JCMethodDecl canEqualMethod = createCanEqual(typeNode, source, onParam);
JCMethodDecl canEqualMethod = createCanEqual(typeNode, source, copyAnnotations(onParam));
injectMethod(typeNode, canEqualMethod);
}
@@ -240,10 +240,10 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
/* if (this.$hashCodeCache != 0) return this.$hashCodeCache; */ {
if (cacheHashCode) {
JCIdent receiver = maker.Ident(typeNode.toName("this"));
JCFieldAccess cacheHashCodeFieldAccess = maker.Select(receiver, typeNode.toName(HASH_CODE_CACHE_NAME));
JCExpression cacheNotZero = maker.Binary(CTC_NOT_EQUAL, cacheHashCodeFieldAccess, maker.Literal(CTC_INT, 0));
statements.append(maker.If(cacheNotZero, maker.Return(cacheHashCodeFieldAccess), null));
JCFieldAccess hashCodeCacheFieldAccess = createHashCodeCacheFieldAccess(typeNode, maker);
JCExpression cacheNotZero = maker.Binary(CTC_NOT_EQUAL, hashCodeCacheFieldAccess, maker.Literal(CTC_INT, 0));
hashCodeCacheFieldAccess = createHashCodeCacheFieldAccess(typeNode, maker);
statements.append(maker.If(cacheNotZero, maker.Return(hashCodeCacheFieldAccess), null));
}
}
@@ -345,7 +345,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
statements.append(maker.If(maker.Binary(CTC_EQUAL, maker.Ident(resultName), maker.Literal(CTC_INT, 0)),
maker.Exec(maker.Assign(maker.Ident(resultName), genJavaLangTypeRef(typeNode, "Integer", "MIN_VALUE"))), null));
JCFieldAccess cacheHashCodeFieldAccess = maker.Select(maker.Ident(typeNode.toName("this")), typeNode.toName(HASH_CODE_CACHE_NAME));
JCFieldAccess cacheHashCodeFieldAccess = createHashCodeCacheFieldAccess(typeNode, maker);
statements.append(maker.Exec(maker.Assign(cacheHashCodeFieldAccess, maker.Ident(resultName))));
}
}
@@ -359,6 +359,12 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null), source);
}
private JCFieldAccess createHashCodeCacheFieldAccess(JavacNode typeNode, JavacTreeMaker maker) {
JCIdent receiver = maker.Ident(typeNode.toName("this"));
JCFieldAccess cacheHashCodeFieldAccess = maker.Select(receiver, typeNode.toName(HASH_CODE_CACHE_NAME));
return cacheHashCodeFieldAccess;
}
public JCExpressionStatement createResultCalculation(JavacNode typeNode, JCExpression expr) {
/* result = result * PRIME + expr; */
JavacTreeMaker maker = typeNode.getTreeMaker();
@@ -222,7 +222,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
JCVariableDecl fieldNode = (JCVariableDecl) field.get();
// Remember the type; lazy will change it
JCExpression methodType = cloneType(treeMaker, copyType(treeMaker, fieldNode), source);
JCExpression methodType = copyType(treeMaker, fieldNode, source);
AnnotationValues<Accessors> accessors = JavacHandlerUtil.getAccessorsForField(field);
// Generate the methodName; lazy will change the field type
Name methodName = field.toName(toGetterName(field, accessors));
@@ -359,7 +359,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
ListBuffer<JCStatement> statements = new ListBuffer<JCStatement>();
JCVariableDecl field = (JCVariableDecl) fieldNode.get();
JCExpression copyOfRawFieldType = copyType(maker, field);
JCExpression copyOfRawFieldType = copyType(maker, field, source);
JCExpression copyOfBoxedFieldType = null;
field.type = null;
boolean isPrimitive = false;
@@ -371,7 +371,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
copyOfBoxedFieldType = genJavaLangTypeRef(fieldNode, boxed);
}
}
if (copyOfBoxedFieldType == null) copyOfBoxedFieldType = copyType(maker, field);
if (copyOfBoxedFieldType == null) copyOfBoxedFieldType = copyType(maker, field, source);
Name valueName = fieldNode.toName("value");
Name actualValueName = fieldNode.toName("actualValue");
@@ -446,7 +446,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
/* private final java.util.concurrent.atomic.AtomicReference<Object> fieldName = new java.util.concurrent.atomic.AtomicReference<Object>(); */ {
field.vartype = recursiveSetGeneratedBy(
maker.TypeApply(chainDotsString(fieldNode, AR), List.<JCExpression>of(genJavaLangTypeRef(fieldNode, "Object"))), source);
field.init = recursiveSetGeneratedBy(maker.NewClass(null, NIL_EXPRESSION, copyType(maker, field), NIL_EXPRESSION, null), source);
field.init = recursiveSetGeneratedBy(maker.NewClass(null, NIL_EXPRESSION, copyType(maker, field, source), NIL_EXPRESSION, null), source);
}
return statements.toList();
@@ -462,7 +462,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
return maker.Exec(maker.Apply(NIL_EXPRESSION, maker.Select(receiver, source.toName("set")), List.<JCExpression>of(value)));
}
public JCExpression copyType(JavacTreeMaker treeMaker, JCVariableDecl fieldNode) {
return fieldNode.type != null ? treeMaker.Type(fieldNode.type) : fieldNode.vartype;
public JCExpression copyType(JavacTreeMaker treeMaker, JCVariableDecl fieldNode, JavacNode source) {
return fieldNode.type != null ? treeMaker.Type(fieldNode.type) : cloneType(treeMaker, fieldNode.vartype, source);
}
}
@@ -43,6 +43,7 @@ import com.sun.tools.javac.tree.JCTree.JCAnnotation;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
import com.sun.tools.javac.tree.JCTree.JCLiteral;
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.util.List;
@@ -148,14 +149,18 @@ public class HandleLog {
LogFactoryParameter parameter = parameters.get(i);
switch (parameter) {
case TYPE:
expressions[i] = loggingType;
expressions[i] = cloneType(maker, loggingType, typeNode);
break;
case NAME:
JCExpression method = maker.Select(loggingType, typeNode.toName("getName"));
expressions[i] = maker.Apply(List.<JCExpression>nil(), method, List.<JCExpression>nil());
break;
case TOPIC:
expressions[i] = (JCExpression) loggerTopic.clone();
if (loggerTopic instanceof JCLiteral) {
expressions[i] = maker.Literal(((JCLiteral) loggerTopic).value);
} else {
expressions[i] = cloneType(maker, loggerTopic, typeNode);
}
break;
case NULL:
expressions[i] = maker.Literal(CTC_BOT, null);
@@ -260,7 +260,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
Name superclassName = ((JCFieldAccess) extendsClause).getIdentifier();
String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);
String superclassBuilderClassName = job.replaceBuilderClassName(superclassName.toString(), builderClassNameTemplate);
superclassBuilderClass = parent.getTreeMaker().Select((JCFieldAccess) extendsClause, parent.toName(superclassBuilderClassName));
superclassBuilderClass = parent.getTreeMaker().Select(cloneType(maker, (JCFieldAccess) extendsClause, annotationNode), parent.toName(superclassBuilderClassName));
} else if (extendsClause != null) {
String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);
String superclassBuilderClassName = job.replaceBuilderClassName(extendsClause.toString(), builderClassNameTemplate);
@@ -607,6 +607,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
// Now add the <?, ?>.
JCWildcard wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
typeParameterNames.append(wildcard);
wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
typeParameterNames.append(wildcard);
// And return type annotations.
List<JCAnnotation> annsOnParamType = List.nil();
@@ -644,6 +645,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
// Now add the <?, ?>.
JCWildcard wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
typeParameterNames.append(wildcard);
wildcard = maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
typeParameterNames.append(wildcard);
JCTypeApply returnType = maker.TypeApply(namePlusTypeParamsToTypeReference(maker, job.parentType, job.toName(job.builderAbstractClassName), false, List.<JCTypeParameter>nil()), typeParameterNames.toList());
@@ -1695,29 +1695,8 @@ public class JavacHandlerUtil {
* Searches the given field node for annotations and returns each one that is 'copyable' (either via configuration or from the base list).
*/
public static List<JCAnnotation> findCopyableAnnotations(JavacNode node) {
JCAnnotation anno = null;
String annoName = null;
for (JavacNode child : node.down()) {
if (child.getKind() == Kind.ANNOTATION) {
if (anno != null) {
annoName = "";
break;
}
JCAnnotation annotation = (JCAnnotation) child.get();
annoName = annotation.annotationType.toString();
anno = annotation;
}
}
if (annoName == null) return List.nil();
java.util.List<TypeName> configuredCopyable = node.getAst().readConfiguration(ConfigurationKeys.COPYABLE_ANNOTATIONS);
if (!annoName.isEmpty()) {
for (TypeName cn : configuredCopyable) if (cn != null && typeMatches(cn.toString(), node, annoName)) return List.of(anno);
for (String bn : BASE_COPYABLE_ANNOTATIONS) if (typeMatches(bn, node, annoName)) return List.of(anno);
}
ListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();
for (JavacNode child : node.down()) {
if (child.getKind() == Kind.ANNOTATION) {
@@ -1735,7 +1714,7 @@ public class JavacHandlerUtil {
}
}
}
return result.toList();
return copyAnnotations(result.toList());
}
/**
@@ -1756,26 +1735,6 @@ public class JavacHandlerUtil {
* Searches the given field node for annotations that are in the given list, and returns those.
*/
private static List<JCAnnotation> findAnnotationsInList(JavacNode node, java.util.List<String> annotationsToFind) {
JCAnnotation anno = null;
String annoName = null;
for (JavacNode child : node.down()) {
if (child.getKind() == Kind.ANNOTATION) {
if (anno != null) {
annoName = "";
break;
}
JCAnnotation annotation = (JCAnnotation) child.get();
annoName = annotation.annotationType.toString();
anno = annotation;
}
}
if (annoName == null) return List.nil();
if (!annoName.isEmpty()) {
for (String bn : annotationsToFind) if (typeMatches(bn, node, annoName)) return List.of(anno);
}
ListBuffer<JCAnnotation> result = new ListBuffer<JCAnnotation>();
for (JavacNode child : node.down()) {
if (child.getKind() == Kind.ANNOTATION) {
@@ -1788,7 +1747,7 @@ public class JavacHandlerUtil {
}
}
}
return result.toList();
return copyAnnotations(result.toList());
}
/**
@@ -29,9 +29,12 @@ import java.io.PrintStream;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
@@ -56,6 +59,7 @@ import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.tree.JCTree.JCIdent;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCModifiers;
import com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.tree.JCTree.TypeBoundKind;
import com.sun.tools.javac.tree.TreeScanner;
@@ -81,6 +85,7 @@ public class RunTestsViaDelombok extends AbstractRunTests {
if (checkPositions) delombok.addAdditionalAnnotationProcessor(new ValidatePositionProcessor(version));
delombok.addAdditionalAnnotationProcessor(new ValidateTypesProcessor());
delombok.addAdditionalAnnotationProcessor(new ValidateNoDuplicateTreeNodeProcessor());
delombok.addFile(file.getAbsoluteFile().getParentFile(), file.getName());
delombok.setSourcepath(file.getAbsoluteFile().getParent());
@@ -232,6 +237,68 @@ public class RunTestsViaDelombok extends AbstractRunTests {
}
}
public static class ValidateNoDuplicateTreeNodeProcessor extends TreeProcessor {
private String craftFailMsg(Collection<JCTree> astContext) {
StringBuilder msg = new StringBuilder();
for (JCTree t : astContext) {
msg.append("\n ").append(t.getClass().getSimpleName());
String asStr = t.toString();
if (asStr.length() < 80) msg.append(": ").append(asStr);
else if (t instanceof JCClassDecl) msg.append(": ").append(((JCClassDecl) t).name);
else if (t instanceof JCMethodDecl) msg.append(": ").append(((JCMethodDecl) t).name);
else if (t instanceof JCVariableDecl) msg.append(": ").append(((JCVariableDecl) t).name);
}
return msg.append("\n-------").toString();
}
@Override
void processCompilationUnit(JCCompilationUnit unit) {
final Deque<JCTree> parents = new ArrayDeque<JCTree>();
parents.add(unit);
final Map<JCTree, List<JCTree>> knownTreeNode = new IdentityHashMap<JCTree, List<JCTree>>();
unit.accept(new TreeScanner() {
private JCTree parent;
@Override
public void scan(JCTree tree) {
parent = parents.peek();
if (tree == null) return;
if (tree instanceof JCPrimitiveTypeTree) return;
// javac generates duplicates for record members
if (tree instanceof JCVariableDecl && (((JCVariableDecl) tree).mods.flags & Javac.GENERATED_MEMBER) != 0) return;
List<JCTree> knownNodeContext = knownTreeNode.put(tree, new ArrayList<JCTree>(parents));
if (knownNodeContext != null) {
// javac generates two JCVariableDecl elements for 'int a, b;'
if (parent instanceof JCVariableDecl) {
if (tree instanceof JCModifiers) return;
if (tree instanceof JCIdent) return;
}
fail("Node " + tree + " found twice:" + craftFailMsg(knownNodeContext) + craftFailMsg(parents));
}
parents.push(tree);
super.scan(tree);
parents.pop();
}
/**
* We always generate shallow copies for annotations
*/
@Override
public void visitAnnotation(JCAnnotation tree) {
return;
}
});
}
}
public static abstract class TreeProcessor extends AbstractProcessor {
private Trees trees;
@Override public synchronized void init(ProcessingEnvironment processingEnv) {
@@ -1,8 +1,8 @@
import java.util.List;
class BuilderCustomName<T> {
class SuperBuilderCustomName<T> {
private final int field;
@java.lang.SuppressWarnings("all")
public static abstract class SimpleTestBuilder<T, C extends BuilderCustomName<T>, B extends BuilderCustomName.SimpleTestBuilder<T, C, B>> {
public static abstract class SimpleTestBuilder<T, C extends SuperBuilderCustomName<T>, B extends SuperBuilderCustomName.SimpleTestBuilder<T, C, B>> {
@java.lang.SuppressWarnings("all")
private int field;
/**
@@ -20,31 +20,31 @@ class BuilderCustomName<T> {
@java.lang.Override
@java.lang.SuppressWarnings("all")
public java.lang.String toString() {
return "BuilderCustomName.SimpleTestBuilder(field=" + this.field + ")";
return "SuperBuilderCustomName.SimpleTestBuilder(field=" + this.field + ")";
}
}
@java.lang.SuppressWarnings("all")
private static final class SimpleTestBuilderImpl<T> extends BuilderCustomName.SimpleTestBuilder<T, BuilderCustomName<T>, BuilderCustomName.SimpleTestBuilderImpl<T>> {
private static final class SimpleTestBuilderImpl<T> extends SuperBuilderCustomName.SimpleTestBuilder<T, SuperBuilderCustomName<T>, SuperBuilderCustomName.SimpleTestBuilderImpl<T>> {
@java.lang.SuppressWarnings("all")
private SimpleTestBuilderImpl() {
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
protected BuilderCustomName.SimpleTestBuilderImpl<T> self() {
protected SuperBuilderCustomName.SimpleTestBuilderImpl<T> self() {
return this;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public BuilderCustomName<T> build() {
return new BuilderCustomName<T>(this);
public SuperBuilderCustomName<T> build() {
return new SuperBuilderCustomName<T>(this);
}
}
@java.lang.SuppressWarnings("all")
protected BuilderCustomName(final BuilderCustomName.SimpleTestBuilder<T, ?, ?> b) {
protected SuperBuilderCustomName(final SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> b) {
this.field = b.field;
}
@java.lang.SuppressWarnings("all")
public static <T> BuilderCustomName.SimpleTestBuilder<T, ?, ?> builder() {
return new BuilderCustomName.SimpleTestBuilderImpl<T>();
public static <T> SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> builder() {
return new SuperBuilderCustomName.SimpleTestBuilderImpl<T>();
}
}
@@ -1,6 +1,6 @@
import java.util.List;
@lombok.experimental.SuperBuilder class BuilderCustomName<T> {
public static abstract @java.lang.SuppressWarnings("all") class SimpleTestBuilder<T, C extends BuilderCustomName<T>, B extends BuilderCustomName.SimpleTestBuilder<T, C, B>> {
@lombok.experimental.SuperBuilder class SuperBuilderCustomName<T> {
public static abstract @java.lang.SuppressWarnings("all") class SimpleTestBuilder<T, C extends SuperBuilderCustomName<T>, B extends SuperBuilderCustomName.SimpleTestBuilder<T, C, B>> {
private @java.lang.SuppressWarnings("all") int field;
public SimpleTestBuilder() {
super();
@@ -15,26 +15,26 @@ import java.util.List;
protected abstract @java.lang.SuppressWarnings("all") B self();
public abstract @java.lang.SuppressWarnings("all") C build();
public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
return (("BuilderCustomName.SimpleTestBuilder(field=" + this.field) + ")");
return (("SuperBuilderCustomName.SimpleTestBuilder(field=" + this.field) + ")");
}
}
private static final @java.lang.SuppressWarnings("all") class SimpleTestBuilderImpl<T> extends BuilderCustomName.SimpleTestBuilder<T, BuilderCustomName<T>, BuilderCustomName.SimpleTestBuilderImpl<T>> {
private static final @java.lang.SuppressWarnings("all") class SimpleTestBuilderImpl<T> extends SuperBuilderCustomName.SimpleTestBuilder<T, SuperBuilderCustomName<T>, SuperBuilderCustomName.SimpleTestBuilderImpl<T>> {
private SimpleTestBuilderImpl() {
super();
}
protected @java.lang.Override @java.lang.SuppressWarnings("all") BuilderCustomName.SimpleTestBuilderImpl<T> self() {
protected @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderCustomName.SimpleTestBuilderImpl<T> self() {
return this;
}
public @java.lang.Override @java.lang.SuppressWarnings("all") BuilderCustomName<T> build() {
return new BuilderCustomName<T>(this);
public @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderCustomName<T> build() {
return new SuperBuilderCustomName<T>(this);
}
}
private final int field;
protected @java.lang.SuppressWarnings("all") BuilderCustomName(final BuilderCustomName.SimpleTestBuilder<T, ?, ?> b) {
protected @java.lang.SuppressWarnings("all") SuperBuilderCustomName(final SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> b) {
super();
this.field = b.field;
}
public static @java.lang.SuppressWarnings("all") <T>BuilderCustomName.SimpleTestBuilder<T, ?, ?> builder() {
return new BuilderCustomName.SimpleTestBuilderImpl<T>();
public static @java.lang.SuppressWarnings("all") <T>SuperBuilderCustomName.SimpleTestBuilder<T, ?, ?> builder() {
return new SuperBuilderCustomName.SimpleTestBuilderImpl<T>();
}
}
@@ -2,6 +2,6 @@
import java.util.List;
@lombok.experimental.SuperBuilder
class BuilderCustomName<T> {
class SuperBuilderCustomName<T> {
private final int field;
}
@@ -1 +1,3 @@
5 @NonNull is meaningless on a primitive.
8 @NonNull is meaningless on a primitive.
4 @NonNull is meaningless on a primitive.
6 @NonNull is meaningless on a primitive.