来自命令行的 Java 代码中的更高级别的语义搜索和替换
Higher-level, semantic search-and-replace in Java code from command-line
grep
、sed
、awk
和 perl
等命令行工具允许执行文本搜索和替换操作。
但是,是否有任何工具 允许我从命令行在 Java 代码库中执行语义搜索和替换操作?
Eclipse IDE 让我可以轻松重命名变量、字段、方法或 class。但我希望能够从命令行执行相同的操作。
上面的重命名操作只是一个例子。我还希望能够 select 具有额外语义约束的替换文本,例如:
- 仅 classes C、D 和 E 的方法 M1、M2 的范围;
- 仅classC的所有变量或字段;
- 出现class变量的所有表达式;
- 只在class定义的范围内定义一个变量;
- 只有 class C 的方法 M 的所有覆盖版本的范围;
- 等等
select使用这种任意语义约束编辑代码后,我希望能够对其进行任意转换。
所以,基本上,我需要访问代码的符号-table。
问题:
- 是否有适用于此类工作的现有工具,或者我必须自己构建一个?
- 即使我必须自己构建一个,是否存在任何工具或库至少可以为我提供 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 的底层编程语言对其进行编码。
grep
、sed
、awk
和 perl
等命令行工具允许执行文本搜索和替换操作。
但是,是否有任何工具 允许我从命令行在 Java 代码库中执行语义搜索和替换操作?
Eclipse IDE 让我可以轻松重命名变量、字段、方法或 class。但我希望能够从命令行执行相同的操作。
上面的重命名操作只是一个例子。我还希望能够 select 具有额外语义约束的替换文本,例如:
- 仅 classes C、D 和 E 的方法 M1、M2 的范围;
- 仅classC的所有变量或字段;
- 出现class变量的所有表达式;
- 只在class定义的范围内定义一个变量;
- 只有 class C 的方法 M 的所有覆盖版本的范围;
- 等等
select使用这种任意语义约束编辑代码后,我希望能够对其进行任意转换。
所以,基本上,我需要访问代码的符号-table。
问题:
- 是否有适用于此类工作的现有工具,或者我必须自己构建一个?
- 即使我必须自己构建一个,是否存在任何工具或库至少可以为我提供 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 的底层编程语言对其进行编码。