mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-13 04:15:06 +00:00
(fixes #3202) check extends/implements for collisions (SuperBuilder)
This commit is contained in:
1 parent
1473389f39
commit
ab36d2f879
5 files changed
+114
-4
No files matched your search
@@ -51,7 +51,6 @@ import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
|
||||
import org.eclipse.jdt.internal.compiler.ast.FieldReference;
|
||||
import org.eclipse.jdt.internal.compiler.ast.IfStatement;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Initializer;
|
||||
import org.eclipse.jdt.internal.compiler.ast.MarkerAnnotation;
|
||||
import org.eclipse.jdt.internal.compiler.ast.MessageSend;
|
||||
import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
|
||||
import org.eclipse.jdt.internal.compiler.ast.NullLiteral;
|
||||
@@ -1100,14 +1099,29 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
if (td.fields != null) {
|
||||
for (FieldDeclaration field : td.fields) {
|
||||
if (field instanceof Initializer) continue;
|
||||
char[][] typeName = field.type.getTypeName();
|
||||
if (typeName.length >= 1) // Add the first token, because only that can collide.
|
||||
usedNames.add(String.valueOf(typeName[0]));
|
||||
addFirstToken(usedNames, field.type);
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Add extends and implements clauses.
|
||||
addFirstToken(usedNames, td.superclass);
|
||||
if (td.superInterfaces != null) {
|
||||
for (TypeReference typeReference : td.superInterfaces) {
|
||||
addFirstToken(usedNames, typeReference);
|
||||
}
|
||||
}
|
||||
|
||||
return usedNames;
|
||||
}
|
||||
|
||||
private void addFirstToken(java.util.Set<String> usedNames, TypeReference type) {
|
||||
if (type == null)
|
||||
return;
|
||||
// Add the first token, because only that can collide.
|
||||
char[][] typeName = type.getTypeName();
|
||||
if (typeName != null && typeName.length >= 1)
|
||||
usedNames.add(String.valueOf(typeName[0]));
|
||||
}
|
||||
|
||||
private String generateNonclashingNameFor(String classGenericName, java.util.Set<String> typeParamStrings) {
|
||||
if (!typeParamStrings.contains(classGenericName)) return classGenericName;
|
||||
|
||||
@@ -1051,9 +1051,25 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Add extends and implements clauses.
|
||||
addFirstToken(usedNames, Javac.getExtendsClause(td));
|
||||
for (JCExpression impl : td.getImplementsClause()) {
|
||||
addFirstToken(usedNames, impl);
|
||||
}
|
||||
|
||||
return usedNames;
|
||||
}
|
||||
|
||||
private void addFirstToken(java.util.Set<String> usedNames, JCTree type) {
|
||||
if (type == null)
|
||||
return;
|
||||
while (type instanceof JCFieldAccess && ((JCFieldAccess)type).selected != null) {
|
||||
// Add the first token, because only that can collide.
|
||||
type = ((JCFieldAccess)type).selected;
|
||||
}
|
||||
usedNames.add(type.toString());
|
||||
}
|
||||
|
||||
private String generateNonclashingNameFor(String classGenericName, java.util.HashSet<String> typeParamStrings) {
|
||||
if (!typeParamStrings.contains(classGenericName)) return classGenericName;
|
||||
int counter = 2;
|
||||
|
||||
@@ -124,4 +124,46 @@ public class SuperBuilderNameClashes {
|
||||
return new SuperBuilderNameClashes.C.CBuilderImpl();
|
||||
}
|
||||
}
|
||||
interface B2 {
|
||||
}
|
||||
public static class ExtendsClauseCollision extends B implements B2 {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static abstract class ExtendsClauseCollisionBuilder<C extends SuperBuilderNameClashes.ExtendsClauseCollision, B3 extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<C, B3>> extends B.BBuilder<C, B3> {
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected abstract B3 self();
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public abstract C build();
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public java.lang.String toString() {
|
||||
return "SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder(super=" + super.toString() + ")";
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private static final class ExtendsClauseCollisionBuilderImpl extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<SuperBuilderNameClashes.ExtendsClauseCollision, SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
private ExtendsClauseCollisionBuilderImpl() {
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl self() {
|
||||
return this;
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public SuperBuilderNameClashes.ExtendsClauseCollision build() {
|
||||
return new SuperBuilderNameClashes.ExtendsClauseCollision(this);
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
protected ExtendsClauseCollision(final SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> b) {
|
||||
super(b);
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
public static SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> builder() {
|
||||
return new SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -101,6 +101,37 @@ public class SuperBuilderNameClashes {
|
||||
return new SuperBuilderNameClashes.C.CBuilderImpl();
|
||||
}
|
||||
}
|
||||
interface B2 {
|
||||
}
|
||||
public static @lombok.experimental.SuperBuilder class ExtendsClauseCollision extends B implements B2 {
|
||||
public static abstract @java.lang.SuppressWarnings("all") class ExtendsClauseCollisionBuilder<C extends SuperBuilderNameClashes.ExtendsClauseCollision, B3 extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<C, B3>> extends B.BBuilder<C, B3> {
|
||||
public ExtendsClauseCollisionBuilder() {
|
||||
super();
|
||||
}
|
||||
protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B3 self();
|
||||
public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build();
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
|
||||
return (("SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder(super=" + super.toString()) + ")");
|
||||
}
|
||||
}
|
||||
private static final @java.lang.SuppressWarnings("all") class ExtendsClauseCollisionBuilderImpl extends SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<SuperBuilderNameClashes.ExtendsClauseCollision, SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl> {
|
||||
private ExtendsClauseCollisionBuilderImpl() {
|
||||
super();
|
||||
}
|
||||
protected @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl self() {
|
||||
return this;
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderNameClashes.ExtendsClauseCollision build() {
|
||||
return new SuperBuilderNameClashes.ExtendsClauseCollision(this);
|
||||
}
|
||||
}
|
||||
protected @java.lang.SuppressWarnings("all") ExtendsClauseCollision(final SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> b) {
|
||||
super(b);
|
||||
}
|
||||
public static @java.lang.SuppressWarnings("all") SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilder<?, ?> builder() {
|
||||
return new SuperBuilderNameClashes.ExtendsClauseCollision.ExtendsClauseCollisionBuilderImpl();
|
||||
}
|
||||
}
|
||||
public SuperBuilderNameClashes() {
|
||||
super();
|
||||
}
|
||||
|
||||
@@ -14,4 +14,11 @@ public class SuperBuilderNameClashes {
|
||||
public static class C {
|
||||
C2 c2;
|
||||
}
|
||||
|
||||
interface B2 {
|
||||
}
|
||||
|
||||
@lombok.experimental.SuperBuilder
|
||||
public static class ExtendsClauseCollision extends B implements B2 {
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user