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

D 重构类型、函数和变量名称的工具?,d,D,例如,您认为get是一个非常糟糕的名称选择,但您已经在许多不同的文件中使用过它,手动更改任何出现的名称都是非常烦人的 您也不能真正进行全局替换,因为其他类型也可能有一个名为get的方法 D是否有任何东西可以帮助重构类型、函数、变量等的名称?一些有限的重构支持可以在主要的IDE插件(如Mono-D或VisualD)中找到。我记得Brian Schott曾计划通过添加对的依赖来为他的工具添加类似的功能,但似乎还没有实现 然而,并不是说所有这些选择目前确实具有非常有限的稳健性。这是因为在D中,计算任何

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

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


D是否有任何东西可以帮助重构类型、函数、变量等的名称?

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

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


从长远来看,在引用D编译器前端成为一个库之前,我们肯定需要等待,以便以干净可靠的方式实现这种重构工具。

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

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

从长远来看,在引用D编译器前端成为一个库之前,我们肯定需要等待,以便以干净、真正可靠的方式实现这种重构工具。

我是这样做的:

  • 更改定义中的名称
  • 重新编译
  • 转到报告的第一个错误行,并将旧的替换为新的
  • 转到2
  • 这是半手动的,但我发现它非常简单,而且运行速度很快,因为编译器错误消息会将您带到需要的位置,并且大多数编辑器可以很好地读取这些错误消息,将您转储到正确的行中,然后只需告诉它再次重复上一次替换即可。(在我的vim设置和热键中,我点击F4查看下一条错误消息,然后点击点重复上一次更改,直到完成为止。即使是一个有100次使用的函数也可以在几分钟内可靠地更改。)

    通过在编译器的输出中查找“:Error:”,提取文件/行号,并在那里运行纯文本替换,您可能也可以编写一个自动处理90%情况的脚本。如果单词只出现一次并且在字符串文本之外,您可以自动替换它,如果没有,请用户手动处理剩余的10%的大小写

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

    • 有一种情况是,如果还有另一个同名函数可能仍在编译,那么这种情况就不会发生。如果单独进行此更改,则永远不会发生这种情况,因为没有它,就无法编译不明确的名称
    在这种情况下,您可能需要执行三步编译器辅助更改:

  • 确保您的代码在编译之前完成。然后将
    @disable
    添加到要重命名的对象
  • 编译。每一个它抱怨它被禁用而无法使用的地方,都要进行查找/替换
  • 删除
    @禁用
    并重命名定义。再次重新编译以确保没有像子类那样遗漏任何内容(编译器随后会抱怨“method foo未重写任何函数”,因此它们也会很突出
  • 所以,是的,它不是完全自动化的,但对我来说,只要更改它并让编译器错误帮助查找剩下的内容就足够了。

    我是这样做的:

  • 更改定义中的名称
  • 重新编译
  • 转到报告的第一个错误行,并将旧的替换为新的
  • 转到2
  • 这是半手动的,但我发现它非常简单,而且运行速度很快,因为编译器错误消息会将您带到需要的位置,并且大多数编辑器可以很好地读取这些错误消息,将您转储到正确的行中,然后只需告诉它再次重复上一次替换即可。(在我的vim设置和热键中,我点击F4查看下一条错误消息,然后点击点重复上一次更改,直到完成为止。即使是一个有100次使用的函数也可以在几分钟内可靠地更改。)

    您也可以编写一个脚本来自动处理90%的案例,只需查找“:Error:”在编译器的输出中,提取文件/行号,并在那里运行纯文本替换。如果单词只出现一次,并且在字符串文本之外,您可以自动替换它,如果没有,请用户手动处理剩余的10%的大小写

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

    • 有一种情况是,如果有另一个同名的函数仍然可以编译,那么这种情况就不会发生。如果单独进行此更改,那么这种情况就永远不会发生,因为如果没有它,模棱两可的名称将无法编译
    在这种情况下,您可能需要执行三步编译器辅助更改:

  • 确保您的代码在之前已编译。然后将
    @disable
    添加到要重命名的对象
  • 编译。每一个它抱怨它因为被禁用而无法使用的地方,进行查找/替换
  • 删除
    @dis
    
    struct Foo{
        Bar get(){
        }
    }
    
    auto f = Foo();
    f.get();