《GoGoCode实战》一口气学会30个AST代码替换技巧搞定变量?怎么批量替换?如何插入空格?不生效怎么替换呢?我的匹配有什么问题?……于是小姐姐连夜整理出了30个代码替换技巧,让大家一口气学会!学不会也没关系,欢迎加群手袋堂~钉钉群:34266233;qq群:735216094Github:https://github.com/thx/gogocode新项目求star支持o(_////▽////_)q官网:gogocode.io基础类型获取与操作01.获取变量//获取所有变量$(code).find('$_$').each(item=>{console.log(item.match)})//变量名列表$(code).find('列表')02。修改一个变量值//获取fetch变量并将其变量名改为requestconstres=$(`constfetch=()=>{};constnoChange='fetch'`).find('fetch').each(item=>{item.attr('name','request')//任何节点属性都可以通过attr获取或修改}).root().generate()03.获取字符串//获取所有字符串$(code).find(`'$_$'`).each(item=>{console.log(item.match)})//获取确定的字符串'list/get'$(code).find(`'getList'`).each(item=>{console.log(item.node)})04。获取赋值语句//赋值(Assignment)和定义(Declaration)语句需要区分//获取所有赋值语句$(code).find(`$_$1=$_$2`).each(item=>{console.log(item.match[1])console.log(item.match[2])})//获取要列表的赋值语句$(code).find('list=$_$').each(item=>{console.log(item.match[0])})//获取car对象中color属性的赋值语句$(code).find('car.color=$_$')//获取任意对象中color属性的赋值语句$(code).find('$_$1.color=$_$2')//获取[1,2]赋值的变量名$(code).find('$_$=[1,2]')05。获取定义语句//获取所有的定义语句,包括变量定义和函数定义$(code).find(`var$_$1=$_$2`)//获取list的定义语句$(code).find([`varlist=$_$`,`letlist=$_$`,`constlist=$_$`])06.在某个角色中获取域中的变量定义//找到create函数,获取里面的类型变量定义$(code).find('function()create(){}').find('lettype=$_$')//找到create函数返回全局获取类型变量定义或进行其他操作$(code).find('function()create(){}').each(item=>{}).root()//返回Global.find('lettype=$_$')07.获取类定义//获取所有类定义$(code).find(`class$_${}`)//获取Car类的定义$(code).find(`classCar{}`)//获取具有颜色大小属性的Car类的类定义$(code).find(`classCar{color=$_$csize=$_$s}`).each(item=>{item.match['c']item.match['s']})08。gettstypedefinition//获取类型定义为CheckBoxProps的语句$(code).find('CheckBoxProps')//可以是变量名,也可以是类型定义。each(item=>{if(item.parent().node.type=='TSTypeReference'){//判断其父节点是一个类型定义TSTypeReference,并且找到}})//获取变量定义类型CheckBoxProps$(code).find('let$_$1:CheckBoxProps=$_$2').each(item=>{item.match[1]//变量名item.match[2]//变量值})//获取CheckBoxProps类型入参的箭头函数*$(code).find('($_$:CheckBoxProps)=>{}').each(item=>{item.match//入参item.node//箭头函数完整节点})函数相关的获取和操作10.获取函数定义$(code).find(`function$_$(){}`).each(item=>{item.match[0]//函数名item.node//函数完整节点})//获取箭头函数$(code).find(`()=>{}`)//获取入参的箭头函数$(code)containstype.find(`(type)=>{}`)11.获取由函数名决定的函数内容方法一:使用$_$通配符,AST实例的match属性得到$(code).find(`functiongreet(){$_$}`).each(item=>{item.match[0][0].value//函数内容item.match[0][0].node//函数内容对应的ast节点})方法二:使用attr()获取函数节点的子节点$(code).find(`functiongreet(){}`).each(item=>{$(item.attr('body')).generate()//函数内容item.attr('body')//对应的ast节点functioncontent})12.GetFunctioncontainingastatement//Method1:selectortogetthefunction$(code)containingthis.requester.find(`function$_$(){this.requester}`)//方法2:得到所有函数后判断里面是否包含this.requester$(code).find(`function$_$(){}`).each(item=>{if(item.has('this.requester')){//判断节点是否包含this.requester}})13.获取函数调用//获取所有函数调用$(code).find('$_$()').each(item=>{item.match//函数名item.node//函数对应的ast节点item.attr('arguments')//调用函数的入参})//得到这个调用的函数$(code).find('this.$_$()')//获取创建函数的调用$(code).find('create()')14.修改函数入参alert({type:'error',content:'Pleasefillintherequireditems',done:()=>{}})//扁平化alert函数调用的type和content入参$(代码).replace(`alert({type:$_$1,done:$_$3,content:$_$2})`,`alert($_$1,$_$2,$_$3)`)//alert函数调用中的输入参数Insertthis$(code)atthefront.replace(`alert($$$)`,`alert(this,$$$)`)15.按照原来的节点结构构造一个新节点//还是那个类型即调用alert函数,内容输入参数铺垫本例:alert({type:'error',content:'请填写必填项',done:()=>{}})$(code).find(`alert({type:$_$1,content:$_$2,done:$_$3})`).each(item=>{consttypeValue=item.match[1][0].value,contentValue=item.match[2][0].value,doneValue=item.match[3][0].valueitem.replaceBy($(`alert(${typeValue},${contentValue},${doneValue})`))})对象和Attribute相关的获取和操作16.获取对象属性//获取对象内部名为greet的函数$(code).find(`greet(){}`).each(item=>{item.node//greet方法项.parent(1).node//greet方法的外部对象})//获取对象内部名为greet的属性$(code).find(`greet:$_$`)17.获取对象//获取包含属性对象的颜色$(code).find(`{color:$_$}`).each(item=>{item.node//包含颜色属性的对象item.match//valueofcolor})//获取包含颜色,且颜色为Greenobject$(code).find(`{color:'green'}`)//获取包含init(){}成员函数的对象$(code).find(`{init(){}}`)//获取名为car的对象$(code).find(`constcar=$_$`).each(item=>{//item.match为通配符匹配的节点if(item.match[0][0].node.type=='ObjectExpression'){//找到分配汽车的节点,判断是否为对象类型}})18.修改对象中的属性constcode=Page({onShow(){},data:{}})//改变要渲染的Page第一个入参中的onShow函数的名称//方法一:其中$$$1和$$$2代表rest的意思,capture其余的不会改变$(code).replace(`Page({onShow(){$$$1},$$$2})`,`Page({render(){$$$1},$$$2})`)//方法二:使用match改变子节点属性$(code).find(`Page({$_$(){}})`).each(item=>{if(item.match[0][0].value=='onShow'){item.match[0][0].node.name='render'}})19.有条件地修改对象的一个??属性的值constmap={input:'textarea'}//只有map中有映射时才修改constres=$(`constcomponentList=[{index:1,component:'input'},{索引:2,组件:'收音机'},{索引:3,组件:'复选框'}]`)。替换('组件:$_$',(匹配=>{如果(地图[匹配[0][0].value]){return`component:${map[match[0][0].value]}`}else{return'component:$_$'}})).generate()20.在对象中Insert一个新的属性Page({onShow(){},data:{}})//Insertinit(){this.data={}}到Page的第一个参数对象中。方法一:$(代码)。replace(`Page({$$$2})`,`Page({init(){this.data={}},$$$2})`)//方法二:使用append$(code).find(`Page({})`).each(item=>{$(item.attr('arguments.0')).append('properties',`init(){}`)//页面参数[0]是第一个输入对象,通过attr获取到这个节点后,使用$()将其转化为AST实例。//后续操作可以链式调用,append的第一个参数为第二个参数指定插入位置}).root().generate()importexport相关的获取和操作21.获取importexport语句//获取所有import语句//包括importxfrom'xx';从'xx'导入{x};import'xx'$(code).find(`import$_$1from'$_$2'`)//第二个通配符需要用引号括起来,因为import语句要求source必须是字符串//异步匹配import,如import('@source/package/index').then()$(code).find(`import($_$)`)//匹配ExportNameDeclaration语句$(code).find(`export$_$from'@path/sth'`)//匹配ExportAllDeclaration语句$(code).find(`export*from'@path/sth'`)22.获取import语句并修改source//获取模块路径为'bb/bb-plugin'的import语句改为'gogocode'$(code).replace(`import$_$from'bb/bb-plugin'`,`import$_$from'gogocode'`)//获取模块路径包含'bb/...'的import语句,改成bb/gogocode/...$(code).find(`import$_$1from'$_$2'`).each(item=>{constsource=item.match[2][0].value;item.match[2][0].node.value=source.replace('bb/','bb/gogocode/');})//源代码://import{useContext,userLogger}from'@as/mdw-hk'//更改代码中@as/mdw-hk引入的useContext模块的名称useFContext$(code).replace(`import{useContext,$$$}from'@as/mdw-hk'`,`import{useFContext,$$$}from'@as/mdw-hk'`)//$$$表示restjsx标签相关操作23.修改jsx标签名//jsx内容:
