Baseline commit
void process(data) {
log(data.id);
save(data);
return data.result;
}
Modified user
void process(input) {
log(input.id);
save(input);
return input.result;
}
Patched ACR
void process(data) {
if (data == null)
throw new Error();
log(data.id);
save(data);
return data.result;
}
Git would flag the entire method as a conflict: every line differs because of the parameter rename. The null-check insertion is lost in the noise.
GumTree AST three-way merge
Merged result
void process(input) { rename from user
if (input == null) null-check from ACR
throw new Error();
log(input.id);
save(input);
return input.result;
}
Renamed (user)
Inserted (ACR)
ACR's null-check adapts to the renamed parameter