将声明的方法名称与正则表达式匹配
Matching declared method name to regex
我正在尝试将 Java 方法名称与正则表达式匹配,但我不确定如何在 Rascal 中进行匹配。我想匹配一个名称以 test
开头的方法(例如 JUnit 3 测试用例)并将其转换为 JUnit 4 测试用例,使用 @Test
注释并删除 test
前缀.我的代码如下所示:
public tuple[int, CompilationUnit] refactorJUnitTestCaseDeclaration(CompilationUnit cu) {
int total = 0;
println(cu);
CompilationUnit unit = visit(cu) {
case(MethodDeclaration)`public void <Identifier name>() <MethodBody body>`: {
if(/test[A-Z]*/ := name) {
total += 1;
newName = name[4..];
insert (MethodDeclaration)`@Test public void <Identifier newName>() <MethodBody body>`;
};
}
};
return <total, unit>;
}
此代码导致以下错误:
Expected str, but got Identifier
有什么方法可以将 name
方法标识符作为字符串访问,以便我可以尝试匹配它?如果没有,完成此任务的最佳方法是什么?
- 正则表达式模式运算符只想匹配字符串,因此您必须将
name
(标识符类型)的解析树映射到如下字符串:"<name>"
。
- 类似地,要将新名称字符串拼接到标识符的位置,您必须将其映射回标识符,如下所示:
[Identifier] newName
.
最终结果如下所示:
public tuple[int, CompilationUnit] refactorJUnitTestCaseDeclaration(CompilationUnit cu) {
int total = 0;
println(cu);
CompilationUnit unit = visit(cu) {
case(MethodDeclaration)`public void <Identifier name>() <MethodBody body>`: {
if(/test[A-Z]*/ := "<name>") {
total += 1;
newName = [Identifier] "<name>"[4..];
insert (MethodDeclaration)`@Test public void <Identifier newName>() <MethodBody body>`;
};
}
};
return <total, unit>;
}
也可以直接将tail out与命名组匹配:
public tuple[int, CompilationUnit] refactorJUnitTestCaseDeclaration(CompilationUnit cu) {
int total = 0;
println(cu);
CompilationUnit unit = visit(cu) {
case(MethodDeclaration)`public void <Identifier name>() <MethodBody body>`: {
if(/test<rest:[A-Z]*>/ := "<name>") {
total += 1;
newName = [Identifier] rest;
insert (MethodDeclaration)`@Test public void <Identifier newName>() <MethodBody body>`;
};
}
};
return <total, unit>;
}
我正在尝试将 Java 方法名称与正则表达式匹配,但我不确定如何在 Rascal 中进行匹配。我想匹配一个名称以 test
开头的方法(例如 JUnit 3 测试用例)并将其转换为 JUnit 4 测试用例,使用 @Test
注释并删除 test
前缀.我的代码如下所示:
public tuple[int, CompilationUnit] refactorJUnitTestCaseDeclaration(CompilationUnit cu) {
int total = 0;
println(cu);
CompilationUnit unit = visit(cu) {
case(MethodDeclaration)`public void <Identifier name>() <MethodBody body>`: {
if(/test[A-Z]*/ := name) {
total += 1;
newName = name[4..];
insert (MethodDeclaration)`@Test public void <Identifier newName>() <MethodBody body>`;
};
}
};
return <total, unit>;
}
此代码导致以下错误:
Expected str, but got Identifier
有什么方法可以将 name
方法标识符作为字符串访问,以便我可以尝试匹配它?如果没有,完成此任务的最佳方法是什么?
- 正则表达式模式运算符只想匹配字符串,因此您必须将
name
(标识符类型)的解析树映射到如下字符串:"<name>"
。 - 类似地,要将新名称字符串拼接到标识符的位置,您必须将其映射回标识符,如下所示:
[Identifier] newName
.
最终结果如下所示:
public tuple[int, CompilationUnit] refactorJUnitTestCaseDeclaration(CompilationUnit cu) {
int total = 0;
println(cu);
CompilationUnit unit = visit(cu) {
case(MethodDeclaration)`public void <Identifier name>() <MethodBody body>`: {
if(/test[A-Z]*/ := "<name>") {
total += 1;
newName = [Identifier] "<name>"[4..];
insert (MethodDeclaration)`@Test public void <Identifier newName>() <MethodBody body>`;
};
}
};
return <total, unit>;
}
也可以直接将tail out与命名组匹配:
public tuple[int, CompilationUnit] refactorJUnitTestCaseDeclaration(CompilationUnit cu) {
int total = 0;
println(cu);
CompilationUnit unit = visit(cu) {
case(MethodDeclaration)`public void <Identifier name>() <MethodBody body>`: {
if(/test<rest:[A-Z]*>/ := "<name>") {
total += 1;
newName = [Identifier] rest;
insert (MethodDeclaration)`@Test public void <Identifier newName>() <MethodBody body>`;
};
}
};
return <total, unit>;
}