@@ -17,8 +17,10 @@ import Data.Zip (unzip)
17
17
import Unison.DataDeclaration (Decl )
18
18
import Unison.DataDeclaration qualified as DataDeclaration
19
19
import Unison.DeclNameLookup (DeclNameLookup , expectConstructorNames )
20
+ import Unison.DeclNameLookup qualified as DeclNameLookup
20
21
import Unison.Merge.Mergeblob2 (Mergeblob2 (.. ))
21
22
import Unison.Merge.PrettyPrintEnv (makePrettyPrintEnvs )
23
+ import Unison.Merge.ThreeWay (ThreeWay )
22
24
import Unison.Merge.ThreeWay qualified as ThreeWay
23
25
import Unison.Merge.TwoWay (TwoWay )
24
26
import Unison.Merge.TwoWay qualified as TwoWay
@@ -38,7 +40,7 @@ import Unison.Term (Term)
38
40
import Unison.Type (Type )
39
41
import Unison.Util.BiMultimap (BiMultimap )
40
42
import Unison.Util.BiMultimap qualified as BiMultimap
41
- import Unison.Util.Defns (Defns (.. ), DefnsF , defnsAreEmpty , zipDefnsWith , zipDefnsWith3 )
43
+ import Unison.Util.Defns (Defns (.. ), DefnsF , defnsAreEmpty , zipDefnsWith , zipDefnsWith3 , zipDefnsWith4 )
42
44
import Unison.Util.Pretty (ColorText , Pretty )
43
45
import Unison.Util.Pretty qualified as Pretty
44
46
import Unison.Util.Relation qualified as Relation
@@ -47,6 +49,7 @@ import Prelude hiding (unzip)
47
49
data Mergeblob3 = Mergeblob3
48
50
{ libdeps :: Names ,
49
51
stageOne :: DefnsF (Map Name ) Referent TypeReference ,
52
+ stageTwo :: DefnsF (Map Name ) Referent TypeReference ,
50
53
uniqueTypeGuids :: Map Name Text ,
51
54
unparsedFile :: Pretty ColorText
52
55
}
@@ -64,6 +67,7 @@ makeMergeblob3 blob dependents0 libdeps authors =
64
67
65
68
-- Identify the unconflicted dependents we need to pull into the Unison file (either first for typechecking, if
66
69
-- there aren't conflicts, or else for manual conflict resolution without a typechecking step, if there are)
70
+ dependents :: TwoWay (DefnsF Set Name Name )
67
71
dependents =
68
72
filterDependents
69
73
conflictsNames
@@ -105,6 +109,13 @@ makeMergeblob3 blob dependents0 libdeps authors =
105
109
dependents
106
110
(bimap BiMultimap. range BiMultimap. range blob. defns. lca),
107
111
uniqueTypeGuids = makeUniqueTypeGuids blob. hydratedDefns,
112
+ stageTwo =
113
+ makeStageTwo
114
+ blob. declNameLookups
115
+ conflictsNames
116
+ blob. unconflicts
117
+ dependents
118
+ (bimap BiMultimap. range BiMultimap. range <$> blob. defns),
108
119
unparsedFile = makePrettyUnisonFile authors renderedConflicts renderedDependents
109
120
}
110
121
@@ -164,6 +175,41 @@ makeStageOneV :: Unconflicts v -> Set Name -> Map Name v -> Map Name v
164
175
makeStageOneV unconflicts namesToDelete =
165
176
(`Map.withoutKeys` namesToDelete) . Unconflicts. apply unconflicts
166
177
178
+ makeStageTwo ::
179
+ forall term typ .
180
+ TwoWay DeclNameLookup ->
181
+ TwoWay (DefnsF Set Name Name ) ->
182
+ DefnsF Unconflicts term typ ->
183
+ TwoWay (DefnsF Set Name Name ) ->
184
+ ThreeWay (DefnsF (Map Name ) term typ ) ->
185
+ DefnsF (Map Name ) term typ
186
+ makeStageTwo declNameLookups conflicts unconflicts dependents defns =
187
+ zipDefnsWith4 makeStageTwoV makeStageTwoV defns. lca aliceBiasedDependents unconflicts aliceConflicts
188
+ where
189
+ aliceConflicts :: DefnsF (Map Name ) term typ
190
+ aliceConflicts =
191
+ zipDefnsWith
192
+ (\ defns conflicts -> Map. restrictKeys defns (conflicts <> aliceConstructorsOfTypeConflicts))
193
+ Map. restrictKeys
194
+ defns. alice
195
+ conflicts. alice
196
+
197
+ aliceConstructorsOfTypeConflicts :: Set Name
198
+ aliceConstructorsOfTypeConflicts =
199
+ foldMap
200
+ (Set. fromList . DeclNameLookup. expectConstructorNames declNameLookups. alice)
201
+ conflicts. alice. types
202
+
203
+ aliceBiasedDependents :: DefnsF (Map Name ) term typ
204
+ aliceBiasedDependents =
205
+ TwoWay. twoWay
206
+ (zipDefnsWith (Map. unionWith const ) (Map. unionWith const ))
207
+ (zipDefnsWith Map. restrictKeys Map. restrictKeys <$> ThreeWay. forgetLca defns <*> dependents)
208
+
209
+ makeStageTwoV :: Map Name v -> Map Name v -> Unconflicts v -> Map Name v -> Map Name v
210
+ makeStageTwoV lca dependents unconflicts conflicts =
211
+ Map. unionWith const conflicts (Unconflicts. apply unconflicts (Map. unionWith const dependents lca))
212
+
167
213
-- Given just named term/type reference ids, fill out all names that occupy the term and type namespaces. This is simply
168
214
-- the given names plus all of the types' constructors.
169
215
--
0 commit comments