@@ -13,7 +13,7 @@ import Data.Function
1313import Data.List qualified as List
1414import Data.List.Extra qualified as List
1515import Data.List.NonEmpty qualified as NEL
16- import Data.List.Split qualified as Split
16+ import Data.Text qualified as Text
1717import Unison.Codebase.Editor.DisplayObject (DisplayObject (.. ))
1818import Unison.Prelude
1919import Unison.Server.Syntax (SyntaxText )
@@ -33,11 +33,6 @@ diffDisplayObjects from to = case (from, to) of
3333 (UserObject fromST, UserObject toST) -> DisplayObjectDiff (UserObject (semanticLinewiseDiff fromST toST))
3434 (l, r) -> MismatchedDisplayObjects l r
3535
36- -- diffSyntaxText :: SyntaxText -> SyntaxText -> [SemanticSyntaxDiff Syntax.Element]
37- -- diffSyntaxText (AnnotatedText fromST) (AnnotatedText toST) =
38- -- diffSegments syntaxElementDiffEq fromST toST
39- -- & expandSpecialCases specialCaseAnnotations
40-
4136-- We special-case situations where the name of a definition changed but its hash didn't;
4237-- and cases where the name didn't change but the hash did.
4338--
@@ -81,7 +76,13 @@ data DiffOrSame = Different | Same
8176-- >>> let left = [s "line1", s "\n", s "line2", s "\n", s "line3", s "\n", s "line3"]
8277-- >>> let right = [s "line1", s "\n", s "lineX", s "\n", s "line3"]
8378-- >>> linewiseDiff (==) left right
84- -- ([Unchanged [Paired (Segment {segment = "line1", annotation = Nothing}) (Segment {segment = "line1", annotation = Nothing})],Changed [OneSided (Segment {segment = "line2", annotation = Nothing})],Changed [OneSided (Segment {segment = "line3", annotation = Nothing})],Unchanged [Paired (Segment {segment = "line3", annotation = Nothing}) (Segment {segment = "line3", annotation = Nothing})]],[Unchanged [Paired (Segment {segment = "line1", annotation = Nothing}) (Segment {segment = "line1", annotation = Nothing})],Changed [OneSided (Segment {segment = "lineX", annotation = Nothing})],Spacer,Unchanged [Paired (Segment {segment = "line3", annotation = Nothing}) (Segment {segment = "line3", annotation = Nothing})]])
79+ -- LinewiseDiff {lhsLines = [Unchanged [Paired (Segment {segment = "line1", annotation = Nothing}) (Segment {segment = "line1", annotation = Nothing})],Changed [OneSided (Segment {segment = "line2", annotation = Nothing})],Changed [OneSided (Segment {segment = "line3", annotation = Nothing})],Unchanged [Paired (Segment {segment = "line3", annotation = Nothing}) (Segment {segment = "line3", annotation = Nothing})]], rhsLines = [Unchanged [Paired (Segment {segment = "line1", annotation = Nothing}) (Segment {segment = "line1", annotation = Nothing})],Changed [OneSided (Segment {segment = "lineX", annotation = Nothing})],Spacer,Unchanged [Paired (Segment {segment = "line3", annotation = Nothing}) (Segment {segment = "line3", annotation = Nothing})]]}
80+ --
81+ -- >>> let s a = Segment a Nothing
82+ -- >>> let left = [s "line1", s "=\n", s "line2", s ",\n", s "line3", s "\n", s "line3"]
83+ -- >>> let right = [s "line1", s "\n", s "lineX", s ",\n,\n,", s "line3"]
84+ -- >>> linewiseDiff (==) left right
85+ -- LinewiseDiff {lhsLines = [Changed [Paired (Segment {segment = "line1", annotation = Nothing}) (Segment {segment = "line1", annotation = Nothing}),OneSided (Segment {segment = "=", annotation = Nothing})],Changed [OneSided (Segment {segment = "line2", annotation = Nothing}),Paired (Segment {segment = ",", annotation = Nothing}) (Segment {segment = ",", annotation = Nothing})],Changed [OneSided (Segment {segment = "line3", annotation = Nothing})],Changed [Paired (Segment {segment = "line3", annotation = Nothing}) (Segment {segment = "line3", annotation = Nothing})]], rhsLines = [Changed [Paired (Segment {segment = "line1", annotation = Nothing}) (Segment {segment = "line1", annotation = Nothing})],Changed [OneSided (Segment {segment = "lineX", annotation = Nothing}),Paired (Segment {segment = ",", annotation = Nothing}) (Segment {segment = ",", annotation = Nothing})],Changed [OneSided (Segment {segment = ",", annotation = Nothing})],Changed [OneSided (Segment {segment = ",", annotation = Nothing}),Paired (Segment {segment = "line3", annotation = Nothing}) (Segment {segment = "line3", annotation = Nothing})]]}
8586linewiseDiff ::
8687 forall f a .
8788 (Foldable f , Eq a , Show a ) =>
@@ -93,8 +94,8 @@ linewiseDiff ::
9394 -- When lines are only present on one side, the other side has a Nothing in that position as padding.
9495 LinewiseDiff (Paired (Segment a ))
9596linewiseDiff diffEq left right =
96- let leftLines = Split. splitWhen (( == " \n " ) . AT. segment) . toList $ left
97- rightLines = Split. splitWhen (( == " \n " ) . AT. segment) . toList $ right
97+ let leftLines = splitOnLines . toList $ left
98+ rightLines = splitOnLines . toList $ right
9899 groupedDiff = Diff. getGroupedDiff leftLines rightLines
99100 partitioned =
100101 groupedDiff
@@ -125,6 +126,20 @@ linewiseDiff diffEq left right =
125126 & \ (lhsLines, rhsLines) ->
126127 LinewiseDiff {lhsLines, rhsLines}
127128 where
129+ splitOnLines :: [Segment a ] -> [[Segment a ]]
130+ splitOnLines xs =
131+ xs
132+ & foldMap
133+ ( \ (Segment {segment = s, annotation}) ->
134+ Text. splitOn " \n " s
135+ <&> (\ seg -> Just $ Segment seg annotation)
136+ & List. intersperse Nothing
137+ & filter \ case
138+ Nothing -> True
139+ Just (Segment {segment}) -> not (Text. null segment)
140+ )
141+ & List. splitOn [Nothing ]
142+ & fmap catMaybes
128143 pairLines :: forall x . [[x ]] -> [[x ]] -> ([[Paired x ]], [[Paired x ]])
129144 pairLines left right =
130145 let paired = zipWith (zipWith Paired ) left right
0 commit comments