Skip to content

Commit a781a2b

Browse files
authored
Merge pull request #5959 from unisonweb/cp/handle-newlines-in-diffs
2 parents 4cfb881 + 6e582c1 commit a781a2b

3 files changed

Lines changed: 24 additions & 11 deletions

File tree

unison-share-api/package.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ library:
3838
- servant-docs
3939
- servant-openapi3
4040
- servant-server
41-
- split
4241
- text
4342
- transformers
4443
- unison-codebase

unison-share-api/src/Unison/Server/Backend/DefinitionDiff.hs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import Data.Function
1313
import Data.List qualified as List
1414
import Data.List.Extra qualified as List
1515
import Data.List.NonEmpty qualified as NEL
16-
import Data.List.Split qualified as Split
16+
import Data.Text qualified as Text
1717
import Unison.Codebase.Editor.DisplayObject (DisplayObject (..))
1818
import Unison.Prelude
1919
import 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})]]}
8586
linewiseDiff ::
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))
9596
linewiseDiff 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

unison-share-api/unison-share-api.cabal

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ library
117117
, servant-docs
118118
, servant-openapi3
119119
, servant-server
120-
, split
121120
, text
122121
, transformers
123122
, unison-codebase

0 commit comments

Comments
 (0)