From 08a386c1c1d284d2895175d7e56bd96ae1d5410b Mon Sep 17 00:00:00 2001 From: Ryan Hudson <43145457+ryan-hudson@users.noreply.github.com> Date: Mon, 24 Jun 2024 06:13:42 -0400 Subject: [PATCH] Add PlaintextOnly Option to FindAndReplace Recipe (#4277) * Added a PlaintextOnly property to FindAndReplace recipe to prevent the recipe from executing on non-plaintext files and causing Language specific LST information loss. * Removed constructors --- .../org/openrewrite/text/FindAndReplace.java | 16 +++++++++++++++ .../org/openrewrite/RecipeLifecycleTest.java | 2 +- .../java/org/openrewrite/RecipeRunTest.java | 2 +- .../openrewrite/text/FindAndReplaceTest.java | 20 +++++++++---------- .../text/FindAndReplaceJavaTest.java | 10 +++++++++- 5 files changed, 37 insertions(+), 13 deletions(-) diff --git a/rewrite-core/src/main/java/org/openrewrite/text/FindAndReplace.java b/rewrite-core/src/main/java/org/openrewrite/text/FindAndReplace.java index f7d7b0f14b0..496855b67bc 100644 --- a/rewrite-core/src/main/java/org/openrewrite/text/FindAndReplace.java +++ b/rewrite-core/src/main/java/org/openrewrite/text/FindAndReplace.java @@ -19,9 +19,11 @@ import lombok.Value; import org.openrewrite.*; import org.openrewrite.binary.Binary; +import org.openrewrite.internal.lang.NonNull; import org.openrewrite.internal.lang.Nullable; import org.openrewrite.marker.AlreadyReplaced; import org.openrewrite.marker.Marker; +import org.openrewrite.marker.SearchResult; import org.openrewrite.quark.Quark; import org.openrewrite.remote.Remote; @@ -99,6 +101,11 @@ public String getDescription() { @Nullable String filePattern; + @Option(displayName = "Plaintext only", description = "Only alter files that are parsed as plaintext to prevent language-specific LST information loss. Defaults to false.", + required = false) + @Nullable + Boolean plaintextOnly; + @Override public TreeVisitor getVisitor() { TreeVisitor visitor = new TreeVisitor() { @@ -156,6 +163,15 @@ public Tree visit(@Nullable Tree tree, ExecutionContext ctx) { visitor = Preconditions.check(check, visitor); } + + if (Boolean.TRUE.equals(plaintextOnly)) { + visitor = Preconditions.check(new PlainTextVisitor(){ + @Override + public @NonNull PlainText visitText(@NonNull PlainText text, @NonNull ExecutionContext ctx) { + return SearchResult.found(text); + } + }, visitor); + } return visitor; } diff --git a/rewrite-core/src/test/java/org/openrewrite/RecipeLifecycleTest.java b/rewrite-core/src/test/java/org/openrewrite/RecipeLifecycleTest.java index ceaab6fea6c..ef289d80c2a 100644 --- a/rewrite-core/src/test/java/org/openrewrite/RecipeLifecycleTest.java +++ b/rewrite-core/src/test/java/org/openrewrite/RecipeLifecycleTest.java @@ -102,7 +102,7 @@ public String getDescription() { public List getRecipeList() { return Arrays.asList( new DeleteSourceFiles("test.txt"), - new FindAndReplace("test", "", null, null, null, null, null)); + new FindAndReplace("test", "", null, null, null, null, null, null)); } } diff --git a/rewrite-core/src/test/java/org/openrewrite/RecipeRunTest.java b/rewrite-core/src/test/java/org/openrewrite/RecipeRunTest.java index e697ae71f4b..7bf86b21ff5 100644 --- a/rewrite-core/src/test/java/org/openrewrite/RecipeRunTest.java +++ b/rewrite-core/src/test/java/org/openrewrite/RecipeRunTest.java @@ -28,7 +28,7 @@ class RecipeRunTest implements RewriteTest { @Test void printDatatable() { rewriteRun( - recipeSpec -> recipeSpec.recipe(new FindAndReplace("replace_me", "replacement", null, null, null, null, null)) + recipeSpec -> recipeSpec.recipe(new FindAndReplace("replace_me", "replacement", null, null, null, null, null, null)) .afterRecipe(recipeRun -> { StringBuilder output = new StringBuilder(); final String dataTableName = SourcesFileResults.class.getName(); diff --git a/rewrite-core/src/test/java/org/openrewrite/text/FindAndReplaceTest.java b/rewrite-core/src/test/java/org/openrewrite/text/FindAndReplaceTest.java index 2d96e10bd6e..b46b458501f 100644 --- a/rewrite-core/src/test/java/org/openrewrite/text/FindAndReplaceTest.java +++ b/rewrite-core/src/test/java/org/openrewrite/text/FindAndReplaceTest.java @@ -32,7 +32,7 @@ class FindAndReplaceTest implements RewriteTest { @Test void nonTxtExtension() { rewriteRun( - spec -> spec.recipe(new FindAndReplace(".", "G", null, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace(".", "G", null, null, null, null, null, null)), text( """ This is text. @@ -48,7 +48,7 @@ void nonTxtExtension() { @Test void removeWhenNullOrEmpty() { rewriteRun( - spec -> spec.recipe(new FindAndReplace("Bar", null, null, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace("Bar", null, null, null, null, null, null, null)), text( """ Foo @@ -67,7 +67,7 @@ void removeWhenNullOrEmpty() { @Test void defaultNonRegex() { rewriteRun( - spec -> spec.recipe(new FindAndReplace(".", "G", null, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace(".", "G", null, null, null, null, null, null)), text( """ This is text. @@ -82,7 +82,7 @@ void defaultNonRegex() { @Test void regexReplace() { rewriteRun( - spec -> spec.recipe(new FindAndReplace(".", "G", true, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace(".", "G", true, null, null, null, null, null)), text( """ This is text. @@ -97,7 +97,7 @@ void regexReplace() { @Test void captureGroups() { rewriteRun( - spec -> spec.recipe(new FindAndReplace("This is ([^.]+).", "I like $1.", true, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace("This is ([^.]+).", "I like $1.", true, null, null, null, null, null)), text( """ This is text. @@ -112,7 +112,7 @@ void captureGroups() { @Test void noRecursive() { rewriteRun( - spec -> spec.recipe(new FindAndReplace("test", "tested", false, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace("test", "tested", false, null, null, null, null, null)), text("test", "tested") ); } @@ -122,7 +122,7 @@ void dollarSignsTolerated() { String find = "This is text ${dynamic}."; String replace = "This is text ${dynamic}. Stuff"; rewriteRun( - spec -> spec.recipe(new FindAndReplace(find, replace, null, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace(find, replace, null, null, null, null, null, null)), text(find, replace) ); } @@ -144,9 +144,9 @@ public String getDescription() { @Override public List getRecipeList() { return Arrays.asList( - new FindAndReplace("one", "two", null, null, null, null, null), - new FindAndReplace("two", "three", null, null, null, null, null), - new FindAndReplace("three", "four", null, null, null, null, null)); + new FindAndReplace("one", "two", null, null, null, null, null, null), + new FindAndReplace("two", "three", null, null, null, null, null, null), + new FindAndReplace("three", "four", null, null, null, null, null, null)); } } diff --git a/rewrite-java-test/src/test/java/org/openrewrite/text/FindAndReplaceJavaTest.java b/rewrite-java-test/src/test/java/org/openrewrite/text/FindAndReplaceJavaTest.java index 0042ac1bb9e..873ef0c9dea 100644 --- a/rewrite-java-test/src/test/java/org/openrewrite/text/FindAndReplaceJavaTest.java +++ b/rewrite-java-test/src/test/java/org/openrewrite/text/FindAndReplaceJavaTest.java @@ -29,7 +29,7 @@ class FindAndReplaceJavaTest implements RewriteTest { @Test void findAndReplaceJava() { rewriteRun( - spec -> spec.recipe(new FindAndReplace("Test", "Replaced", null, null, null, null, null)), + spec -> spec.recipe(new FindAndReplace("Test", "Replaced", null, null, null, null, null, null)), java( "class Test {}", "class Replaced {}" @@ -37,6 +37,14 @@ void findAndReplaceJava() { ); } + @Test + void ignoresJavaFileWithPlaintextFlagEnabled() { + rewriteRun( + spec -> spec.recipe(new FindAndReplace("Test", "Replaced", null, null, null, null, null, true)), + java("class Test {}") + ); + } + @Test @Issue("https://github.com/openrewrite/rewrite/issues/3532") void filePatternShouldLimitApplication() {