gumtree-spoon-ast-diff
gumtree-spoon-ast-diff copied to clipboard
Incorrect edit script
left.java
class Invocation {
int a = 1;
void checkForSign() {
if (a > 0) {
System.out.println("y");
} else if (a < 0) {
System.out.println("z");
} else {
System.out.println("x");
}
}
}
right.java
class Invocation {
int a = 1;
void checkForSign() {
if (a > 0) {
System.out.println("x");
} else if (a < 0) {
System.out.println("y");
} else {
System.out.println("z");
}
}
}
EDIT SCRIPT
-
Delete Block at Invocation:6 { }
-
Insert Block at Invocation:4 { }
-
Move Invocation from Invocation:9 to Invocation:5 System.out.println("x")
-
Move Block from Invocation:4 to Invocation:6 { System.out.println("y"); }
-
Move Invocation from Invocation:7 to Invocation:9 System.out.println("z")
Ideally, three move operations were enough but an optimum edit script is not guaranteed but a correct one should be. The edit script produced for this case has one major problem - the second operation inserts a block into an already existing block (if
block is already there at 4
). This could be a consequence of the absence of CtBlock
concept in spoon but I am not sure. However, if this is the case, convertToSpoon
needs to be fixed.
Using this edit script in diffmin also throws an error as elaborated here. This could be an issue with the mapping as THEN
block in else-if
in left.java
should have been mapped to THEN
block in if
in right.java
. However, GumTree matchers are based on heuristics so we cannot expect the matcher to give accurate mappings every time as it is an NP-hard problem as argued by @slarse.
@monperrus @khaes-kth srcDiff's output for this diff.
cool. and the Gumtree-JDT output?
GumTree-JDT (master
version as of the date this comment was created).
It is not really clear which element moved unless you have read the edit script.
@algomaster99 Is it fair to say they all fail on this diff?
Mergely
https://editor.mergely.com/Bmo5md7x/
GitHub diff view
https://github.com/algomaster99/diffmin-examples/pull/7/files
We can claim that all of them fail, if we say the correct way to show the diff was 3 updates.
"Fail" may be too binary. We rather want an ordering relationship: X is better than Y.
Here, I'd say that scrDiff is better than gumtree-JDT for example.
And that the Github diff is the best.
Agreed. As always, there is no problem, only an "opportunity" for us to improve :)
You're training very well 👍️
Here, I'd say that scrDiff is better than gumtree-JDT for example. And that the Github diff is the best.
I agree with your opinions.