Wrap a nullable for-each iterable in requireNonNull
io.moderne.nullability.WrapNullableForEachIterableInRequireNonNullio.moderne.recipe:rewrite-nullabilityWraps the iterable of an enhanced-for (for-each) loop in java.util.Objects.requireNonNull(...) (statically imported) when it is a provably-nullable value. Inside an annotated scope NullAway treats the for-each iterable as non-null, so iterating a nullable expression is an error; iterating a null already throws NullPointerException when the loop obtains its iterator, so requireNonNull throws exactly where the loop already would and runtime behavior is unchanged. The iterable's nullness is resolved by attribution from the nullability model and a path-sensitive flow analysis. The fix never asserts non-null on a value that is genuinely nullable at the site. Idempotent and conservative; only Java sources are modified.
Usage
This recipe has no required configuration options. You’ll need the Moderne CLI configured before running the command below.
mod run . --recipe io.moderne.nullability.WrapNullableForEachIterableInRequireNonNullIf the recipe isn’t available locally, install it with:
mod config recipes jar install io.moderne.recipe:rewrite-nullability:0.3.1Options
| Name | Type | Description |
|---|---|---|
annotatedPackages | String | Comma-separated package prefixes to limit the fix to (matching NullAway's AnnotatedPackages option). When unset, the recipe fixes all packages.e.g. com.example |
assertionStyle | AssertionStyle | The non-null assertion form to emit at a wrap site. AUTO (the default) inspects the classpath: Guava present (com.google.common) emits Preconditions.checkNotNull, otherwise Objects.requireNonNull. CAST_TO_NON_NULL is explicit-only (it is suppression-like — no runtime throw) and never auto-selected. |
Data tables
Structured output this recipe can produce.
- Null-safety fixes by rungEach residual null-safety fix applied, tagged with the precedence rung that produced it, so the share bottoming out at a last-resort `requireNonNull` assertion can be tracked.
io.moderne.nullability.table.NullFixes - Declined null-safety fixes needing reviewEach site the recipe declined to auto-fix because the fix is a design decision (the value is explicitly `null` on some path, so the slot likely should be `@Nullable`), for human triage.
io.moderne.nullability.table.DeclinedNullFixes - Source files that had resultsSource files that were modified by the recipe run.
org.openrewrite.table.SourcesFileResults - Source files that had search resultsSearch results that were found during the recipe run.
org.openrewrite.table.SearchResults - Source files that errored on a recipeThe details of all errors produced by a recipe run.
org.openrewrite.table.SourcesFileErrors - Recipe performanceStatistics used in analyzing the performance of recipes.
org.openrewrite.table.RecipeRunStats