重构类型、函数和变量名称的工具?

Tools to refactor names of types, functions and variables?

struct Foo{
    Bar get(){
    }
}

auto f = Foo();
f.get();

例如,您认为 get 是一个非常糟糕的名称选择,但您已经在许多不同的文件中使用过它并且手动更改每次出现都非常烦人。

您也不能真正进行全局替换,因为其他类型也可能有一个名为 get 的方法。

D 有什么可以帮助重构类型、函数、变量等的名称吗?

一些有限的重构支持可以在主要的 IDE 插件中找到,例如 Mono-D 或 VisualD。我记得 Brian Schott 曾计划在他的 dfix tool by adding dependency on dsymbol 中添加类似的功能,但似乎尚未实现。

然而,并非所有这些选项目前的稳健性都非常有限。这是因为在 D 中找出任何给定符号的完全限定名称是一项非常复杂的任务,需要 100% 正确地完成完整的语义分析。考虑本地导入、模板、函数重载、混合以及它们如何影响识别符号。

在漫长的 运行 中,可以肯定的是,我们需要等待参考 D 编译器前端作为一个库可用,以干净且真正可靠的方式实现此类重构工具。

这是我的做法:

  1. 更改定义中的名称
  2. 重新编译
  3. 转到报告的第一个错误行并将旧的替换为新的
  4. 转到 2

那是 semi-manual,但我发现它非常简单,而且进展很快,因为编译器错误消息会将您带到您需要的地方,而且大多数编辑器都能很好地阅读这些错误消息将您转移到正确的行上,然后告诉它再次重复上次替换是一件简单的事情。 (在我的 vim 设置中使用我的热键,我按下 F4 以获取下一条错误消息,然后点以重复上次更改直到完成。即使是具有一百次使用的功能也可以在几分钟内可靠地更改*。)

您也可以编写一个脚本来自动处理 90% 的情况,只需在编译器的输出中查找“: Error:”,提取 file/line 数字,然后 运行 一个普通的文本替换那里。如果这个词只出现一次并且在字符串文字之外,你可以自动替换它,如果没有,请用户手动处理剩下的 10% 的情况。

但我认为使用我的编辑器热键很容易,我从来没有费心尝试编写脚本。

  • 没有捕捉到的一种情况是,是否存在另一个可能仍可编译的同名函数。如果您单独进行此更改,则永远不会发生这种情况,因为如果没有它,模棱两可的名称将无法编译。

在这种情况下,您可能会进行 three-step compiler-assisted 更改:

  1. 确保你的代码之前编译。然后将 @disable 添加到您要重命名的内容中。
  2. 编译。它抱怨它因被禁用而无法使用的每个地方,请执行 find/replace.
  3. 删除 @disable 并重命名定义。再次重新编译以确保您没有像 child 类 那样遗漏任何内容(然后编译器会抱怨 "method foo does not override any function" 所以它们也很突出。

所以是的,它不是完全自动化的,但只需更改它并让编译器错误帮助找到剩下的内容对我来说就足够了。

好的 find all 功能可能比糟糕的重构更好,如前所述,重构需要语义。

就我个人而言,我在 Coedit 中有一个查找所有 功能,它显示匹配的上下文并适用于所有项目源。

处理结果的速度很快。