From 277c7bf34ac037458666bb88c800d9e95e8afbfe Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Fri, 21 Aug 2026 01:01:44 +0200 Subject: [PATCH] Allow listy configuration keys to use = to force a list to a single value --- .../core/configuration/ConfigurationApp.java | 3 +- .../configuration/ConfigurationParser.java | 12 +-- .../configurationRoot/archives/a1.jar | Bin 765 -> 770 bytes .../configurationRoot/archives/a2.zip | Bin 180 -> 180 bytes .../d11/d111/directory/setlist/lombok.config | 1 + .../resource/configurationRoot/out.txt | 79 +++++++++++++++++- .../core/configuration/TestConfiguration.java | 9 +- 7 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 test/configuration/resource/configurationRoot/d1/d11/d111/directory/setlist/lombok.config diff --git a/src/core/lombok/core/configuration/ConfigurationApp.java b/src/core/lombok/core/configuration/ConfigurationApp.java index 268e83b5..0db1a0c2 100644 --- a/src/core/lombok/core/configuration/ConfigurationApp.java +++ b/src/core/lombok/core/configuration/ConfigurationApp.java @@ -245,7 +245,8 @@ public class ConfigurationApp extends LombokApp { } else if (value instanceof List) { List list = (List)value; if (list.isEmpty()) out.printf("clear %s%n", key.getKeyName()); - for (Object element : list) out.printf("%s += %s%n", key.getKeyName(), element); + else if (list.size() == 1) out.printf("%s = %s%n", key.getKeyName(), list.get(0)); + else for (Object element : list) out.printf("%s += %s%n", key.getKeyName(), element); } else { out.printf("%s = %s%n", key.getKeyName(), value); } diff --git a/src/core/lombok/core/configuration/ConfigurationParser.java b/src/core/lombok/core/configuration/ConfigurationParser.java index 4b9846d9..ffb323ef 100644 --- a/src/core/lombok/core/configuration/ConfigurationParser.java +++ b/src/core/lombok/core/configuration/ConfigurationParser.java @@ -103,10 +103,6 @@ public class ConfigurationParser { reporter.report(context.description(), "'" + keyName + "' is not a list and doesn't support " + operator + " (only = and clear)", lineNumber, line); continue; } - if (operator.equals("=") && type.isList()) { - reporter.report(context.description(), "'" + keyName + "' is a list and cannot be assigned to (use +=, -= and clear instead)", lineNumber, line); - continue; - } Object value = null; if (stringValue != null) try { @@ -119,7 +115,13 @@ public class ConfigurationParser { if (operator.equals("clear")) { collector.clear(key, context, lineNumber); } else if (operator.equals("=")) { - collector.set(key, value, context, lineNumber); + if (type.isList()) { + collector.clear(key, context, lineNumber); + collector.add(key, value, context, lineNumber); + } + else { + collector.set(key, value, context, lineNumber); + } } else if (operator.equals("+=")) { collector.add(key, value, context, lineNumber); } else { diff --git a/test/configuration/resource/configurationRoot/archives/a1.jar b/test/configuration/resource/configurationRoot/archives/a1.jar index d7dca22d9936c92863816086681bbd9e7d4d36e2..b3b2af6b0a5ea31167b6b7590f2fdc828f0c5a84 100644 GIT binary patch delta 315 zcmey%+Qh~e;LXg!#lXP9z+kjuO7KKJMHVn^teoS>)u152dSUMaS(`?u-(qX6+AV{5 zUe4bjXjSKU`}>mETe?SPWOy|Nu@~xe#qzy>;;->z;%%1smEl`+tB(0>G1`%y9L2CT zXAwv72D=}u0p9E!C(1=T0~i<>!hsmg-uB(M;X{Qz%9 tCJ_b^1`ZAmu$L#-GD$IBojij{K^~+T*#=&q4g|2De4R;w?JOfm1OVB@VA22p delta 368 zcmZo-`^(A~;LXg!#lXP9z_2IRFkm8|BFn^5AZ@H%Z^+l6z{7fBZg4@A?wi>Nsm4uOwB@AJ(Sj`AU-CSkUOn!Ta@t&X!*yn*_=yvGdl;YH zyee@0Me-^30B?4V?{f{e`7$stga9$ZQmZ_}0H6RIFaudBM*2Vn+$Cc`lS*HH1VDdyp0~!9ipJxOD^~C{kfHxx(7X!jWlkYMb z@`8K>w|=rTlMxHZ+R1@TQbrqL_AxSvFd!@pn7nqsHc(0vhy{Td0WMAaAfgSj1*RP2 XE@T(*BGdv|Hk0o#DX^Vj1PKBFUVvg{ diff --git a/test/configuration/resource/configurationRoot/archives/a2.zip b/test/configuration/resource/configurationRoot/archives/a2.zip index 2b0d00366eb58e7af38de9cdafe013aed999c10a..1869548212b419bad387a58bd8c23e877580ac6d 100644 GIT binary patch delta 30 icmdnOxP_4~z?+#xgn@&DgTZLUl;DYcaV%iEzy$znV+aob delta 30 icmdnOxP_4~z?+#xgn@&DgW+YKVZcPbI2JHn-~s?|ZwNgA diff --git a/test/configuration/resource/configurationRoot/d1/d11/d111/directory/setlist/lombok.config b/test/configuration/resource/configurationRoot/d1/d11/d111/directory/setlist/lombok.config new file mode 100644 index 00000000..d1bdeac0 --- /dev/null +++ b/test/configuration/resource/configurationRoot/d1/d11/d111/directory/setlist/lombok.config @@ -0,0 +1 @@ +lombok.accessors.prefix = r_ \ No newline at end of file diff --git a/test/configuration/resource/configurationRoot/out.txt b/test/configuration/resource/configurationRoot/out.txt index f6415862..5c184b5d 100644 --- a/test/configuration/resource/configurationRoot/out.txt +++ b/test/configuration/resource/configurationRoot/out.txt @@ -11,7 +11,7 @@ lombok.accessors.chain = false # 3: lombok.accessors.chain = false # Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers. -lombok.accessors.prefix += f +lombok.accessors.prefix = f # BASE/d1/d11/lombok.config (stopped bubbling): # 5: lombok.accessors.prefix += f @@ -28,7 +28,7 @@ clear lombok.anyConstructor.addConstructorProperties clear lombok.log.fieldName # Copy these annotations to getters, setters, with methods, builder-setters, etc. -lombok.copyableAnnotations += copy1 +lombok.copyableAnnotations = copy1 # BASE/d1/d11/lombok.config (stopped bubbling): # 7: lombok.copyableAnnotations += copy1 @@ -94,7 +94,80 @@ lombok.anyConstructor.addConstructorProperties = true clear lombok.log.fieldName # Copy these annotations to getters, setters, with methods, builder-setters, etc. -lombok.copyableAnnotations += copy2 +lombok.copyableAnnotations = copy2 +# BASE/d1/d11/lombok.config (stopped bubbling): +# 7: lombok.copyableAnnotations += copy1 +# +# BASE/archives/a2.zip!reset.config (imported from BASE/d1/d11/d111/lombok.config:2): +# 1: clear lombok.copyableAnnotations +# +# BASE/d1/d11/d111/lombok.config: +# 5: lombok.copyableAnnotations += copy2 + +# Generate some style of null annotation for generated code where this is relevant. (default: none). +clear lombok.addNullAnnotations + + +Configuration for 'BASE/d1/d11/d111/directory/setlist'. + +# Emit a warning or error if @Accessors is used. +lombok.accessors.flagUsage = ERROR +# BASE/d1/d11/lombok.config (stopped bubbling): +# 4: lombok.accessors.flagUsage = ERROR + +# Generate setters that return 'this' instead of 'void' (default: false). +clear lombok.accessors.chain +# BASE/d1/d11/lombok.config (stopped bubbling): +# 3: lombok.accessors.chain = false +# +# BASE/d1/d11/d111/lombok.config: +# 3: clear lombok.accessors.chain + +# Strip this field prefix, like 'f' or 'm_', from the names of generated getters, setters, and with-ers. +lombok.accessors.prefix = r_ +# BASE/d1/d11/lombok.config (stopped bubbling): +# 5: lombok.accessors.prefix += f +# +# BASE/e1/environment.config (imported from BASE/d1/d11/d111/import1.config:6): +# 1: lombok.accessors.prefix += e_ +# +# BASE/home/home.config (imported from BASE/d1/d11/d111/import1.config:7): +# 1: lombok.accessors.prefix += h_ +# +# BASE/d1/d11/d111/import1.config (imported from BASE/d1/d11/d111/lombok.config:1): +# 8: lombok.accessors.prefix += z_ +# 9: lombok.accessors.prefix += f +# +# BASE/d1/d11/d111/lombok.config: +# 4: lombok.accessors.prefix += m_ +# +# BASE/d1/d11/d111/directory/lombok.config: +# 1: lombok.accessors.prefix += x_ +# +# BASE/d1/d11/d111/directory/setlist/lombok.config: +# 1: clear lombok.accessors.prefix +# 1: lombok.accessors.prefix += r_ + +# Generate @javax.annotation.Generated on all generated code (default: false). Deprecated, use 'lombok.addJavaxGeneratedAnnotation' instead. +lombok.addGeneratedAnnotation = true +# BASE/archives/a1.jar!d1/include.config (imported from BASE/archives/a1.jar!lombok.config:1) (stopped bubbling): +# 4: lombok.addGeneratedAnnotation = true + +# Generate @javax.annotation.Generated on all generated code (default: follow lombok.addGeneratedAnnotation). +lombok.addJavaxGeneratedAnnotation = true +# BASE/archives/a1.jar!d2/include.config (imported from BASE/archives/a1.jar!d1/include.config:1) (stopped bubbling): +# 1: lombok.addJavaxGeneratedAnnotation = true + +# Generate @ConstructorProperties for generated constructors (default: false). +lombok.anyConstructor.addConstructorProperties = true +# BASE/archives/a1.jar!lombok.config (imported from BASE/d1/d11/d111/import1.config:4) (stopped bubbling): +# 3: lombok.anyConstructor.addConstructorProperties = true + +# Use this name for the generated logger fields (default: 'log'). +clear lombok.log.fieldName + +# Copy these annotations to getters, setters, with methods, builder-setters, etc. +lombok.copyableAnnotations = copy2 # BASE/d1/d11/lombok.config (stopped bubbling): # 7: lombok.copyableAnnotations += copy1 # diff --git a/test/configuration/src/lombok/core/configuration/TestConfiguration.java b/test/configuration/src/lombok/core/configuration/TestConfiguration.java index d7d25a97..b93be215 100644 --- a/test/configuration/src/lombok/core/configuration/TestConfiguration.java +++ b/test/configuration/src/lombok/core/configuration/TestConfiguration.java @@ -45,7 +45,14 @@ public class TestConfiguration { String baseName = "test/configuration/resource/configurationRoot/"; File directory = new File(baseName); String normalizedName = new File(directory.getAbsoluteFile().toURI().normalize()).toString().replace('\\', '/') + "/"; - Collection paths = Arrays.asList(normalizedName + "d1/d11", normalizedName + "d1/d12", normalizedName + "d1/d11/d111", normalizedName + "d1/d11/d111/f1.txt", normalizedName + "features/annotations"); + Collection paths = Arrays.asList( + normalizedName + "d1/d11", + normalizedName + "d1/d12", + normalizedName + "d1/d11/d111", + normalizedName + "d1/d11/d111/f1.txt", + normalizedName + "d1/d11/d111/directory/setlist", + normalizedName + "features/annotations" + ); ByteArrayOutputStream rawOut = new ByteArrayOutputStream(); ByteArrayOutputStream rawErr = new ByteArrayOutputStream();