Замена различных видов функциональных узлов на babel - PullRequest
0 голосов
/ 25 июня 2018

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

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

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

  • как часть объявления переменной
  • как часть AssignmentExpression
  • Как анонимная функция, переданная другой функции

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

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

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

С уважением

1 Ответ

0 голосов
/ 25 июня 2018

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

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

...