intellij idea 结构搜索和替换 - 查找调用 api 的所有方法

intellij idea structural search and replace - find all methods that call an api

我试图在调用特定静态 api 的大型 java 项目中找到所有方法,然后为这些方法添加注释。

方法可以有任意的复杂度。可以是简单的MyAPI.method("foo");,也可以是try(Int result = MyAPI.AnotherMethod("foo")) { }。它可以嵌套在代码块内、lambda 表达式中的任何位置。

我能创造的最好的是:

class $_1$ { 
  $ReturnType$ $Method$ /* count 1 to inf */ ($ParameterType$ $Parameter$ /* count 0 to inf */)
  {
    $stmt1$; /* count 0 to inf */
    MyAPI.$MethoddCall$($param$ /* count 0 to inf */);
    $stmt2$; /* count 0 to inf */
  }
}

这找到了一些用法,但一般只是最简单的一种。在下面的示例 class 中,它仅找到 usage1 (a,b,c) 和 usage5。其他例子略过。甚至可以编写这样的一般搜索,还是我需要针对所有可能的情况对其进行调整?

关键是,api 被用在数以千计的方法中,每个方法都必须进行注释,所以我正在寻找任何可以让我不必手动完成的方法.最坏的情况下,我会试试 awk 的运气,但这会弄乱我们正在使用的疯狂 CVS,所以我更喜欢 Idea 解决方案。

举个例子:

import java.io.PrintWriter;

public class SearchAndReplaceTest
{
    private static class MyAPI
    {
        public static void foo(String x)
        {}

        public static  int bar(String x)
        {
            return 1;
        }

        public static  int baz(String x, int y)
        {
            return 1;
        }

        public static PrintWriter guu(String x)
        {
            return null;
        }
    }


    public void usage1a()
    {
        MyAPI.foo("aaaa");
    }

    public void usage1b()
    {
        MyAPI.baz("aaaa", 1+1);
    }

    public void usage1c()
    {
        MyAPI.baz("aaaa", (1+1)-1);
    }

    private static int usage2(String xxxx) throws Exception
    {
        new String();
        if(MyAPI.bar("x") == 1)
        {}
        return 0;
    }

    private void usage3a(String xxxx) throws Exception
    {
        new String();
        if(1 == 1)
        {
            MyAPI.baz("xxx", (10+3) - 1);
        }
    }

    private void usage3b(String xxxx) throws Exception
    {
        new String();
        if(1 == 1)
        {
            MyAPI.foo("xxx");
        }
    }

    private static void usage4(String xxxx) throws Exception
    {
        new String();
        try(PrintWriter x = MyAPI.guu("x"))
        {}
        catch (Exception e){}
    }

    public void usage5()
    {
        new String();
        MyAPI.foo("aaaa");
        if(1==0)
        {}
    }
}

我已经知道怎么做了。我不必尝试利用结构搜索的功能,而只能通过脚本来搜索函数的主体。所以搜索是:

class $_1$ { 
  $ReturnType$ $Method$ ($ParameterType$ $Parameter$);
}

有这些约束:

$Parameter$ // count: [0, inf]
$Method$ // count: [1, inf], text: [x] within hierarchy, script: Method.getText().contains("MyAPI")