如果使用可选参数调用某个函数,我如何搜索某些文件?

hug*_*omg 3 javascript regex search grep

我想搜索文件目录以查找使用dojo.map其可选的第四个参数调用常用函数的所有情况.

我想找到像这样的东西

map(an_array, a_function_by_name, x, fourth_arg);
Run Code Online (Sandbox Code Playgroud)

或者使用内联函数:

map(an_array, function(item, i, arr){
    //anything
}, x, fourth_arg);
Run Code Online (Sandbox Code Playgroud)

我不想在没有第四个可选参数的情况下找到案例.这个函数在代码库中很常见,我不得不涉及数百个误报以找到我真正想要的案例

//this function also can be called with just 2 or 3 parameters
//(the second parameter can still be inline or not)

map(an_array, a_function);
map(an_array, a_function, x);
Run Code Online (Sandbox Code Playgroud)

我最初认为grep-ing是类似map([^,]*,[^,]*,[^,]*,[^,]*)但我不认为这是足够的,因为第二个参数是一个函数,这意味着它不仅可以跨越多行,而且还可以包含任意内部的Javascript代码.


使用所有四个参数调用函数时查找所有案例的最有效方法是什么?我在Linux机器上并不介意为此安装一个小工具,如果这恰好是最简单的解决方案.

Jac*_*cob 5

这是一个高级方法:

  1. 将JavaScript解析为AST.如果您使用Antlr之类的工具,可以使用JavaScript语法生成树.
  2. 遍历AST,找到使用标识符的函数调用map,并检查传递给调用的参数数量.

这当然有其局限性:

  1. 它不会告诉您Dojo map函数是否被调用,只是使用了名为的函数引用map.
  2. 它不会发现map通过"动态绑定"调用的情况.换句话说,虽然这是一个调用map,但不会发现:window['map'](foo, bar, baz, bah);.

尽管存在这些限制,这可能足以满足您的需求.