1
1
module Juvix.Compiler.Internal.Extra.DependencyBuilder
2
- ( buildDependencyInfoPreModule ,
2
+ ( NameDependencyInfo ,
3
+ buildDependencyInfoPreModule ,
3
4
buildDependencyInfoLet ,
4
- ExportsTable ,
5
+ instanceDependencyParams ,
6
+ letDependencyParams ,
7
+ positivityNameDependencyInfo ,
8
+ DependencyParams (.. ),
9
+ dependencyParamsIsStartNode ,
10
+ dependencyParamsInstance ,
5
11
)
6
12
where
7
13
@@ -34,31 +40,67 @@ emptyBuilderState =
34
40
_builderStateFromInt = Nothing
35
41
}
36
42
37
- type ExportsTable = HashSet NameId
43
+ letDependencyParams :: DependencyParams
44
+ letDependencyParams =
45
+ DependencyParams
46
+ { _dependencyParamsIsStartNode = const False ,
47
+ _dependencyParamsInstance = False
48
+ }
49
+
50
+ instanceDependencyParams :: HashSet NameId -> DependencyParams
51
+ instanceDependencyParams s =
52
+ DependencyParams
53
+ { _dependencyParamsIsStartNode = (`HashSet.member` s),
54
+ _dependencyParamsInstance = True
55
+ }
56
+
57
+ data DependencyParams = DependencyParams
58
+ { _dependencyParamsIsStartNode :: NameId -> Bool ,
59
+ -- | When set to True, each declaration depends on the previous declaration.
60
+ -- Necessary for instance resolution
61
+ _dependencyParamsInstance :: Bool
62
+ }
63
+
64
+ makeLenses ''DependencyParams
38
65
39
- buildDependencyInfoPreModule :: PreModule -> ExportsTable -> NameDependencyInfo
40
- buildDependencyInfoPreModule ms tab =
41
- buildDependencyInfoHelper tab (goPreModule ms >> addCastEdges)
66
+ buildDependencyInfoPreModule :: forall r . (Members '[Reader DependencyParams ] r ) => PreModule -> Sem r NameDependencyInfo
67
+ buildDependencyInfoPreModule ms =
68
+ buildDependencyInfoHelper (goPreModule ms >> addCastEdges)
69
+
70
+ -- | Compute dependency info with `_dependencyParamsInstance` set to `False`.
71
+ -- Used for positivity checking
72
+ positivityNameDependencyInfo :: [PreStatement ] -> NameDependencyInfo
73
+ positivityNameDependencyInfo m =
74
+ run
75
+ . runReader dependencyParams
76
+ . buildDependencyInfoHelper
77
+ $ goPreStatements impossibleParent m
78
+ where
79
+ impossibleParent :: Name
80
+ impossibleParent = impossibleError " This name should never be used because `_dependencyParamsInstance` is set to False"
81
+
82
+ dependencyParams :: DependencyParams
83
+ dependencyParams =
84
+ DependencyParams
85
+ { _dependencyParamsInstance = False ,
86
+ _dependencyParamsIsStartNode = const True
87
+ }
42
88
43
89
buildDependencyInfoLet :: NonEmpty PreLetStatement -> NameDependencyInfo
44
90
buildDependencyInfoLet ls =
45
- buildDependencyInfoHelper mempty (goPreLetStatements Nothing (toList ls) >> addCastEdges)
91
+ run . runReader letDependencyParams $
92
+ buildDependencyInfoHelper (goPreLetStatements Nothing (toList ls) >> addCastEdges)
46
93
47
94
buildDependencyInfoHelper ::
48
- ExportsTable ->
49
- Sem '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] () ->
50
- NameDependencyInfo
51
- buildDependencyInfoHelper tbl m = createDependencyInfo graph startNodes
52
- where
53
- startNodes :: StartNodes
54
- graph :: DependencyGraph
55
- (startNodes, graph) =
56
- run
57
- . evalState emptyBuilderState
58
- . runState HashSet. empty
59
- . execState HashMap. empty
60
- . runReader tbl
61
- $ m
95
+ Sem (State DependencyGraph ': State StartNodes ': State BuilderState ': r ) () ->
96
+ Sem r NameDependencyInfo
97
+ buildDependencyInfoHelper m = do
98
+ (startNodes :: StartNodes , graph :: DependencyGraph ) <-
99
+ evalState emptyBuilderState
100
+ . runState HashSet. empty
101
+ . execState HashMap. empty
102
+ $ m
103
+ return (createDependencyInfo graph startNodes)
62
104
63
105
addCastEdges :: (Members '[State DependencyGraph , State BuilderState ] r ) => Sem r ()
64
106
addCastEdges = do
@@ -76,6 +118,11 @@ addCastEdges = do
76
118
addStartNode :: (Member (State StartNodes ) r ) => Name -> Sem r ()
77
119
addStartNode n = modify (HashSet. insert n)
78
120
121
+ addEdgeParent :: (Members '[Reader DependencyParams , State DependencyGraph ] r ) => Name -> Name -> Sem r ()
122
+ addEdgeParent a b = do
123
+ inst <- asks (^. dependencyParamsInstance)
124
+ when inst (addEdge a b)
125
+
79
126
addEdgeMay :: (Members '[State DependencyGraph , Reader (Maybe Name )] r ) => Name -> Sem r ()
80
127
addEdgeMay n2 = whenJustM ask $ \ n1 -> addEdge n1 n2
81
128
@@ -95,14 +142,12 @@ addEdge n1 n2 =
95
142
Just ns -> Just (HashSet. insert n2 ns)
96
143
Nothing -> Just (HashSet. singleton n2)
97
144
98
- checkStartNode :: (Members '[Reader ExportsTable , State StartNodes , State BuilderState ] r ) => Name -> Sem r ()
145
+ checkStartNode :: (Members '[Reader DependencyParams , State StartNodes , State BuilderState ] r ) => Name -> Sem r ()
99
146
checkStartNode n = do
100
- tab <- ask
101
- when
102
- (HashSet. member (n ^. nameId) tab)
103
- (addStartNode n)
147
+ isStart <- asks (^. dependencyParamsIsStartNode)
148
+ when (isStart (n ^. nameId)) (addStartNode n)
104
149
105
- goPreModule :: (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] r ) => PreModule -> Sem r ()
150
+ goPreModule :: (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState ] r ) => PreModule -> Sem r ()
106
151
goPreModule m = do
107
152
checkStartNode (m ^. moduleName)
108
153
let b = m ^. moduleBody
@@ -112,7 +157,7 @@ goPreModule m = do
112
157
113
158
goPreLetStatements ::
114
159
forall r .
115
- (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] r ) =>
160
+ (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState ] r ) =>
116
161
Maybe Name ->
117
162
[PreLetStatement ] ->
118
163
Sem r ()
@@ -128,7 +173,7 @@ goPreLetStatements mp = \case
128
173
129
174
goPreLetStatement ::
130
175
forall r .
131
- (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState , Reader (Maybe Name )] r ) =>
176
+ (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState , Reader (Maybe Name )] r ) =>
132
177
PreLetStatement ->
133
178
Sem r ()
134
179
goPreLetStatement = \ case
@@ -141,7 +186,7 @@ goPreLetStatement = \case
141
186
-- if it exists) in order to guarantee that instance declarations are always
142
187
-- processed before their uses. For an instance to be taken into account in
143
188
-- instance resolution, it needs to be declared textually earlier.
144
- goPreStatements :: forall r . (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> [PreStatement ] -> Sem r ()
189
+ goPreStatements :: forall r . (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> [PreStatement ] -> Sem r ()
145
190
goPreStatements p = \ case
146
191
stmt : stmts -> do
147
192
goPreStatement p stmt
@@ -155,24 +200,24 @@ goPreStatements p = \case
155
200
PreInductiveDef i -> i ^. inductiveName
156
201
157
202
-- | `p` is the parent -- the previous declaration or the enclosing module
158
- goPreStatement :: forall r . (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> PreStatement -> Sem r ()
203
+ goPreStatement :: forall r . (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> PreStatement -> Sem r ()
159
204
goPreStatement p = \ case
160
205
PreAxiomDef ax -> goAxiom p ax
161
206
PreFunctionDef f -> goTopFunctionDef p f
162
207
PreInductiveDef i -> goInductive p i
163
208
164
- goAxiom :: forall r . (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> AxiomDef -> Sem r ()
209
+ goAxiom :: forall r . (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> AxiomDef -> Sem r ()
165
210
goAxiom p ax = do
166
211
checkStartNode (ax ^. axiomName)
167
- addEdge (ax ^. axiomName) p
212
+ addEdgeParent (ax ^. axiomName) p
168
213
runReader (Just (ax ^. axiomName)) (goExpression (ax ^. axiomType))
169
214
170
- goInductive :: forall r . (Members '[Reader ExportsTable , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> InductiveDef -> Sem r ()
215
+ goInductive :: forall r . (Members '[Reader DependencyParams , State DependencyGraph , State StartNodes , State BuilderState ] r ) => Name -> InductiveDef -> Sem r ()
171
216
goInductive p i = do
172
217
let indName = i ^. inductiveName
173
218
checkStartNode indName
174
219
checkBuiltinInductiveStartNode i
175
- addEdge indName p
220
+ addEdgeParent indName p
176
221
mapM_ (goConstructorDef indName) (i ^. inductiveConstructors)
177
222
runReader (Just indName) $ do
178
223
mapM_ goInductiveParameter (i ^. inductiveParameters)
@@ -206,9 +251,9 @@ checkBuiltinInductiveStartNode i = whenJust (i ^. inductiveBuiltin) go
206
251
addInductiveStartNode :: Sem r ()
207
252
addInductiveStartNode = addStartNode (i ^. inductiveName)
208
253
209
- goTopFunctionDef :: (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader ExportsTable ] r ) => Name -> FunctionDef -> Sem r ()
254
+ goTopFunctionDef :: (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader DependencyParams ] r ) => Name -> FunctionDef -> Sem r ()
210
255
goTopFunctionDef p f = do
211
- addEdge (f ^. funDefName) p
256
+ addEdgeParent (f ^. funDefName) p
212
257
goFunctionDefHelper f
213
258
214
259
checkCast ::
@@ -221,7 +266,7 @@ checkCast f = case f ^. funDefBuiltin of
221
266
_ -> return ()
222
267
223
268
goFunctionDefHelper ::
224
- (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader ExportsTable ] r ) =>
269
+ (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader DependencyParams ] r ) =>
225
270
FunctionDef ->
226
271
Sem r ()
227
272
goFunctionDefHelper f = do
@@ -235,7 +280,7 @@ goFunctionDefHelper f = do
235
280
236
281
-- | constructors of an inductive type depend on the inductive type, not the other
237
282
-- way round; an inductive type depends on the types of its constructors
238
- goConstructorDef :: (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader ExportsTable ] r ) => Name -> ConstructorDef -> Sem r ()
283
+ goConstructorDef :: (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader DependencyParams ] r ) => Name -> ConstructorDef -> Sem r ()
239
284
goConstructorDef indName c = do
240
285
addEdge (c ^. inductiveConstructorName) indName
241
286
runReader (Just indName) (goExpression (c ^. inductiveConstructorType))
@@ -256,7 +301,7 @@ goPattern p = case p ^. patternArgPattern of
256
301
257
302
goExpression ::
258
303
forall r .
259
- (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader ExportsTable , Reader (Maybe Name )] r ) =>
304
+ (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader DependencyParams , Reader (Maybe Name )] r ) =>
260
305
Expression ->
261
306
Sem r ()
262
307
goExpression e = case e of
@@ -326,15 +371,15 @@ goExpression e = case e of
326
371
LetMutualBlock MutualBlockLet {.. } -> mapM_ goFunctionDefHelper _mutualLet
327
372
328
373
goInductiveParameter ::
329
- (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader ExportsTable , Reader (Maybe Name )] r ) =>
374
+ (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader DependencyParams , Reader (Maybe Name )] r ) =>
330
375
InductiveParameter ->
331
376
Sem r ()
332
377
goInductiveParameter param = do
333
378
addEdgeMay (param ^. inductiveParamName)
334
379
goExpression (param ^. inductiveParamType)
335
380
336
381
goFunctionParameter ::
337
- (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader ExportsTable , Reader (Maybe Name )] r ) =>
382
+ (Members '[State DependencyGraph , State StartNodes , State BuilderState , Reader DependencyParams , Reader (Maybe Name )] r ) =>
338
383
FunctionParameter ->
339
384
Sem r ()
340
385
goFunctionParameter param = do
0 commit comments