5
5
6
6
module Build
7
7
( fromExposed ,
8
+ fromExposedSources ,
8
9
fromPaths ,
10
+ fromPathsSources ,
11
+ fromMainModules ,
9
12
fromRepl ,
10
13
Artifacts (.. ),
11
14
Root (.. ),
@@ -27,9 +30,11 @@ import Control.Concurrent (forkIO)
27
30
import Control.Concurrent.MVar
28
31
import Control.Monad (filterM )
29
32
import Data.ByteString qualified as B
33
+ import Data.ByteString.Internal (ByteString )
30
34
import Data.Char qualified as Char
31
35
import Data.Graph qualified as Graph
32
36
import Data.List qualified as List
37
+ import Data.Map (Map )
33
38
import Data.Map.Strict ((!) )
34
39
import Data.Map.Strict qualified as Map
35
40
import Data.Map.Utils qualified as Map
@@ -134,6 +139,35 @@ fromExposed style root details docsGoal exposed@(NE.List e es) =
134
139
writeDetails root details results
135
140
finalizeExposed root docsGoal exposed results
136
141
142
+ fromExposedSources :: Reporting. Style -> FilePath -> Details. Details -> Map ModuleName. Raw ByteString -> DocsGoal docs -> NE. List ModuleName. Raw -> IO (Either Exit. BuildProblem docs )
143
+ fromExposedSources style root details sources docsGoal exposed@ (NE. List e es) =
144
+ Reporting. trackBuild style $ \ key ->
145
+ do
146
+ env <- makeEnv key root details
147
+ dmvar <- Details. loadInterfaces root details
148
+
149
+ -- crawl
150
+ mvar <- newEmptyMVar
151
+ let docsNeed = toDocsNeed docsGoal
152
+ roots <- Map. fromKeysA (fork . crawlModuleSources env mvar sources docsNeed) (e : es)
153
+ putMVar mvar roots
154
+ mapM_ readMVar roots
155
+ statuses <- traverse readMVar =<< readMVar mvar
156
+
157
+ -- compile
158
+ midpoint <- checkMidpoint dmvar statuses
159
+ case midpoint of
160
+ Left problem ->
161
+ return (Left (Exit. BuildProjectProblem problem))
162
+ Right foreigns ->
163
+ do
164
+ rmvar <- newEmptyMVar
165
+ resultMVars <- forkWithKey (checkModule env foreigns rmvar) statuses
166
+ putMVar rmvar resultMVars
167
+ results <- traverse readMVar resultMVars
168
+ writeDetails root details results
169
+ finalizeExposed root docsGoal exposed results
170
+
137
171
-- FROM PATHS
138
172
139
173
data Artifacts = Artifacts
@@ -184,6 +218,68 @@ fromPaths style root details paths =
184
218
writeDetails root details results
185
219
toArtifacts env foreigns results <$> traverse readMVar rrootMVars
186
220
221
+ fromPathsSources :: Reporting. Style -> FilePath -> Details. Details -> Map ModuleName. Raw ByteString -> NE. List FilePath -> IO (Either Exit. BuildProblem Artifacts )
222
+ fromPathsSources style root details sources paths =
223
+ Reporting. trackBuild style $ \ key ->
224
+ do
225
+ env <- makeEnv key root details
226
+
227
+ elroots <- findRoots env paths
228
+ case elroots of
229
+ Left problem ->
230
+ return (Left (Exit. BuildProjectProblem problem))
231
+ Right lroots ->
232
+ do
233
+ -- crawl
234
+ dmvar <- Details. loadInterfaces root details
235
+ smvar <- newMVar Map. empty
236
+ srootMVars <- traverse (fork . crawlRootSources env smvar sources) lroots
237
+ sroots <- traverse readMVar srootMVars
238
+ statuses <- traverse readMVar =<< readMVar smvar
239
+
240
+ midpoint <- checkMidpointAndRoots dmvar statuses sroots
241
+ case midpoint of
242
+ Left problem ->
243
+ return (Left (Exit. BuildProjectProblem problem))
244
+ Right foreigns ->
245
+ do
246
+ -- compile
247
+ rmvar <- newEmptyMVar
248
+ resultsMVars <- forkWithKey (checkModule env foreigns rmvar) statuses
249
+ putMVar rmvar resultsMVars
250
+ rrootMVars <- traverse (fork . checkRoot env resultsMVars) sroots
251
+ results <- traverse readMVar resultsMVars
252
+ writeDetails root details results
253
+ toArtifacts env foreigns results <$> traverse readMVar rrootMVars
254
+
255
+ fromMainModules :: Reporting. Style -> FilePath -> Details. Details -> Map ModuleName. Raw ByteString -> NE. List ModuleName. Raw -> IO (Either Exit. BuildProblem Artifacts )
256
+ fromMainModules style root details sources rootModules =
257
+ Reporting. trackBuild style $ \ key ->
258
+ do
259
+ env <- makeEnv key root details
260
+
261
+ -- crawl
262
+ dmvar <- Details. loadInterfaces root details
263
+ smvar <- newMVar Map. empty
264
+ srootMVars <- traverse (fork . crawlRootModule env smvar sources) rootModules
265
+ sroots <- traverse readMVar srootMVars
266
+ statuses <- traverse readMVar =<< readMVar smvar
267
+
268
+ midpoint <- checkMidpointAndRoots dmvar statuses sroots
269
+ case midpoint of
270
+ Left problem ->
271
+ return (Left (Exit. BuildProjectProblem problem))
272
+ Right foreigns ->
273
+ do
274
+ -- compile
275
+ rmvar <- newEmptyMVar
276
+ resultsMVars <- forkWithKey (checkModule env foreigns rmvar) statuses
277
+ putMVar rmvar resultsMVars
278
+ rrootMVars <- traverse (fork . checkRoot env resultsMVars) sroots
279
+ results <- traverse readMVar resultsMVars
280
+ writeDetails root details results
281
+ toArtifacts env foreigns results <$> traverse readMVar rrootMVars
282
+
187
283
-- GET ROOT NAMES
188
284
189
285
getRootNames :: Artifacts -> NE. List ModuleName. Raw
@@ -222,6 +318,19 @@ crawlDeps env mvar deps blockedValue =
222
318
where
223
319
crawlNew name () = fork (crawlModule env mvar (DocsNeed False ) name)
224
320
321
+ crawlDepsSources :: Env -> MVar StatusDict -> Map ModuleName. Raw ByteString -> [ModuleName. Raw ] -> a -> IO a
322
+ crawlDepsSources env mvar sources deps blockedValue =
323
+ do
324
+ statusDict <- takeMVar mvar
325
+ let depsDict = Map. fromKeys (\ _ -> () ) deps
326
+ let newsDict = Map. difference depsDict statusDict
327
+ statuses <- Map. traverseWithKey crawlNew newsDict
328
+ putMVar mvar (Map. union statuses statusDict)
329
+ mapM_ readMVar statuses
330
+ return blockedValue
331
+ where
332
+ crawlNew name () = fork (crawlModuleSources env mvar sources (DocsNeed False ) name)
333
+
225
334
crawlModule :: Env -> MVar StatusDict -> DocsNeed -> ModuleName. Raw -> IO Status
226
335
crawlModule env@ (Env _ root projectType _ srcDirs buildID locals foreigns) mvar docsNeed name =
227
336
do
@@ -261,6 +370,34 @@ crawlModule env@(Env _ root projectType _ srcDirs buildID locals foreigns) mvar
261
370
return $ if exists then SKernel else SBadImport Import. NotFound
262
371
else return $ SBadImport Import. NotFound
263
372
373
+ -- TODO: Use (slimmed down) locals to avoid compiling a module twice
374
+ -- TODO: Pass on path from frontend
375
+ crawlModuleSources :: Env -> MVar StatusDict -> Map ModuleName. Raw ByteString -> DocsNeed -> ModuleName. Raw -> IO Status
376
+ crawlModuleSources env@ (Env _ _ projectType _ _ buildID _ foreigns) mvar sources docsNeed name =
377
+ let path = ModuleName. toFilePath name <.> " gren"
378
+ in case Map. lookup name sources of
379
+ Just source ->
380
+ case Map. lookup name foreigns of
381
+ Just (Details. Foreign dep deps) ->
382
+ return $ SBadImport $ Import. Ambiguous path [] dep deps
383
+ Nothing ->
384
+ if Name. isKernel name
385
+ then
386
+ if Parse. isKernel projectType
387
+ then return SKernel
388
+ else return $ SBadImport Import. NotFound
389
+ else crawlFileSources env mvar sources docsNeed name path source buildID
390
+ Nothing ->
391
+ case Map. lookup name foreigns of
392
+ Just (Details. Foreign dep deps) ->
393
+ case deps of
394
+ [] ->
395
+ return $ SForeign dep
396
+ d : ds ->
397
+ return $ SBadImport $ Import. AmbiguousForeign dep d ds
398
+ Nothing ->
399
+ return $ SBadImport Import. NotFound
400
+
264
401
crawlFile :: Env -> MVar StatusDict -> DocsNeed -> ModuleName. Raw -> FilePath -> File. Time -> Details. BuildID -> IO Status
265
402
crawlFile env@ (Env _ root projectType _ _ buildID _ _) mvar docsNeed expectedName path time lastChange =
266
403
do
@@ -281,6 +418,23 @@ crawlFile env@(Env _ root projectType _ _ buildID _ _) mvar docsNeed expectedNam
281
418
in crawlDeps env mvar deps (SChanged local source modul docsNeed)
282
419
else return $ SBadSyntax path time source (Syntax. ModuleNameMismatch expectedName name)
283
420
421
+ crawlFileSources :: Env -> MVar StatusDict -> Map ModuleName. Raw ByteString -> DocsNeed -> ModuleName. Raw -> FilePath -> ByteString -> Details. BuildID -> IO Status
422
+ crawlFileSources env@ (Env _ _ projectType _ _ buildID _ _) mvar sources docsNeed expectedName path source lastChange =
423
+ case Parse. fromByteString projectType source of
424
+ Left err ->
425
+ return $ SBadSyntax path File. zeroTime source err
426
+ Right modul@ (Src. Module maybeActualName _ _ imports values _ _ _ _ _ _) ->
427
+ case maybeActualName of
428
+ Nothing ->
429
+ return $ SBadSyntax path File. zeroTime source (Syntax. ModuleNameUnspecified expectedName)
430
+ Just name@ (A. At _ actualName) ->
431
+ if expectedName == actualName
432
+ then
433
+ let deps = map (Src. getImportName . snd ) imports
434
+ local = Details. Local path File. zeroTime deps (any (isMain . snd ) values) lastChange buildID
435
+ in crawlDepsSources env mvar sources deps (SChanged local source modul docsNeed)
436
+ else return $ SBadSyntax path File. zeroTime source (Syntax. ModuleNameMismatch expectedName name)
437
+
284
438
isMain :: A. Located Src. Value -> Bool
285
439
isMain (A. At _ (Src. Value (A. At _ name) _ _ _ _)) =
286
440
name == Name. _main
@@ -961,8 +1115,43 @@ crawlRoot env@(Env _ _ projectType _ _ buildID _ _) mvar root =
961
1115
SOutsideErr $
962
1116
Error. Module " ???" path time source (Error. BadSyntax syntaxError)
963
1117
1118
+ crawlRootSources :: Env -> MVar StatusDict -> Map ModuleName. Raw ByteString -> RootLocation -> IO RootStatus
1119
+ crawlRootSources env@ (Env _ _ projectType _ _ buildID _ _) mvar sources root =
1120
+ case root of
1121
+ LInside name ->
1122
+ do
1123
+ statusMVar <- newEmptyMVar
1124
+ statusDict <- takeMVar mvar
1125
+ putMVar mvar (Map. insert name statusMVar statusDict)
1126
+ putMVar statusMVar =<< crawlModuleSources env mvar sources (DocsNeed False ) name
1127
+ return (SInside name)
1128
+ LOutside path ->
1129
+ do
1130
+ time <- File. getTime path
1131
+ source <- File. readUtf8 path
1132
+ case Parse. fromByteString projectType source of
1133
+ Right modul@ (Src. Module _ _ _ imports values _ _ _ _ _ _) ->
1134
+ do
1135
+ let deps = map (Src. getImportName . snd ) imports
1136
+ let local = Details. Local path time deps (any (isMain . snd ) values) buildID buildID
1137
+ crawlDeps env mvar deps (SOutsideOk local source modul)
1138
+ Left syntaxError ->
1139
+ return $
1140
+ SOutsideErr $
1141
+ Error. Module " ???" path time source (Error. BadSyntax syntaxError)
1142
+
1143
+ crawlRootModule :: Env -> MVar StatusDict -> Map ModuleName. Raw ByteString -> ModuleName. Raw -> IO RootStatus
1144
+ crawlRootModule env mvar sources root =
1145
+ do
1146
+ statusMVar <- newEmptyMVar
1147
+ statusDict <- takeMVar mvar
1148
+ putMVar mvar (Map. insert root statusMVar statusDict)
1149
+ putMVar statusMVar =<< crawlModuleSources env mvar sources (DocsNeed False ) root
1150
+ return (SInside root)
1151
+
964
1152
-- CHECK ROOTS
965
1153
1154
+ -- TODO: Only support RInside
966
1155
data RootResult
967
1156
= RInside ModuleName. Raw
968
1157
| ROutsideOk ModuleName. Raw I. Interface Opt. LocalGraph
0 commit comments