I'm working on what I call "semantic version control". Namely, instead of diffing and merging text, the goal is to parse the program and diff/merge the AST. EDIT: A better way to state the goal: I want to take advantage of the underlying structure of a computer program to inform the diff/merge. The first step just happens to be diffing ASTs, but I go beyond this. I already have some neat features--for example, I can…
I think your nomenclature's wrong, though. If you are comparing via the AST, it's lexical version control.
However, on your second paragraph:
> That is, if you move a function, I can see that as a single action even if you modify the function a little bit when moving it
That already seems a bit more semantic than lexical.