如何使用带有指令的脚本来自动化 Java 代码重构?

Gar*_*ker 7 java refactoring automated-refactoring

如何通过 Java 代码/Groovy 插件以编程方式重构此类?比方说,我需要:

  • 重命名foo.method2foo.method3
  • 重命名myMethodyourMethod
  • 更改导入的包org.you.core.util.AnotherClassFromExternalPackage
import com.me.core.util.AnotherClassFromExternalPackage;
import com.me.core.util.Foo;

public class MyClass implements AnotherClassFromExternalPackage {

    private final Foo foo;

    public MyClass() {
        this.foo = new Foo();
    }

    @Override
    public long myMethod() {
        return foo.method2();
    }
}
Run Code Online (Sandbox Code Playgroud)

如何创建一个脚本来解析代码、应用语法转换并使用给定的指令保存它?

上面的代码只是一个例子。更大的问题是我有很多项目都使用相同的外部库。有时,他们会发布一个包含重大更改的新版本,这些更改会在依赖项冲突后破坏当前代码。我必须每 2 周将 10 多个项目的依赖项更新到最新版本。我需要编写一个脚本来自动修复这些重大更改。理想情况下,逐一应用代码转换。

cw'*_*cw' 5

听起来像是OpenRewrite的工作。可以使用标准方法,例如用于重命名包的方法。您还可以编写自己的方法,在源代码的基于树的表示上使用访问者模式(这将保留例如缩进)。

您可以使用 Maven 或 Gradle 来执行重写。

例如,入门页面中的更改包配置如下所示:

type: specs.openrewrite.org/v1beta/recipe
name: com.yourorg.VetToVeterinary
recipeList:
  - org.openrewrite.java.ChangePackage:
    oldPackageName: org.springframework.samples.petclinic.vet
    newPackageName: org.springframework.samples.petclinic.veterinary
Run Code Online (Sandbox Code Playgroud)