首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS:为重构重命名变量(使用AST而不是文本)

JS:为重构重命名变量(使用AST而不是文本)
EN

Stack Overflow用户
提问于 2013-10-31 15:24:16
回答 3查看 3.5K关注 0票数 4

在重构代码时,我经常需要重命名变量,目前我使用regexs以一种有点麻烦的方式进行重命名--最后,由于缺乏实际的结构,我不得不拿出一些愚蠢的文本解决方案,例如,将“req”重命名为“request”,并避免类似名称“require”的副作用。

想一想:这有点像用regexs修改DOM :它只是不起作用。

我了解了AST和Esprima等代码结构修改工具。是否有重新命名变量、Esprima或其他的工具?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-14 10:27:21

1. grasp.js

看起来http://graspjs.com/就是这样做的。

代码语言:javascript
复制
grasp selector --replace replacement file.js

例如,将'el‘重命名为'element':

代码语言:javascript
复制
grasp '#el' --replace 'element' index.js

官方的grasp.replace文档。

2. vscode

Visual Studio代码还包括一个真正的替换工具。只需右键单击一个令牌并选择重命名符号

票数 4
EN

Stack Overflow用户

发布于 2019-11-07 13:58:01

我知道你一直要求‘一个工具’,但我认为最好只是使用esprima本身和各种通用工具之上的esprima,并滚动您自己的重命名。因为这真的很容易,然后你就有了更多的控制。这里是一个完整的例子,只有12行代码。它使用escodegen和estraverse,都在github上,就我所能看到的与esprima一起使用的“标准”而言。esprima本质上给出了解析函数字符串->抽象语法树,escodegen本质上给出了它的反向,即抽象语法树->字符串。并用导线法“行走树”,从而帮助分析或修改它。

在这里,代码:

代码语言:javascript
复制
function rename(code, renamingObj){
    var ast = esprima.parse(code);
    function callback(node){
        if (node.type==='Identifier') {
            if (node.name in renamingObj){
                node.name = renamingObj[node.name];
            }
        }
    }
    estraverse.traverse(ast, { enter: callback });
    return escodegen.generate(ast);
}

Testcase:

代码语言:javascript
复制
function blah(x,y){
    var difference = x + y;
    var product    = x - y;
    var sum        = x * y;
    return 42;
}
var renamingObj = {
    sum        : 'product',
    difference : 'sum',
    product    : 'difference'
};

运行它:

代码语言:javascript
复制
rename(blah.toString(), renamingObj)

产出:

代码语言:javascript
复制
function blah(x, y) {
    var sum = x + y;
    var difference = x - y;
    var product = x * y;
    return 42;
}

我想说的是,如果您有什么特别的事情要做,那么修改上面的代码比筛选一些工具文档更容易。

票数 1
EN

Stack Overflow用户

发布于 2013-10-31 16:20:49

我们的JavaScript格式化程序/模糊处理程序将可靠地做到这一点。它解析JavaScript,构建AST,或者打印漂亮的版本,或者打印丑陋的(模糊的)版本。(他们在一起的原因是因为漂亮和丑陋是同一枚硬币的反面!)

它所做的事情之一是置乱(整个)标识符名。通过使用AST,它只重命名“整个标识符”;它不会将"req“与"require”混淆,也不会意外地修改字符串或注释内容。

您可以告诉它构建一个包含所有标识符名称的映射,然后将它们全部重命名;只更改一个,就可以获得重命名效果。标识符映射如下所示:

代码语言:javascript
复制
    x ->  y
    p -> q
    ...

将x重命名为y、p到q等。您希望:

代码语言:javascript
复制
    x -> x
    p -> q
    ...

要将p改为q,很容易生成身份地图作为您的起点。

我不认为这很方便,但确实有效。显然它不知道任何关于范围的事情。(总有一天!)

详情请看我的简历。许多版主讨厌工具问题,当我提供一个工具答案时,他们似乎特别不喜欢它,其中包括工具的链接。所以你得自己找出链接,抱歉。(如果你认为这是愚蠢的,请向Meta抱怨)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19710494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档