从命令行在 Java 代码中进行更高级别的语义搜索和替换

Har*_*rry 5 java refactoring command-line sed toolkit

grep诸如、sedawk、 和 之类的命令行工具perl允许执行文本搜索和替换操作。

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

例如,Eclipse IDE 允许我轻松地重命名变量、字段、方法或类。但我希望能够从命令行执行相同的操作。

上面的重命名操作只是一个示例。我还希望能够选择具有附加语义约束的替换文本,例如:

  • 仅 C、D 和 E 类的方法 M1、M2 的范围;
  • 仅 C 类的所有变量或字段;
  • 出现某个类变量的所有表达式;
  • 仅变量的类定义范围;
  • 仅类 C 的方法 M 的所有重写版本的范围;
  • ETC。

使用此类任意语义约束选择代码后,我希望能够对其进行任意转换。

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

问题:

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

Ira*_*ter 2

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

对符号表的访问(符号类型/范围/范围中的提及)只是一种语义约束。您可能还需要其他功能,例如控制流排序(发生在之后)和数据流到达(此处生成的数据在那里被消耗)。事实上,您可能认为重要的语义条件数量无限,具体取决于语言的属性(该函数是否与该函数并行访问数据?)或您的应用程序兴趣(该矩阵是上三角矩阵吗?)

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

您可能希望最好的工具是

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

有一个经典的工具可以做到这一点,即调用源程序到源程序的转换系统。

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

 rule <rule_name>(syntax_parameters): syntax_category =
    <match_pattern> ->  <replacement_pattern>
    if  <semantic_condition>;
Run Code Online (Sandbox Code Playgroud)

您可以看到模式语言和重写规则的更多详细信息,如下所示:DMS 重写规则

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

软件推荐链接显示了如何使用 DMS 定义规则,以及(根据 OP 的请求)“从命令行运行它们”:这不像运行 SED 那样简洁,但它正在执行更复杂的任务。

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