OpenRewrite - 如何使用 JavaTemplate 将一条语句替换为多个新语句?

问题描述 投票:0回答:1

我正在编写一个食谱 使用 JavaTemplate 将一个语句替换为其他多个语句,但我无法使其工作

经过调查,我意识到仅更改一个语句仅用另一个语句效果很好当我尝试用多个语句替换一个语句时问题出现了。

我看到的错误是它没有很好地构建该声明。就我而言,我试图用两个模拟语句替换一个模拟语句。虽然第一个模拟语句写得很好,但第二个似乎被错误地解析了。

这是应用该配方后代码的外观的代码片段:

given(methodToMock1).willReturn(expectedResponse1);
Templategiven(methodToMock2 <error>();

在尝试其他操作后,我还看到一个错误,告诉我我正在尝试用两个语句替换一个语句,并且这样做是无效的。

我已经尝试过:

我尝试应用 JavaTemplate 执行以下操作:

注意: 在下面显示的示例中,

oldMockStatement
指的是我要替换的模拟语句(只有一个语句),
methodDeclarationWhereApplyingChanges
指的是应用此更改的方法:

// New mocks we want to include
String NEW_MOCK_STATEMENTS =
        """
        given(methodToMock1).willReturn(expectedResponse1);
        given(methodToMock2).willReturn(expectedResponse2);
        """;

// Building JavaTemplate
JavaTemplate javaTemplate = JavaTemplate.builder(NEW_MOCK_STATEMENTS).build();

// We replace old mock statement with two new ones
methodDeclarationWhereApplyingChanges = methodDeclarationWhereApplyingChanges.withBody(
              javaTemplate.apply(
                  new Cursor(getCursor(), methodDeclarationWhereApplyingChanges.getBody()),
                  oldMockStatement.getCoordinates().replace()));

我的问题:

使用 OpenRewrite 用多个语句替换一个语句的正确方法是什么? 有例子吗?

openrewrite
1个回答
0
投票

从概念上讲,您将希望在层次结构中的任何位置修改单个 LST 元素或将其替换为单个其他 LST 元素。当您尝试将

JavaTemplate apply(..)
的结果分配给局部变量时,最容易实现此限制:您需要将其分配给扩展 org.openrewrite.java.tree.J
some class

可以做的就是修改/扩展父块中包含的语句,或者引入一个包含两个语句的新块,然后

doAfterVisit(new RemoveUnneededBlock().getVisitor())
删除周围的大括号。

希望有帮助!也欢迎加入我们的 Slack,从文档顶部链接可以更方便地解决任何后续问题。

© www.soinside.com 2019 - 2024. All rights reserved.