There can be Macros that are tagged with modifiable. Thus verifying canModifyAllDescendants is not sufficient to avoid macros when deep copying.
We think the TokenBuffer could inform us whether a Token comes from a macro. We'll look into that when we can surface this information easily, for instance in unit tests for ComputeReplacements.