semantic
semantic copied to clipboard
Precise AST datatypes don’t support diffing
(Forked off of/supersedes https://github.com/tree-sitter/haskell-tree-sitter/issues/263. The below text, originally written by Rob, follows.)
The TH code currently produces AST datatypes which don’t support diffing: we can’t e.g. replace a subterm with a diff of that subterm.
We will likely need to employ higher-kinded data, à la:
data If f a = If { ann :: a, condition :: f (Expr f a), consequence :: f (Stmt f a), alternative :: f (Stmt f a) }
Ordinary terms will then be represented by e.g. If Identity
(tho I suspect we will wish to use type/pattern synonyms to improve the ergonomics of this), while we could represent possibly-missing/-ignored subterms with If Maybe
. This would likewise allow some appropriately-configured Diff
datatype to represent the term positions.
We might also need to move the responsibility for holding or applying the annotations into f
to allow us to e.g. represent both original annotations for common nodes, but only one for deletions/insertions. We might need to use an even weirder kind to allow diffs to represent deletions/insertions of unchanged terms. Experimentation will be required