2016-01-27 51 views
1
struct Foo{ 
    Bar get(){ 
    } 
} 

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

例如,您决定get对于名称来说是一个很差的选择,但您已经在许多不同的文件中使用过它,并且手动更改偶发事件非常烦人。重构类型,函数和变量名称的工具?

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

有什么为d,以帮助类型,函数,变量等重构的名字呢?

+0

也许[Visual D](http://rainers.github.io/visuald/visuald/StartPage.html)可以提供帮助。 – sigod

+0

如果我没记错的话,使用D语言插件的MonoDevelop可以做一些像这样的基本重构。 – Kozzi11

+0

@sigod可能应该说我在linux上。 –

回答

2

这里是我如何做到这一点:

  1. 变化定义
  2. 重新编译
  3. 转到报告的第一个错误行和名称替换旧与新
  4. 转到2

这是半手动的,但我觉得它很容易,而且它很快,因为编译器的错误信息会带给你正确的权利如果你需要,大多数编辑人员可以很好地阅读这些错误信息,以便将你转移到正确的线上,然后告诉它再次重复最后的替换是一件简单的事情。 (在我的vim设置与我的热键,我打F4为下一个错误信息,然后点了重复上次改变,直到它完成。即使有一百个使用功能可在几分钟可靠*改变。)

您可以编写一个脚本,通过在编译器的输出中查找“:Error:”,提取文件/行号,并在其中运行纯文本替换,自动处理90%的案例。如果单词只在字符串文字中出现一次,您可以自动替换它,如果不是,请用户手动处理剩下的10%的案例。

但我觉得用我的编辑器热键很容易,我从来没有费心尝试编写它。

  • 的一个情况下,这不赶是,如果有与可能仍然编译同名的另一个功能。如果你单独进行这种更改,那么这种情况绝不会发生,因为如果没有它,模糊名称将无法编译。

在这种情况下,你很可能做一个三步编译器辅助的变化:

  1. 确保您的代码之前编译。然后将@disable添加到您要重命名的内容。
  2. 编译。每个地方都会抱怨它无法使用,因此无法进行查找/替换。
  3. 删除@disable并重命名该定义。再次重新编译,以确保没有任何错过子类(编译器会抱怨“方法foo没有覆盖任何函数”,所以它们也是正确的。

所以是的,它不是完全自动化的,但只是改变它,并具有编译器错误帮助找到剩下的就是对我不够好。

1

一些有限的重构支持可以在主要IDE插件,像单-d或VisualD被发现。我记得Brian Schott曾计划通过增加对dsymbol的依赖来为其dfix工具添加类似的功能,但似乎尚未实现。

没有,但是,所有的这些选择确实是非常有限的鲁棒性的现在。这是因为找出任何给定符号的完全限定名是D中非常复杂的任务,需要完全正确地完成语义分析。考虑一下本地导入,模板,函数重载,混入以及它如何影响识别符号。

从长远来看这是很肯定的是,我们需要等待参考d编译器前端可用之前的库来实现清洁,真正可靠的方式,例如重构工具。

1

一个好的找到所有特征可以不是,正如前面所提到的一个坏重构更好,需要的语义。

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

enter image description here

它的快速处理结果。

相关问题