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

时间:2016-01-27 12:47:57

标签: d

struct Foo{
    Bar get(){
    }
}

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

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

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

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

3 个答案:

答案 0 :(得分:2)

以下是我的表现方式:

  1. 更改定义中的名称
  2. 重新编译
  3. 转到报告的第一个错误行,并用新的
  4. 替换旧的
  5. 转到2
  6. 这是半手册,但我发现它非常简单,并且很快就会发生,因为编译器错误消息会将您带到正确的位置,并且大多数编辑都可以很好地阅读这些错误消息把你转移到正确的路线上,然后告诉它再次重复最后一次更换是一件简单的事情。 (在我使用我的热键进行的vim设置中,我点击了F4以获取下一条错误消息,然后点击重复上一次更改直到完成。即使是具有一百次使用的功能也可以在几分钟内可靠地更改。)

    你可以编写一个脚本,通过查找"来自动处理90%的案例:错误:"在编译器的输出中,提取文件/行号,并在那里运行纯文本替换。如果单词只显示一次并且在字符串文字之外,则可以自动替换它,如果没有,请让用户手动处理剩余的10%的情况。

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

    • 这个没有捕获的一个案例是,是否有另一个具有相同名称的函数仍然可以编译。如果你单独进行这种改变就不会发生这种情况,因为没有它就会编译一个含糊不清的名称。

    在这种情况下,您可以执行三步编译器辅助更改:

    1. 确保您的代码之前已编译。然后将@disable添加到要重命名的内容中。
    2. 编译。每个地方都抱怨它无法使用,无法进行查找/替换。
    3. 删除@disable并重命名定义。再次重新编译,以确保你没有错过像子类一样(编译器会抱怨"方法foo不会覆盖任何函数"所以他们也站出来。
    4. 所以是的,它不是完全自动化的,但只是改变它并且编译错误有助于找到对我来说足够好的东西。

答案 1 :(得分:1)

在主要的IDE插件(如Mono-D或VisualD)中可以找到一些有限的重构支持。我记得Brian Schott计划通过添加对dfix的依赖来为他的dsymbol工具添加类似的功能,但它似乎还没有实现。

然而,

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

从长远来看,我们需要等待参考D编译器前端变得可用作库,以便以干净和真正可靠的方式实现这样的重构工具。

答案 2 :(得分:1)

一个好的找到所有功能可能比一个糟糕的重构更好,如前所述,这个重构需要语义。

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

enter image description here

处理结果很快。