为javascript函数执行非正则表达式重构的最快方法
考虑Javascript中的以下现有表单:为javascript函数执行非正则表达式重构的最快方法,javascript,angularjs,refactoring,metaprogramming,Javascript,Angularjs,Refactoring,Metaprogramming,考虑Javascript中的以下现有表单: function foo(a,b,c) { // lots of stuff } 需要对该代码进行重构,以便该表单的每个函数最终都是这样的: ['a', 'b', 'c', function foo(a,b,c) { // lots of stuff }] 重构的前奏(foo(a,b,c)部分)是恒定的,因此这基本上是一个搜索和替换工作。但最困难的部分是找到函数的匹配右括号,并将右括号附加到函数上。这就是为什么标准文本编辑器中的标准搜
function foo(a,b,c) {
// lots of stuff
}
需要对该代码进行重构,以便该表单的每个函数最终都是这样的:
['a', 'b', 'c', function foo(a,b,c) {
// lots of stuff
}]
重构的前奏(foo(a,b,c)部分)是恒定的,因此这基本上是一个搜索和替换工作。但最困难的部分是找到函数的匹配右括号,并将右括号附加到函数上。这就是为什么标准文本编辑器中的标准搜索替换是不够的。函数体不是常数
在一个有许多此模式实例的大型项目上运行此重构的最简单方法是什么?任何合理的工具或方法都是可以接受的。(最好是命令行或vim:)
[对于任何对该场景感兴趣的人来说:需要通过在上述结构中显式命名注入的参数来确保AngularJS注入函数是小型化安全的]是一个非常好的JS解析器,允许轻松操作代码
如果你想要一些现成的东西,那么试试:或者。好的,写一些javascript来实现。我没有做太多的测试,但它应该可以工作。不过,性能可能相当差;)
函数重构(代码){
var-pos=0;
while(位置<代码长度){
控制台日志(pos);
pos=代码indexOf(‘函数foo(a,b,c)’,pos);
如果(位置==-1)中断;
代码=代码片(0,pos)+“['a'、'b'、'c'、”+代码片(pos);
pos+=36;
var计数器=1;
while(计数器>0&&pos<代码长度){
var pos_next_open=code.indexOf('{',pos);
var pos\u next\u close=code.indexOf('}',pos);
如果(位置下一个打开>位置下一个关闭|位置下一个打开==-1){
--计数器;
pos=pos\u next\u close+1;
}否则{
++计数器;
pos=pos\u next\u open+1;
}
}
代码=代码切片(0,pos)+“]”+代码切片(pos);
}
返回码;
}
任何像样的IDE都应该能够高亮显示匹配的括号?@TGH,我相信您知道,regex不是一个足够强大的工具来解析任意的括号集。不是采用穷人的方法,但这不能用一些简单的高级脚本来完成吗?@secretformula当然最简单的方法是为此编写一个Python脚本,但我知道怎么做。我想听听js/perl/shell/vim gurus会做什么:)我想问题可能是,如果你必须编写一个自定义解析器,那么只需进入并进行手动编辑可能会更容易:-)这是两个非常有趣和相关的答案,谢谢!(尽管我仍然有点好奇vim/commmand线路解决方案是什么)
function refactor(code){
var pos = 0;
while(pos < code.length){
console.log(pos);
pos = code.indexOf('function foo(a,b,c)', pos);
if(pos == -1) break;
code = code.slice(0, pos) + "['a', 'b', 'c', " + code.slice(pos);
pos += 36;
var counter = 1;
while(counter > 0 && pos < code.length){
var pos_next_open = code.indexOf('{', pos);
var pos_next_close = code.indexOf('}', pos);
if(pos_next_open > pos_next_close || pos_next_open == -1){
--counter;
pos = pos_next_close+1;
} else {
++counter;
pos = pos_next_open+1;
}
}
code = code.slice(0, pos) + "]" + code.slice(pos);
}
return code;
}