码迷,mamicode.com
首页 > 编程语言 > 详细

[Javascript AST] 1. Continue: Write a simple Babel plugin

时间:2017-09-24 19:27:02      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:turn   find   pre   res   logs   variable   idt   code   src   

We want to write a Babel Plugin, which move ‘const versionRegex = /(/d+)\.(/d+)\.(/d+)/gi‘ out of function scope and put it into global scope.

Code:

function getVersion(versionString) {
 const versionRegex = /(\d+)\.(\d+)\.(\d+)/gi
 var x = /foo/.text(‘thing‘)
 const [, major, minor, patch] = versionRegex.exec(versionString)
 return {major, minor, patch}
}

 

AST:

export default function (babel) {
  const { types: t } = babel;
  
  return {
    name: "ast-transform", // not required
    visitor: {
      RegExpLiteral(path) {
        // We only want to locate 
        // const versionRegex = /(\d+)\.(\d+)\.(\d+)/gi
        // NOT
        // var x = /foo/.text(‘thing‘)
        // for versionRegex, because it is a VariableDeclarator, it has init prop
        // for /foo/, it is under MemeberExpression‘s object prop
        if(path.parentKey !== ‘init‘) {
          return;
        } 
        
        // Now we locate const versionRegex = /(\d+)\.(\d+)\.(\d+)/gi
        // we want to generate a unqi id for id
        const program = path.find(parent => parent.isProgram())
        const variableDeclarator = path.find(parent => parent.isVariableDeclarator())
        const variableDeclaration = path.find(parent => parent.isVariableDeclaration())
        const {
            node: {
                id: {name: originalName}
            }
        } = variableDeclarator
        const newName = program.scope.generateUidIdentifier(originalName)
        console.log(variableDeclaration)
        // rename the versionRegex
        path.scope.rename(newName.name, originalName)
        
        // move the regex out of function scope
        // create new versionRegex variable out of function scope
        // and assign the value to it
        const newVariableDeclaration = t.variableDeclaration(variableDeclaration.node.kind, [
            t.variableDeclarator(newName, path.node)
        ])
        program.node.body.unshift(newVariableDeclaration)
        // last remove the old one
        variableDeclarator.remove()

        
      }
    }
  };
}

 

 

 

[Javascript AST] 1. Continue: Write a simple Babel plugin

标签:turn   find   pre   res   logs   variable   idt   code   src   

原文地址:http://www.cnblogs.com/Answer1215/p/7583317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!