From fdd62811a71e22acd4d4083b60e300d5252df697 Mon Sep 17 00:00:00 2001 From: Arnaud Lacurie Date: Fri, 28 Aug 2026 17:50:48 +0200 Subject: [PATCH] Adopt jspecify + NullAway null-checking on fdb-record-layer-icu Adds jspecify plus NullAway (via net.ltgt.errorprone), scoped to this module only, following the same pattern as fdb-relational-grpc and fdb-relational-jdbc. com.apple.foundationdb.record.icu is marked @NullMarked; the module's only two javax.annotation.Nonnull usages are removed (non-null is now the default under @NullMarked). No javax.annotation.Nullable usages existed in this tiny module, and NullAway surfaced no undocumented nullability or latent bugs. --- .../fdb-record-layer-icu.gradle | 22 ++++++++++++++++++- ...ollateFunctionKeyExpressionFactoryICU.java | 4 +--- .../record/icu/TextCollatorRegistryICU.java | 16 +++++--------- .../foundationdb/record/icu/package-info.java | 3 +++ 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/fdb-record-layer-icu/fdb-record-layer-icu.gradle b/fdb-record-layer-icu/fdb-record-layer-icu.gradle index b275d44c2e9..64efd31fab3 100644 --- a/fdb-record-layer-icu/fdb-record-layer-icu.gradle +++ b/fdb-record-layer-icu/fdb-record-layer-icu.gradle @@ -18,16 +18,23 @@ * limitations under the License. */ +plugins { + alias(libs.plugins.errorprone) +} + def coreProject = ":${ext.coreProjectName}" dependencies { api project(coreProject) implementation(libs.icu) implementation(libs.protobuf) implementation(libs.slf4j.api) - compileOnly(libs.jsr305) + compileOnly(libs.jspecify) compileOnly(libs.autoService) annotationProcessor(libs.autoService) + errorprone(libs.errorprone.core) + errorprone(libs.nullaway) + testImplementation project(':fdb-test-utils') testImplementation(testFixtures(project(coreProject))) testImplementation(libs.bundles.test.impl) @@ -36,6 +43,19 @@ dependencies { testImplementation(libs.snakeyaml) } +// jspecify + NullAway, scoped to this module only. See the @NullMarked package-info.java in +// com.apple.foundationdb.record.icu. Part of a module-by-module null-checking rollout that started +// with fdb-relational-grpc and fdb-relational-jdbc. +tasks.withType(JavaCompile).configureEach { + options.errorprone { + disableAllChecks = true + error("NullAway") + option("NullAway:AnnotatedPackages", "com.apple.foundationdb.record.icu") + option("NullAway:JSpecifyMode", "true") + option("NullAway:AcknowledgeRestrictiveAnnotations", "true") + } +} + apply from: rootProject.file('gradle/publishing.gradle') publishing { publications { diff --git a/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/CollateFunctionKeyExpressionFactoryICU.java b/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/CollateFunctionKeyExpressionFactoryICU.java index ab50c6deecd..8919c919406 100644 --- a/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/CollateFunctionKeyExpressionFactoryICU.java +++ b/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/CollateFunctionKeyExpressionFactoryICU.java @@ -26,7 +26,6 @@ import com.apple.foundationdb.record.metadata.expressions.KeyExpression; import com.google.auto.service.AutoService; -import javax.annotation.Nonnull; import java.util.Collections; import java.util.List; @@ -40,7 +39,6 @@ public class CollateFunctionKeyExpressionFactoryICU implements FunctionKeyExpression.Factory { public static final String FUNCTION_NAME = "collate_icu"; - @Nonnull @Override public List getBuilders() { return Collections.singletonList( @@ -48,7 +46,7 @@ public List getBuilders() { } protected static class CollateFunctionKeyExpressionICU extends CollateFunctionKeyExpression { - protected CollateFunctionKeyExpressionICU(@Nonnull String name, @Nonnull KeyExpression arguments) { + protected CollateFunctionKeyExpressionICU(String name, KeyExpression arguments) { super(TextCollatorRegistryICU.instance(), name, arguments); } } diff --git a/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/TextCollatorRegistryICU.java b/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/TextCollatorRegistryICU.java index 5ac92533f8c..903cfa8c863 100644 --- a/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/TextCollatorRegistryICU.java +++ b/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/TextCollatorRegistryICU.java @@ -30,7 +30,6 @@ import com.ibm.icu.text.Collator; import com.ibm.icu.util.ULocale; -import javax.annotation.Nonnull; import java.util.Locale; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -59,21 +58,18 @@ public static TextCollatorRegistry instance() { private TextCollatorRegistryICU() { } - @Nonnull @Override public String getName() { return "icu"; } @Override - @Nonnull public TextCollator getTextCollator(int strength) { return getTextCollator(DEFAULT_LOCALE, strength); } @Override - @Nonnull - public TextCollator getTextCollator(@Nonnull String locale, int strength) { + public TextCollator getTextCollator(String locale, int strength) { return MapUtils.computeIfAbsent(collators, NonnullPair.of(locale, strength), key -> { final Collator collator = DEFAULT_LOCALE.equals(locale) ? Collator.getInstance(ULocale.forLocale(Locale.ROOT)) : @@ -84,21 +80,19 @@ public TextCollator getTextCollator(@Nonnull String locale, int strength) { } protected static class TextCollatorICU implements TextCollator { - @Nonnull private final Collator collator; - - protected TextCollatorICU(@Nonnull Collator collator) { + + protected TextCollatorICU(Collator collator) { this.collator = collator; } @Override - public int compare(@Nonnull String str1, @Nonnull String str2) { + public int compare(String str1, String str2) { return collator.compare(str1, str2); } - @Nonnull @Override - public ByteString getKey(@Nonnull String str) { + public ByteString getKey(String str) { return ZeroCopyByteString.wrap(collator.getCollationKey(str).toByteArray()); } } diff --git a/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/package-info.java b/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/package-info.java index 25c529013af..e394f25eca4 100644 --- a/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/package-info.java +++ b/fdb-record-layer-icu/src/main/java/com/apple/foundationdb/record/icu/package-info.java @@ -21,4 +21,7 @@ /** * Use ICU4J instead of JRE {@code Collator} classes. */ +@NullMarked package com.apple.foundationdb.record.icu; + +import org.jspecify.annotations.NullMarked;