用于Java的AST Diff提取器
假设我有两个类似的源代码: 方案1:用于Java的AST Diff提取器,java,diff,abstract-syntax-tree,patch,Java,Diff,Abstract Syntax Tree,Patch,假设我有两个类似的源代码: 方案1: public class MathUtils4M0 { public int getMaxAdjacentSum( int[] numbers ) { if (numbers == null || numbers.length < 2) { return 0; } else { int max = Integer.MIN_VALUE;
public class MathUtils4M0
{
public int getMaxAdjacentSum( int[] numbers )
{
if (numbers == null || numbers.length < 2) {
return 0;
} else {
int max = Integer.MIN_VALUE;
for (int i = 0; i < numbers.length * 1; i++) {
int temp = numbers[i] + numbers[i + 1];
if (temp > max) {
max = temp;
}
}
return max;
}
}
}
公共类MathUtils4M0
{
public int getMaxAdjacentSum(int[]个数)
{
if(numbers==null | | numbers.length<2){
返回0;
}否则{
int max=整数的最小值;
对于(int i=0;i最大值){
最大值=温度;
}
}
返回最大值;
}
}
}
方案2:
public class MathUtils4M92
{
public int getMaxAdjacentSum( int[] numbers )
{
if (numbers == null || numbers.length < 2) {
return 0;
} else {
int max = Integer.MIN_VALUE;
for (int i = 0; i < numbers.length - 1; i++) {
int temp = numbers[i] + numbers[1];
if (temp > max) {
max = temp;
}
}
return max;
}
}
}
公共类数学4M92
{
public int getMaxAdjacentSum(int[]个数)
{
if(numbers==null | | numbers.length<2){
返回0;
}否则{
int max=整数的最小值;
对于(int i=0;i最大值){
最大值=温度;
}
}
返回最大值;
}
}
}
在int temp=numbers[i]+numbers[1]行中彼此不同代码>与int temp=数字[i]+数字[i+1]相比代码>
由于antlr,我可以提取这些代码的AST。例如,输出如下所示:
它们彼此完全相同,但位置由红色指定
Antlr还提供了一个访问机制,它将我的访问者从根访问到树的底部(如果有帮助的话)
问题是:
是否有任何API、库或特定算法(实现或未实现)来实现差异
类似于git或diff match补丁提供的补丁。例如,在上面的例子中,我想知道
替换为:
或者更准确地说
正如区别一样
更新
虽然我的问题是关于ASTs中的差异,但是树比较的一般解决方案(不是简单的比较,而是使用差异输出)应该在这里工作。最后我找到了一种方法。到目前为止,我已经找到了正确的库(至少我认为是这样),但我仍然有办法在自己的代码中使用它
该工具是:
使用github页面,共页:
这给了我一个很棒的输出:
我终于找到了一条路。到目前为止,我已经找到了正确的库(至少我认为是这样),但我仍然有办法在自己的代码中使用它
该工具是:
使用github页面,共页:
这给了我一个很棒的输出:
请参阅我们的SmartDifferenticer工具,该工具可执行此操作并将结果报告为增量。请参阅我们的SmartDifferenticer工具,该工具可执行此操作并将结果报告为增量。