Module difft::diff::sliders

source ·
Expand description

Prefer contiguous novel nodes on the same line.

A slider takes the following form:

Old:

A B
C D

New:

A B
A B
C D

It would be correct, but ugly, to show the following diff:

A +B+
+A+ B
C D

This module fixes these cases. It identifies situations where we can change which item is marked as novel (e.g. either B in the example above) whilst still showing a valid, minimal diff.

Functions

  • Return the distance between two syntax nodes, as a tuple of number of lines and number of columns.
  • Correct sliders in middle insertions.
  • When we see code of the form old1(novel(old2())), prefer treating the inner delimiter as novel, so novel(...) in this example.
  • When we see code of the form (old-1 (novel (old-2))), prefer treating the outer delimiter as novel, so (novel ...) in this example.
  • For every sequence of novel nodes, if it’s a potential slider, change which nodes are marked as novel if it produces a sequence of nodes that are closer together.
  • Return the start and end indexes of sequences of novel nodes that occur after unchanged nodes.
  • Return the start and end indexes of sequences of novel nodes that occur before unchanged nodes.
  • Should nester slider correction prefer the inner or outer delimiter?
  • Given a nested list where the root delimiters are novel but the inner list’s delimiters are unchanged, mark the root list as unchanged instead.
  • Given a nested list where the root delimiters are unchanged but the inner list’s delimiters are novel, mark the inner list as unchanged instead.
  • If the next node is unchanged, matches the beginning of the region, and has a smaller text distance, mark it as novel.
  • If the previous node is unchanged, matches the end of the region, and has a smaller text distance, mark it as novel.
  • Find the unchanged descendants of nodes.
  • Nested sliders require a single unchanged descendant whose delimiters we can slide.