我正在编写一个食谱 使用 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 用多个语句替换一个语句的正确方法是什么? 有例子吗?
从概念上讲,您将希望在层次结构中的任何位置修改单个 LST 元素或将其替换为单个其他 LST 元素。当您尝试将
JavaTemplate apply(..)
的结果分配给局部变量时,最容易实现此限制:您需要将其分配给扩展 org.openrewrite.java.tree.J
的 some class。
您可以做的就是修改/扩展父块中包含的语句,或者引入一个包含两个语句的新块,然后
doAfterVisit(new RemoveUnneededBlock().getVisitor())
删除周围的大括号。
希望有帮助!也欢迎加入我们的 Slack,从文档顶部链接可以更方便地解决任何后续问题。