Description
Problem/Opportunity
Per its docstring, rewrite-clj.zip/position
throws if zloc
was created without position tracking. Because of this, several other functions can't be used with untracked zippers.
Proposed Solution
In zippers created without position tracking, the nodes have position information in their metadata (:row (meta (z/node zloc)))
. On untracked zippers, rewrite-clj.zip/position
could return that node metadata.
Of course, if a user edits an untracked zipper, the node position metadata can become outdated, a problem that the tracked zippers avoid. So, perhaps edited untracked zippers should throw if position
is invoked on their zlocs. Or perhaps there could be configuration for whether this throws, emits a warning, or ignores the danger.
Alternative Solutions
clojure-lsp, a (grateful) consumer of rewrite-clj, has worked around the limitations of position
by identifying functions that rely on it, duplicating, and rewriting them to use node metadata. (clojure-lsp doesn't use position tracking for performance reasons.)
A safer but more complicated solution could retroactively "repair" the positions of edited untracked zippers, only after position
is called. This would maintain the performance characteristics of untracked zippers until the moment that it's determined that they should have been tracked, at the cost of additional time spent recursively repairing a node and its predecessors.
Action
I'd be willing to be involved to any extent—design, coding and/or maintenance—but with my limited understanding of rewrite-clj and its consumers, I realize that the full breadth of this change could be way beyond my scope of knowledge.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status