From 4bbc653394c9bce322bc0ea8c3e609efb9168d29 Mon Sep 17 00:00:00 2001 From: Burak KALAYCI Date: Fri, 21 Aug 2026 10:35:51 +0300 Subject: [PATCH 1/3] [#4070] Fix SuperBuilder for non-ASCII superclass simple names javac pretty-prints JCIdent via toString() using unicode escapes. Use the identifier Name so Hangul (and other non-ASCII) superclass simple names generate a valid builder type reference. --- AUTHORS | 1 + .../javac/handlers/HandleSuperBuilder.java | 7 + .../after-delombok/SuperBuilderNonAscii.java | 130 ++++++++++++++++++ .../after-ecj/SuperBuilderNonAscii.java | 86 ++++++++++++ .../resource/before/SuperBuilderNonAscii.java | 15 ++ 5 files changed, 239 insertions(+) create mode 100644 test/transform/resource/after-delombok/SuperBuilderNonAscii.java create mode 100644 test/transform/resource/after-ecj/SuperBuilderNonAscii.java create mode 100644 test/transform/resource/before/SuperBuilderNonAscii.java diff --git a/AUTHORS b/AUTHORS index 38e032c6..3d89b616 100755 --- a/AUTHORS +++ b/AUTHORS @@ -6,6 +6,7 @@ Amine Touzani Andre Brait Anshuman Mishra Bulgakov Alexander +Burak KALAYCI Caleb Brinkman Christian Nüssgens Christian Schlichtherle diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index 0b1fe686..6ff096fd 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -261,6 +261,13 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null); String superclassBuilderClassName = job.replaceBuilderClassName(superclassName.toString(), builderClassNameTemplate); superclassBuilderClass = parent.getTreeMaker().Select(cloneType(maker, (JCFieldAccess) extendsClause, annotationNode), parent.toName(superclassBuilderClassName)); + } else if (extendsClause instanceof JCIdent) { + // Use the identifier Name, not Tree.toString(): javac pretty-prints non-ASCII + // names as \\uXXXX escapes, which then become the builder type's simple name. + Name superclassName = ((JCIdent) extendsClause).getName(); + String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null); + String superclassBuilderClassName = job.replaceBuilderClassName(superclassName.toString(), builderClassNameTemplate); + superclassBuilderClass = chainDots(parent, superclassName.toString(), superclassBuilderClassName); } else if (extendsClause != null) { String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null); String superclassBuilderClassName = job.replaceBuilderClassName(extendsClause.toString(), builderClassNameTemplate); diff --git a/test/transform/resource/after-delombok/SuperBuilderNonAscii.java b/test/transform/resource/after-delombok/SuperBuilderNonAscii.java new file mode 100644 index 00000000..9c127552 --- /dev/null +++ b/test/transform/resource/after-delombok/SuperBuilderNonAscii.java @@ -0,0 +1,130 @@ +public class SuperBuilderNonAscii { + public static class 부모 { + Long a; + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static abstract class 부모Builder> { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private Long a; + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + @lombok.Generated + public B a(final Long a) { + this.a = a; + return self(); + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected abstract B self(); + @java.lang.SuppressWarnings("all") + @lombok.Generated + public abstract C build(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public java.lang.String toString() { + return "SuperBuilderNonAscii.부모.부모Builder(a=" + this.a + ")"; + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + private static final class 부모BuilderImpl extends SuperBuilderNonAscii.부모.부모Builder { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private 부모BuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected SuperBuilderNonAscii.부모.부모BuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public SuperBuilderNonAscii.부모 build() { + return new SuperBuilderNonAscii.부모(this); + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected 부모(final SuperBuilderNonAscii.부모.부모Builder b) { + this.a = b.a; + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static SuperBuilderNonAscii.부모.부모Builder builder() { + return new SuperBuilderNonAscii.부모.부모BuilderImpl(); + } + } + public static class 자식 extends 부모 { + String b; + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static abstract class 자식Builder> extends 부모.부모Builder { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private String b; + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + @lombok.Generated + public B b(final String b) { + this.b = b; + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected abstract B self(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public abstract C build(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public java.lang.String toString() { + return "SuperBuilderNonAscii.자식.자식Builder(super=" + super.toString() + ", b=" + this.b + ")"; + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + private static final class 자식BuilderImpl extends SuperBuilderNonAscii.자식.자식Builder { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private 자식BuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected SuperBuilderNonAscii.자식.자식BuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public SuperBuilderNonAscii.자식 build() { + return new SuperBuilderNonAscii.자식(this); + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected 자식(final SuperBuilderNonAscii.자식.자식Builder b) { + super(b); + this.b = b.b; + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static SuperBuilderNonAscii.자식.자식Builder builder() { + return new SuperBuilderNonAscii.자식.자식BuilderImpl(); + } + } + public static void test() { + 자식 x = 자식.builder().b("").a(5L).build(); + } +} diff --git a/test/transform/resource/after-ecj/SuperBuilderNonAscii.java b/test/transform/resource/after-ecj/SuperBuilderNonAscii.java new file mode 100644 index 00000000..7d62bd7d --- /dev/null +++ b/test/transform/resource/after-ecj/SuperBuilderNonAscii.java @@ -0,0 +1,86 @@ +public class SuperBuilderNonAscii { + public static @lombok.SuperBuilder class 부모 { + public static abstract @java.lang.SuppressWarnings("all") @lombok.Generated class 부모Builder> { + private @java.lang.SuppressWarnings("all") @lombok.Generated Long a; + public 부모Builder() { + super(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") @lombok.Generated B a(final Long a) { + this.a = a; + return self(); + } + protected abstract @java.lang.SuppressWarnings("all") @lombok.Generated B self(); + public abstract @java.lang.SuppressWarnings("all") @lombok.Generated C build(); + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() { + return (("SuperBuilderNonAscii.부모.부모Builder(a=" + this.a) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") @lombok.Generated class 부모BuilderImpl extends SuperBuilderNonAscii.부모.부모Builder { + private 부모BuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAscii.부모.부모BuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAscii.부모 build() { + return new SuperBuilderNonAscii.부모(this); + } + } + Long a; + protected @java.lang.SuppressWarnings("all") @lombok.Generated 부모(final SuperBuilderNonAscii.부모.부모Builder b) { + super(); + this.a = b.a; + } + public static @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAscii.부모.부모Builder builder() { + return new SuperBuilderNonAscii.부모.부모BuilderImpl(); + } + } + public static @lombok.SuperBuilder class 자식 extends 부모 { + public static abstract @java.lang.SuppressWarnings("all") @lombok.Generated class 자식Builder> extends 부모.부모Builder { + private @java.lang.SuppressWarnings("all") @lombok.Generated String b; + public 자식Builder() { + super(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") @lombok.Generated B b(final String b) { + this.b = b; + return self(); + } + protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated B self(); + public abstract @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated C build(); + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() { + return (((("SuperBuilderNonAscii.자식.자식Builder(super=" + super.toString()) + ", b=") + this.b) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") @lombok.Generated class 자식BuilderImpl extends SuperBuilderNonAscii.자식.자식Builder { + private 자식BuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAscii.자식.자식BuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAscii.자식 build() { + return new SuperBuilderNonAscii.자식(this); + } + } + String b; + protected @java.lang.SuppressWarnings("all") @lombok.Generated 자식(final SuperBuilderNonAscii.자식.자식Builder b) { + super(b); + this.b = b.b; + } + public static @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAscii.자식.자식Builder builder() { + return new SuperBuilderNonAscii.자식.자식BuilderImpl(); + } + } + public SuperBuilderNonAscii() { + super(); + } + public static void test() { + 자식 x = 자식.builder().b("").a(5L).build(); + } +} diff --git a/test/transform/resource/before/SuperBuilderNonAscii.java b/test/transform/resource/before/SuperBuilderNonAscii.java new file mode 100644 index 00000000..d5de97e8 --- /dev/null +++ b/test/transform/resource/before/SuperBuilderNonAscii.java @@ -0,0 +1,15 @@ +public class SuperBuilderNonAscii { + @lombok.SuperBuilder + public static class 부모 { + Long a; + } + + @lombok.SuperBuilder + public static class 자식 extends 부모 { + String b; + } + + public static void test() { + 자식 x = 자식.builder().b("").a(5L).build(); + } +} From 2e5bff41ea71f4ed2d144e5c52152b025064ab55 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 8 Sep 2026 23:42:01 +0200 Subject: [PATCH 2/3] [#4070] Add tests for complex superclass names for `@SuperBuilder` as well. --- .../eclipse/handlers/HandleConstructor.java | 2 +- .../javac/handlers/HandleSuperBuilder.java | 3 +- .../SuperBuilderNonAsciiComplex.java | 144 ++++++++++++++++++ .../SuperBuilderNonAsciiComplex.java | 96 ++++++++++++ .../before/SuperBuilderNonAsciiComplex.java | 16 ++ 5 files changed, 259 insertions(+), 2 deletions(-) create mode 100644 test/transform/resource/after-delombok/SuperBuilderNonAsciiComplex.java create mode 100644 test/transform/resource/after-ecj/SuperBuilderNonAsciiComplex.java create mode 100644 test/transform/resource/before/SuperBuilderNonAsciiComplex.java diff --git a/src/core/lombok/eclipse/handlers/HandleConstructor.java b/src/core/lombok/eclipse/handlers/HandleConstructor.java index 9229fbe7..5ad15315 100755 --- a/src/core/lombok/eclipse/handlers/HandleConstructor.java +++ b/src/core/lombok/eclipse/handlers/HandleConstructor.java @@ -252,7 +252,7 @@ public class HandleConstructor { ASTNode source = sourceNode.get(); boolean staticConstrRequired = staticName != null && !staticName.equals(""); - + if (skipIfConstructorExists != SkipIfConstructorExists.NO) { for (EclipseNode child : typeNode.down()) { if (child.getKind() == Kind.ANNOTATION) { diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index 6ff096fd..c971a10f 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013-2025 The Project Lombok Authors. + * Copyright (C) 2013-2026 The Project Lombok Authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -269,6 +269,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { String superclassBuilderClassName = job.replaceBuilderClassName(superclassName.toString(), builderClassNameTemplate); superclassBuilderClass = chainDots(parent, superclassName.toString(), superclassBuilderClassName); } else if (extendsClause != null) { + // This is dangerous; `toString()` breaks on non-ascii. We should optimally never get here. This fallback mechanism will remain (better than hardcrash; `toString()` is likely to work in _some_ cases). String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null); String superclassBuilderClassName = job.replaceBuilderClassName(extendsClause.toString(), builderClassNameTemplate); superclassBuilderClass = chainDots(parent, extendsClause.toString(), superclassBuilderClassName); diff --git a/test/transform/resource/after-delombok/SuperBuilderNonAsciiComplex.java b/test/transform/resource/after-delombok/SuperBuilderNonAsciiComplex.java new file mode 100644 index 00000000..b023684a --- /dev/null +++ b/test/transform/resource/after-delombok/SuperBuilderNonAsciiComplex.java @@ -0,0 +1,144 @@ +public class SuperBuilderNonAsciiComplex { + public static class 부모 { + Long a; + T z; + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static abstract class 부모Builder, B extends SuperBuilderNonAsciiComplex.부모.부모Builder> { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private Long a; + @java.lang.SuppressWarnings("all") + @lombok.Generated + private T z; + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + @lombok.Generated + public B a(final Long a) { + this.a = a; + return self(); + } + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + @lombok.Generated + public B z(final T z) { + this.z = z; + return self(); + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected abstract B self(); + @java.lang.SuppressWarnings("all") + @lombok.Generated + public abstract C build(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public java.lang.String toString() { + return "SuperBuilderNonAsciiComplex.부모.부모Builder(a=" + this.a + ", z=" + this.z + ")"; + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + private static final class 부모BuilderImpl extends SuperBuilderNonAsciiComplex.부모.부모Builder, SuperBuilderNonAsciiComplex.부모.부모BuilderImpl> { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private 부모BuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected SuperBuilderNonAsciiComplex.부모.부모BuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public SuperBuilderNonAsciiComplex.부모 build() { + return new SuperBuilderNonAsciiComplex.부모(this); + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected 부모(final SuperBuilderNonAsciiComplex.부모.부모Builder b) { + this.a = b.a; + this.z = b.z; + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static SuperBuilderNonAsciiComplex.부모.부모Builder builder() { + return new SuperBuilderNonAsciiComplex.부모.부모BuilderImpl(); + } + } + public static class 자식 extends SuperBuilderNonAsciiComplex.부모 { + String b; + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static abstract class 자식Builder> extends SuperBuilderNonAsciiComplex.부모.부모Builder { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private String b; + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + @lombok.Generated + public B b(final String b) { + this.b = b; + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected abstract B self(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public abstract C build(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public java.lang.String toString() { + return "SuperBuilderNonAsciiComplex.자식.자식Builder(super=" + super.toString() + ", b=" + this.b + ")"; + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + private static final class 자식BuilderImpl extends SuperBuilderNonAsciiComplex.자식.자식Builder { + @java.lang.SuppressWarnings("all") + @lombok.Generated + private 자식BuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected SuperBuilderNonAsciiComplex.자식.자식BuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + @lombok.Generated + public SuperBuilderNonAsciiComplex.자식 build() { + return new SuperBuilderNonAsciiComplex.자식(this); + } + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + protected 자식(final SuperBuilderNonAsciiComplex.자식.자식Builder b) { + super(b); + this.b = b.b; + } + @java.lang.SuppressWarnings("all") + @lombok.Generated + public static SuperBuilderNonAsciiComplex.자식.자식Builder builder() { + return new SuperBuilderNonAsciiComplex.자식.자식BuilderImpl(); + } + } + public static void test() { + 부모 x = 자식.builder().b("").a(5L).build(); + } +} \ No newline at end of file diff --git a/test/transform/resource/after-ecj/SuperBuilderNonAsciiComplex.java b/test/transform/resource/after-ecj/SuperBuilderNonAsciiComplex.java new file mode 100644 index 00000000..3de4ac98 --- /dev/null +++ b/test/transform/resource/after-ecj/SuperBuilderNonAsciiComplex.java @@ -0,0 +1,96 @@ +public class SuperBuilderNonAsciiComplex { + public static @lombok.SuperBuilder class 부모 { + public static abstract @java.lang.SuppressWarnings("all") @lombok.Generated class 부모Builder, B extends SuperBuilderNonAsciiComplex.부모.부모Builder> { + private @java.lang.SuppressWarnings("all") @lombok.Generated Long a; + private @java.lang.SuppressWarnings("all") @lombok.Generated T z; + public 부모Builder() { + super(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") @lombok.Generated B a(final Long a) { + this.a = a; + return self(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") @lombok.Generated B z(final T z) { + this.z = z; + return self(); + } + protected abstract @java.lang.SuppressWarnings("all") @lombok.Generated B self(); + public abstract @java.lang.SuppressWarnings("all") @lombok.Generated C build(); + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() { + return (((("SuperBuilderNonAsciiComplex.부모.부모Builder(a=" + this.a) + ", z=") + this.z) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") @lombok.Generated class 부모BuilderImpl extends SuperBuilderNonAsciiComplex.부모.부모Builder, SuperBuilderNonAsciiComplex.부모.부모BuilderImpl> { + private 부모BuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAsciiComplex.부모.부모BuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAsciiComplex.부모 build() { + return new SuperBuilderNonAsciiComplex.부모(this); + } + } + Long a; + T z; + protected @java.lang.SuppressWarnings("all") @lombok.Generated 부모(final SuperBuilderNonAsciiComplex.부모.부모Builder b) { + super(); + this.a = b.a; + this.z = b.z; + } + public static @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAsciiComplex.부모.부모Builder builder() { + return new SuperBuilderNonAsciiComplex.부모.부모BuilderImpl(); + } + } + public static @lombok.SuperBuilder class 자식 extends SuperBuilderNonAsciiComplex.부모 { + public static abstract @java.lang.SuppressWarnings("all") @lombok.Generated class 자식Builder> extends SuperBuilderNonAsciiComplex.부모.부모Builder { + private @java.lang.SuppressWarnings("all") @lombok.Generated String b; + public 자식Builder() { + super(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") @lombok.Generated B b(final String b) { + this.b = b; + return self(); + } + protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated B self(); + public abstract @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated C build(); + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() { + return (((("SuperBuilderNonAsciiComplex.자식.자식Builder(super=" + super.toString()) + ", b=") + this.b) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") @lombok.Generated class 자식BuilderImpl extends SuperBuilderNonAsciiComplex.자식.자식Builder { + private 자식BuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAsciiComplex.자식.자식BuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAsciiComplex.자식 build() { + return new SuperBuilderNonAsciiComplex.자식(this); + } + } + String b; + protected @java.lang.SuppressWarnings("all") @lombok.Generated 자식(final SuperBuilderNonAsciiComplex.자식.자식Builder b) { + super(b); + this.b = b.b; + } + public static @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderNonAsciiComplex.자식.자식Builder builder() { + return new SuperBuilderNonAsciiComplex.자식.자식BuilderImpl(); + } + } + public SuperBuilderNonAsciiComplex() { + super(); + } + public static void test() { + 부모 x = 자식.builder().b("").a(5L).build(); + } +} diff --git a/test/transform/resource/before/SuperBuilderNonAsciiComplex.java b/test/transform/resource/before/SuperBuilderNonAsciiComplex.java new file mode 100644 index 00000000..51e26757 --- /dev/null +++ b/test/transform/resource/before/SuperBuilderNonAsciiComplex.java @@ -0,0 +1,16 @@ +public class SuperBuilderNonAsciiComplex { + @lombok.SuperBuilder + public static class 부모 { + Long a; + T z; + } + + @lombok.SuperBuilder + public static class 자식 extends SuperBuilderNonAsciiComplex.부모 { + String b; + } + + public static void test() { + 부모 x = 자식.builder().b("").a(5L).build(); + } +} From 639bc2a4d183397779ff99efe35ce49c1bcd8fa8 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Tue, 8 Sep 2026 23:43:26 +0200 Subject: [PATCH 3/3] [#4070] fixed - reflected in changelog. --- doc/changelog.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/changelog.markdown b/doc/changelog.markdown index 126ddd58..897967ec 100644 --- a/doc/changelog.markdown +++ b/doc/changelog.markdown @@ -2,7 +2,7 @@ Lombok Changelog ---------------- ### v1.18.49 "Edgy Guinea Pig" -* No changes since v1.18.48 yet. +* BUGFIX: `@SuperBuilder` now works properly when your class names contain non-ASCII characters. [#3857](https://github.com/projectlombok/lombok/issues/4070) ### v1.18.48 (September 1st, 2026) * BREAKING CHANGE/BUGFIX: `@Builder(builderClassName = "Builder")` now generates an error, because the type names collide. [#3857](https://github.com/projectlombok/lombok/issues/3857) (found after release)