diff --git a/rewrite-core/src/main/java/org/openrewrite/config/DeclarativeRecipe.java b/rewrite-core/src/main/java/org/openrewrite/config/DeclarativeRecipe.java index 884110f936d..98a12ad9003 100644 --- a/rewrite-core/src/main/java/org/openrewrite/config/DeclarativeRecipe.java +++ b/rewrite-core/src/main/java/org/openrewrite/config/DeclarativeRecipe.java @@ -161,9 +161,8 @@ private void initializeDeclarativeRecipe(DeclarativeRecipe declarativeRecipe, St } } - @SuppressWarnings("NotNullFieldNotInitialized") @JsonIgnore - private transient Accumulator accumulator; + private transient ThreadLocal accumulator = new ThreadLocal<>(); @Override public Accumulator getInitialValue(ExecutionContext ctx) { @@ -171,7 +170,7 @@ public Accumulator getInitialValue(ExecutionContext ctx) { for (Recipe precondition : preconditions) { registerNestedScanningRecipes(precondition, acc, ctx); } - accumulator = acc; + accumulator.set(acc); return acc; } @@ -509,7 +508,8 @@ private TreeVisitor orVisitors(Recipe recipe) { //noinspection rawtypes ScanningRecipe scanning = (ScanningRecipe) recipe; //noinspection unchecked - conditions.add(scanning.getVisitor(accumulator.recipeToAccumulator.get(scanning))); + Accumulator acc = accumulator.get(); + conditions.add(scanning.getVisitor(acc != null ? acc.recipeToAccumulator.get(scanning) : null)); } else { conditions.add(recipe.getVisitor()); } @@ -602,6 +602,18 @@ private static class LazyLoadedRecipe extends Recipe { String description = "Recipe that is loaded lazily."; } + @Override + public void onComplete(ExecutionContext ctx) { + accumulator.remove(); + } + + @Override + public DeclarativeRecipe clone() { + DeclarativeRecipe cloned = (DeclarativeRecipe) super.clone(); + cloned.accumulator = new ThreadLocal<>(); + return cloned; + } + @Override protected RecipeDescriptor createRecipeDescriptor() { List preconditionDescriptors = new ArrayList<>();