Замена различных видов функциональных узлов на babel
Я уже спрашивал об этом на вялом канале Babel пару дней назад, но я так и не получил ответа. Я создал плагин для преобразования функций в функции карри ( npm). Несмотря на мой успех в создании плагинов, у меня есть пара проблем, для которых я нашел обходной путь, но я бы предпочел упростить мою логику и, следовательно, сделать ее более надежной и надежной.
Моим первым подходом было создать посетителя для FunctionDeclaration
, Это было очень просто: разверните каждый аргумент в ArrowFunctionExpression
а затем заменить текущий узел новым FunctionDeclaration
который возвращает эти функции.
Проблема возникает, когда вы хотите иметь дело с FunctionExpression
s. Как вы, наверное, знаете, FunctionExpression
может появиться в нескольких местах AST:
- Как часть VariableDeclaration
- Как часть
AssignmentExpression
- Как анонимная функция передается другой функции
Все это действительные FunctionExpressions, которые представляют проблему: я заменял текущий узел на functionDeclaration, но, похоже, babel отказывается заменить любой из них на functionDeclaration
, Это заставило меня заменить весь родительский узел, воссоздав его. До сих пор это работало для выражений присваивания и объявлений переменных, которые содержат выражение functionExpression, но я должен воссоздать их точно, чтобы не нарушать код. Это становится сложнее, если вы хотите поддерживать больше сценариев.
Для меня идеальная ситуация состояла бы в том, чтобы просто заменить текущий узел и вообще не беспокоиться о том, где он находится, но, как я уже сказал, babel отказывается заменить текущий узел, когда он находится внутри объявления переменной.
Код можно посмотреть здесь. Примечание: я не уверен, должен ли я также публиковать код здесь, кажется, не является необходимым
С уважением
1 ответ
Наконец-то я пришел к решению. Моя первая попытка потерпела неудачу, потому что я пытался заменить FunctionExpression
с FunctionDeclaration
, который отклоняет babel, потому что он кажется несовместимым, даже если выходной код точно такой же. Создание новой функции тела с конструктором выражения функции при замене выражения функции позволило мне просто сделать node.replaceWith
вместо замены всего родителя новым узлом.
Кажется, это происходит потому, что как AssignmentExpression, так и VariableDeclarator ожидают Expression
в качестве параметра. FunctionDeclaration
не является частью этой группы (как вы можете видеть в списке псевдонимов), но FunctionExpression является. Таким образом, даже если код вывода одинаков, в терминах AST это не так.