问题 我可以自动重构整个java项目并将大写方法参数重命名为小写吗?


我正在一个java项目中,其中很大一部分代码是用我不喜欢的格式化样式编写的(并且也是非标准的),即所有方法参数都是大写的(以及所有局部变量)。

在IntellJ上我可以使用“分析 - >检查代码”并实际查找所有出现的大写方法参数(超过1000)。

要解决一个问题,我可以做“重构>重命名参数”,它工作正常(让我们假设没有重叠)。

有没有办法自动执行这个重构(例如:重命名方法参数从大写开始到以小写字母开头的同名)?


5554
2017-10-01 12:07


起源

什么OS?听起来像sed / awk的工作 - sje397
我认为操作系统在这里并不重要。我需要的是一个“java结构”替换和sed / awk并不是真正理想的。 - krico
鉴于这种相对不寻常的要求,他们可能只是。 - musiKk
不,我不同意。用sed解析java就像用正则表达式解析html一样。不要这样做,得到一个理解语言的工具。 - Sean Patrick Floyd
实际上,重构的批处理会很棒,但我实际上并不知道可以开箱即用的工具。 - tkr


答案:


使用源分析器

我认为你需要做的是使用像这样的源代码解析器 JavaParser类 去做这个。

对于每个java源文件,将其解析为CompilationUnit, 创建一个访客,可能使用 ModifierVisitorAdapter 作为基类,并覆盖(至少) visit(MethodDeclaration, arg)。然后将更改的CompilationUnit写入新文件并在之后执行diff。

我建议不要更改原始源文件,但创建一个影子文件树可能是一个好主意(例如旧文件: src/main/java/com/mycompany/MyClass.java, 新文件 src/main/refactored/com/mycompany/MyClass.java,这样你可以区分整个目录)。


8
2017-10-01 12:39



这是相当多的工作! - krico
当然。工作一定很复杂,因为你所有级别都有变化。我能想到的唯一合理的替代方案是编写IDE脚本。 - Sean Patrick Floyd
最后,这实际上是解决方案。到底是没有那么多代码,没有改变现有代码的格式,只有参数。 - krico


我建议你在做任何事之前考虑一些事情:

  1. 如果这是团队合作,请通知您的团队。
  2. 如果是雇主,请通知您的老板。
  3. 如果将其检入版本控制系统,请意识到你将有一些差异从wazoo出来。
  4. 如果未将其签入版本控制系统,请将其签入。
  5. 在进行任何更改之前进行备份。
  6. 在行为未发生变化之前和之后,查看是否要检查一些测试。

这是一个危险的重构。小心。


5
2017-10-01 12:23



也寻找 Class.forName  - 他们的意思是“别触摸!” - Thorbjørn Ravn Andersen
我不同意这是一个危险的重构的评论。特别是重命名方法参数是关于您可以做的最安全的重构。同意你应该告知你的团队,但是不需要仅仅重命名一个整体项目...... - romacafe
由于规模危险。我同意重命名一个变量是无害的,但是如果整个项目写得不正确,那么你错过了一些东西的可能性更大,并且整个事情都很糟糕。没有迹象表明OP计划通知任何人此举。教育和告知的机会将会丢失。但你有资格获得你的意见。 - duffymo


我不知道在IDE中开箱即用的这种重构有任何直接支持。因为大多数IDE都支持名称重构(经常使用)。您可能需要编写一些可以浏览源代码(AST)的IDE插件,并在场景后面调用重命名重构,以获得与此类格式匹配的参数名称。


0
2017-10-01 12:47





我在相当大规模的文件上做了很多这样的重构,使用TextPad或WildPad,以及一堆reg-ex replace-all。一直为我工作!

我相信,如果代码首先使用像Eclipse这样的IDE进行格式化(如果格式不正确),然后是一个涉及方法签名的注册表(范围,返回类型,名称,括号,arg列表,可以设计支架),使用这些工具可以在几秒钟内完成工作。您可能需要多个替换 - 所有reg-ex集。

唯一的计时活动是提出这样一套注册表。

希望这可以帮助!


0
2017-10-01 13:51