将声明的方法名称与正则表达式匹配

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>;
}