Skip to content

Commit

Permalink
Add recipe UpdateMovedPackageClassName to update class fqn after movi…
Browse files Browse the repository at this point in the history
…ng it to a new package
  • Loading branch information
kunli2 committed Jun 13, 2023
1 parent 7c182ff commit 203adda
Show file tree
Hide file tree
Showing 2 changed files with 189 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* Copyright 2023 the original author or authors.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* https://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openrewrite.java.recipes;

import org.junit.jupiter.api.Test;
import org.openrewrite.test.RewriteTest;
import org.openrewrite.test.TypeValidation;

import static org.openrewrite.java.Assertions.java;

class UpdateMovedPackageClassNameTest implements RewriteTest {
@SuppressWarnings("all")
@Test
void changeCleanUpToStaticanalysisForSpecificClassOnly() {
rewriteRun(
spec -> spec.recipe(new UpdateMovedPackageClassName("org.openrewrite.java.cleanup.UnnecessaryCatch",
"org.openrewrite.staticanalysis.UnnecessaryCatch"))
.typeValidationOptions(TypeValidation.none()),
java(
"""
package org.openrewrite.java.migrate;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.java.JavaVisitor;
import org.openrewrite.java.cleanup.SimplifyBooleanExpression;
import org.openrewrite.java.cleanup.UnnecessaryCatch;
import org.openrewrite.java.tree.J;
public class UseJavaUtilBase64 extends Recipe {
@Override
public String getDisplayName() {return "Prefer `java.util.Base64` instead of `sun.misc`";}
@Override
public String getDescription() {return "Prefer `java.util.Base64` instead of `sun.misc`.";}
@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
return new JavaVisitor<ExecutionContext>() {
@Override
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
J.MethodInvocation m = (J.MethodInvocation) super.visitMethodInvocation(method, ctx);
// expect to change
doAfterVisit(new UnnecessaryCatch(false).getVisitor());
org.openrewrite.java.cleanup.UnnecessaryCatch v1 = new org.openrewrite.java.cleanup.UnnecessaryCatch(true);
// expect no change
doAfterVisit(new SimplifyBooleanExpression().getVisitor());
org.openrewrite.java.cleanup.SimplifyBooleanExpression v2 = new org.openrewrite.java.cleanup.SimplifyBooleanExpression();
return m;
}
};
}
}
""",
"""
package org.openrewrite.java.migrate;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.java.JavaVisitor;
import org.openrewrite.java.cleanup.SimplifyBooleanExpression;
import org.openrewrite.java.tree.J;
import org.openrewrite.staticanalysis.UnnecessaryCatch;
public class UseJavaUtilBase64 extends Recipe {
@Override
public String getDisplayName() {return "Prefer `java.util.Base64` instead of `sun.misc`";}
@Override
public String getDescription() {return "Prefer `java.util.Base64` instead of `sun.misc`.";}
@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
return new JavaVisitor<ExecutionContext>() {
@Override
public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) {
J.MethodInvocation m = (J.MethodInvocation) super.visitMethodInvocation(method, ctx);
// expect to change
doAfterVisit(new UnnecessaryCatch(false).getVisitor());
org.openrewrite.staticanalysis.UnnecessaryCatch v1 = new org.openrewrite.staticanalysis.UnnecessaryCatch(true);
// expect no change
doAfterVisit(new SimplifyBooleanExpression().getVisitor());
org.openrewrite.java.cleanup.SimplifyBooleanExpression v2 = new org.openrewrite.java.cleanup.SimplifyBooleanExpression();
return m;
}
};
}
}
"""
)
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* Copyright 2023 the original author or authors.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* https://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openrewrite.java.recipes;

import lombok.EqualsAndHashCode;
import lombok.Value;
import org.openrewrite.ExecutionContext;
import org.openrewrite.Option;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.java.JavaIsoVisitor;
import org.openrewrite.java.tree.J;
import org.openrewrite.java.tree.TypeTree;

@Value
@EqualsAndHashCode(callSuper = false)
public class UpdateMovedPackageClassName extends Recipe {
@Option(displayName = "The fully qualified className moved from",
description = "The fully qualified className moved from a old package.",
example = "org.openrewrite.java.cleanup.UnnecessaryCatch")
String fullyQualifiedClassNameMovedFrom;

@Option(displayName = "The fully qualified className moved to",
description = "The fully qualified className moved to a new package.",
example = "org.openrewrite.staticanalysis.UnnecessaryCatch")
String fullyQualifiedClassNameMovedTo;

@Override
public String getDisplayName() {
return "Update moved package class name";
}

@Override
public String getDescription() {
return "When a class moved from package A to B, update the fully qualified className accordingly.";
}

@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
return new JavaIsoVisitor<ExecutionContext>() {
@Override
public J.FieldAccess visitFieldAccess(J.FieldAccess fieldAccess, ExecutionContext executionContext) {
if (fieldAccess.toString().equals(fullyQualifiedClassNameMovedFrom)) {
return TypeTree.build(fullyQualifiedClassNameMovedTo)
.withPrefix(fieldAccess.getPrefix());
}
return super.visitFieldAccess(fieldAccess, executionContext);
}

@Override
public J.Import visitImport(J.Import _import, ExecutionContext executionContext) {
J.Import after = super.visitImport(_import, executionContext);
if (_import != after) {
maybeRemoveImport(fullyQualifiedClassNameMovedFrom);
maybeAddImport(fullyQualifiedClassNameMovedTo);
doAfterVisit(new org.openrewrite.java.OrderImports(true).getVisitor());
}
return after;
}
};
}
}

0 comments on commit 203adda

Please sign in to comment.