Замена различных видов функциональных узлов на babel

Я уже спрашивал об этом на вялом канале Babel пару дней назад, но я так и не получил ответа. Я создал плагин для преобразования функций в функции карри ( npm). Несмотря на мой успех в создании плагинов, у меня есть пара проблем, для которых я нашел обходной путь, но я бы предпочел упростить мою логику и, следовательно, сделать ее более надежной и надежной.

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

Проблема возникает, когда вы хотите иметь дело с FunctionExpressions. Как вы, наверное, знаете, FunctionExpression может появиться в нескольких местах AST:

  • Как часть VariableDeclaration
  • Как часть AssignmentExpression
  • Как анонимная функция передается другой функции

Все это действительные FunctionExpressions, которые представляют проблему: я заменял текущий узел на functionDeclaration, но, похоже, babel отказывается заменить любой из них на functionDeclaration, Это заставило меня заменить весь родительский узел, воссоздав его. До сих пор это работало для выражений присваивания и объявлений переменных, которые содержат выражение functionExpression, но я должен воссоздать их точно, чтобы не нарушать код. Это становится сложнее, если вы хотите поддерживать больше сценариев.

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

Код можно посмотреть здесь. Примечание: я не уверен, должен ли я также публиковать код здесь, кажется, не является необходимым

С уважением

1 ответ

Решение

Наконец-то я пришел к решению. Моя первая попытка потерпела неудачу, потому что я пытался заменить FunctionExpression с FunctionDeclaration, который отклоняет babel, потому что он кажется несовместимым, даже если выходной код точно такой же. Создание новой функции тела с конструктором выражения функции при замене выражения функции позволило мне просто сделать node.replaceWith вместо замены всего родителя новым узлом.

Кажется, это происходит потому, что как AssignmentExpression, так и VariableDeclarator ожидают Expression в качестве параметра. FunctionDeclaration не является частью этой группы (как вы можете видеть в списке псевдонимов), но FunctionExpression является. Таким образом, даже если код вывода одинаков, в терминах AST это не так.

Другие вопросы по тегам