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


    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()
    
            
          }
        }
      };
    }

  • 相关阅读:
    windows live sync, mesh, skydrive
    忘记SQL SERVER密码的解决
    处理ObjectDataSource调用中DAL层中的异常
    C#中获取应用程序路径的方法(集合)
    datatable复制一行数据到本表
    [Yii Framework] yii中如何在查询的时候使用数据库函数
    [Yii Framework] yii的路由配置
    [Yii Framework] 已经定义的命名空间常量
    [Yii Framework] yii中关于filter
    [Yii Framework] yii中如何不加载layout
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7583317.html
Copyright © 2020-2023  润新知