来自命令行的 Java 代码中的更高级别的语义搜索和替换

Higher-level, semantic search-and-replace in Java code from command-line

grepsedawkperl 等命令行工具允许执行文本搜索和替换操作。

但是,是否有任何工具 允许我从命令行在 Java 代码库中执行语义搜索和替换操作?

Eclipse IDE 让我可以轻松重命名变量、字段、方法或 class。但我希望能够从命令行执行相同的操作。

上面的重命名操作只是一个例子。我还希望能够 select 具有额外语义约束的替换文本,例如:

select使用这种任意语义约束编辑代码后,我希望能够对其进行任意转换。

所以,基本上,我需要访问代码的符号-table。

问题:

  1. 是否有适用于此类工作的现有工具,或者我必须自己构建一个?
  2. 即使我必须自己构建一个,是否存在任何工具或库至少可以为我提供 Java 代码的符号-table,我可以在其上添加我的代码自己的搜索替换和其他重构操作?

据我所知,唯一可以轻松做到这一点的工具是期待已久的 Refaster。但是,仍然无法在 Google 之外使用它。见[研究论文](http://research.google.com/pubs/pub41876.html)和status on using Refaster outside of Google.

我是 AutoRefactor, and I am very interested in implementing this feature as part of this project 的作者。如果您想提供帮助,请跟进 github 问题。

你想要的是能够根据语法查找代码,受各种语义条件的约束,然后能够用新的语法替换找到的代码。

访问符号table(范围内的符号type/scope/mentions)只是一种语义约束。您可能需要其他的,例如控制流排序(this 发生在 that 之后)和数据流到达(data produced这里 那里 消耗的)。事实上,您可能认为重要的语义条件不计其数,具体取决于语言的属性(此函数是否与该函数并行访问数据?)或您的应用程序兴趣( 这个矩阵是上三角矩阵吗?)

一般来说,您不可能拥有现成的具有所有可能感兴趣的语义条件的工具。这意味着当您发现需要时,您需要表达新的语义条件。

您可能希望得到的最好工具是

  • 了解语言语法
  • 内置了一些标准的语义属性(我的偏好是符号tables,控制和数据流分析)
  • 可以根据源代码表达源上的模式
  • 可以基于此类语义属性约束模式
  • 可以通过新的语义分析进行扩展以提供额外的属性

有一类经典工具可以执行此操作,调用 source to source program transformation systems.

我公司提供 DMS Software Reengineering Toolkit,它就是其中之一。 DMS 已被用于对多种语言进行大规模的生产转换(包括 OP 的目标:Java)。 DMS 的重写规则的形式为:

 rule <rule_name>(syntax_parameters): syntax_category =
    <match_pattern> ->  <replacement_pattern>
    if  <semantic_condition>;

您可以看到模式语言的更多细节,重写规则如下所示:DMS Rewrite Rules.

值得注意的是,重写规则代表了对树的操作。这意味着虽然它们可能看起来像文本字符串匹配,但它们 不是 。因此,尽管存在任何空白问题,重写规则仍然匹配(在 DMS 的情况下,即使数字基数或字符串转义存在差异)。这使得 DMS 模式匹配比正则表达式更有效,并且更容易编写,因为您不必担心这些问题。

这个 Software Recommendations link 展示了如何使用 DMS 定义规则,并且(根据 OP 的要求)"run them from the command line":这不像 运行 SED 那样简洁,但是它随后正在执行更复杂的任务。

DMS 有一个Java 前面带有符号tables,控制和数据流分析。如果需要额外的语义分析,可以使用 DMS 的底层编程语言对其进行编码。