2017-01-31 1 views
0

Я хочу сделать две замены в моем плагине babel. И вторая замена должна произойти только после первого.Babel plugin (шаблон для посетителей) - Как это работает

module.exports = function(babel) { 
    const t = babel.types; 
    return { 
     visitor: { 
      FunctionExpression: function(path) { 
       //Conversion to arrow functions 
       path.replaceWith(t.arrowFunctionExpression(path.node.params, path.node.body, false)); 
      }, 
      ThisExpression: function(path) { 
       //Converting all this expressions to identifiers so that it won't get translated differently 
       path.replaceWith(t.identifier("this")); 
      } 
     } 
    }; 
} 

В дереве AST моего «FunctionExpression» «ThisExpression» существует где-то вниз по дереву. Я хочу, чтобы первое преобразование произошло только после завершения второго преобразования. Как мне это достичь?

ответ

0

Я понял. Лучшее место, чтобы понять, как писать плагины babel. Here

module.exports = function(babel) { 
    const t = babel.types; 
    return { 
     visitor: { 
      FunctionExpression: { 
       enter: function(path) { 
        path.traverse(updateThisExpression); 
        //Conversion to arrow functions 
        let arrowFnNode = t.arrowFunctionExpression(path.node.params, 
         path.node.body, false); 
        path.replaceWith(arrowFnNode); 
       } 
      } 
     } 
    }; 
} 

const updateThisExpression = { 
    ThisExpression: { 
     enter: function(path) { 
      //Converting all this expressions to identifiers so that 
      //it won't get translated differently 
      path.replaceWith(t.identifier("this")); 
     } 
    } 
}; 

Вы пишете другой объект посетителя, который вы используете, чтобы пройти в «ВыражениеФункции» посетитель ..;)

Смежные вопросы