Как мне искать в некоторых файлах случаи, когда определенная функция вызывается с ее необязательными аргументами? - PullRequest
3 голосов
/ 10 декабря 2011

Я хочу найти каталог файлов, чтобы найти все случаи, когда часто используемая функция dojo.map вызывается с ее необязательным четвертым параметром.

Я хочу найти такие вещи, как

map(an_array, a_function_by_name, x, fourth_arg);

или с помощью встроенной функции:

map(an_array, function(item, i, arr){
    //anything
}, x, fourth_arg);

Я не хочу находить случаи без четвертого необязательного аргумента. Эта функция оченьчасто встречается в базе кода, и мне нужно было бы пройтись по сотням ложных срабатываний, чтобы найти те случаи, которые мне действительно нужныэтого достаточно, поскольку второй аргумент является функцией, то есть он может не только занимать несколько строк, но также может содержать произвольный код Javascript внутри.


Какой самый эффективный способ найти все случаикогда функция вызывается со всеми четырьмя аргументами? Я на машине с Linux и не возражаю против установки небольшого инструмента для этого, если это окажется самым простым решением.

Ответы [ 4 ]

5 голосов
/ 23 декабря 2011

Вот один подход высокого уровня:

  1. Разобрать JavaScript в AST. Если вы используете такой инструмент, как Antlr , , существует грамматика JavaScript , которую вы можете использовать для создания своего дерева.
  2. Пройдите по AST, найдите вызовы функций, которые используют идентификатор map, и проверьте, сколько аргументов передано в вызов.

Это, конечно, имеет свои ограничения:

  1. Он не сообщит вам, вызывается ли функция Dojo map, только то, что используется ссылка на функцию с именем map.
  2. Не найдутся случаи, когда map вызывается через "динамическое связывание". Другими словами, хотя это вызов map, он не будет найден: window['map'](foo, bar, baz, bah);.

Возможно, этого достаточно для ваших нужд, несмотря на эти ограничения.

1 голос
/ 26 декабря 2011

Вы можете изменить функцию dojo.map и добавить несколько строк, которые будут возвращать вам arguments.caller, это будет функция, которая вызвала map.Если вы также проверите внутри функции карты, сколько параметров она имеет, используя arguments[], вы можете console.log(arguments.caller) только тогда, когда arguments[0] && arguments[0].

Надеюсь, это поможет.

0 голосов
/ 30 декабря 2011

Извините, если я ошибаюсь, я сам не очень хорошо использую RegExes. Также не проверял, просто говорю, что приходит мне в голову. ;)

Тем не менее, вы рассматривали вопрос о том, чтобы сделать RegEx "неуклюжим", как показано ниже?

map(.*?,(.*?|function\([^)]\{.*?\}),.*?,.*?)

Возможно, вы захотите проверить правильный синтаксис для этого ... но AFAIK, делающий RegEx "несмешным", должен заставить его получать как можно больше для повторяющихся символов, которые совпадают. Это, конечно, также означает, что, например, параметры 1 или 3 могут содержать дополнительную запятую, если число параметров увеличивается до 5 или более, что в данном случае маловероятно.

Может быть, это обходной путь для проблемы вложенности? Может быть, я изменил это, и это на самом деле называется "жадный" ..? Прошло много времени с тех пор, как я работал с RegExes.

Помощь любого эксперта по этому вопросу очень ценится, поэтому я тоже могу чему-то научиться! ; D

0 голосов
/ 30 декабря 2011

Не знаю, сработает ли это;не проверял, просто снимал с моего бедра прямо перед уходом с работы! : -)

Не могли бы вы (временно) удалить четвертый параметр из сигнатуры функции, а затем использовать компилятор Javascript в каталоге, чтобы увидетьперерывы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...