@@ -3,10 +3,12 @@
3module Build
3module Build
4 ( fromExposed
4 ( fromExposed
5 , fromMains
5 , fromMains
6 , Artifacts(..)
7 , Artifacts(..)
8 , Module(..)
9 , Module(..)
9 , CachedInterface(..)
10 , CachedInterface(..)
10 , DocsGoal(..)
12 , DocsGoal(..)
11 , getMainNames
13 , getMainNames
@@ -51,6 +53,7 @@ import qualified Reporting.Error as Error
51import qualified Reporting.Error.Syntax as Syntax
53import qualified Reporting.Error.Syntax as Syntax
52import qualified Reporting.Error.Import as Import
54import qualified Reporting.Error.Import as Import
53import qualified Reporting.Exit as Exit
55import qualified Reporting.Exit as Exit
56+import qualified Reporting.Render.Type.Localizer as L
54import qualified Stuff
57import qualified Stuff
@@ -115,7 +118,7 @@ fromExposed style root details docsGoal exposed@(NE.List e es) =
115 statuses <- traverse readMVar =<< readMVar mvar
118 statuses <- traverse readMVar =<< readMVar mvar
117 -- compile
120 -- compile
118− midpoint <- checkExposedMidpoint dmvar statuses
121+ midpoint <- checkMidpoint dmvar statuses
119 case midpoint of
122 case midpoint of
120 Left problem ->
123 Left problem ->
121 return (Left (Exit.BuildProjectProblem problem))
124 return (Left (Exit.BuildProjectProblem problem))
@@ -374,14 +377,10 @@ checkModule env@(Env _ root pkg _ _ _) foreigns resultsMVar name status =
374 compile env docsNeed local source ifaces modul
377 compile env docsNeed local source ifaces modul
376 DepsSame same cached ->
379 DepsSame same cached ->
377− do maybeLoaded <- checkCachedInterfaces root cached
380+ do maybeLoaded <- loadInterfaces root same cached
378 case maybeLoaded of
381 case maybeLoaded of
380− return RBlocked
382+ Nothing -> return RBlocked
383− do let ifaces = Map.union loaded (Map.fromList same)
384− compile env docsNeed local source ifaces modul
383+ Just ifaces -> compile env docsNeed local source ifaces modul
386 DepsBlock ->
385 DepsBlock ->
387 return RBlocked
386 return RBlocked
@@ -454,14 +453,10 @@ checkDepsHelp root results deps new same cached importProblems isBlocked =
454 return $ DepsSame same cached
453 return $ DepsSame same cached
457− do maybeLoaded <- checkCachedInterfaces root cached
456+ do maybeLoaded <- loadInterfaces root same cached
458 case maybeLoaded of
457 case maybeLoaded of
460− return DepsBlock
458+ Nothing -> return DepsBlock
463− return $ DepsChange $
459+ Just ifaces -> return $ DepsChange $ Map.union (Map.fromList new) ifaces
464− Map.union loaded (Map.union (Map.fromList new) (Map.fromList same))
@@ -491,18 +486,23 @@ toImportErrors (Env _ _ _ _ locals foreigns) results imports problems =
494−-- CACHED INTERFACE
489+-- LOAD CACHED INTERFACES
497−checkCachedInterfaces :: FilePath -> [(ModuleName.Raw, MVar CachedInterface)] -> IO (Maybe (Map.Map ModuleName.Raw I.Interface))
492+loadInterfaces :: FilePath -> [Dep] -> [CDep] -> IO (Maybe (Map.Map ModuleName.Raw I.Interface))
498−checkCachedInterfaces root deps =
493+loadInterfaces root same cached =
499− do loading <- traverse (fork . checkCache root) deps
494+ do loading <- traverse (fork . loadInterface root) cached
500− loaded <- traverse readMVar loading
495+ maybeLoaded <- traverse readMVar loading
501− return $ Map.fromList <$> sequence loaded
496+ case sequence maybeLoaded of
501+ return $ Just $ Map.union (Map.fromList loaded) (Map.fromList same)
504−checkCache :: FilePath -> (ModuleName.Raw, MVar CachedInterface) -> IO (Maybe Dep)
504+loadInterface :: FilePath -> CDep -> IO (Maybe Dep)
505−checkCache root (name, ciMvar) =
505+loadInterface root (name, ciMvar) =
506 do cachedInterface <- takeMVar ciMvar
506 do cachedInterface <- takeMVar ciMvar
507 case cachedInterface of
507 case cachedInterface of
508 Corrupted ->
508 Corrupted ->
@@ -529,8 +529,8 @@ checkCache root (name, ciMvar) =
529-- CHECK PROJECT
529-- CHECK PROJECT
532−checkExposedMidpoint :: MVar (Maybe Dependencies) -> Map.Map ModuleName.Raw Status -> IO (Either Exit.BuildProjectProblem Dependencies)
532+checkMidpoint :: MVar (Maybe Dependencies) -> Map.Map ModuleName.Raw Status -> IO (Either Exit.BuildProjectProblem Dependencies)
533−checkExposedMidpoint dmvar statuses =
533+checkMidpoint dmvar statuses =
534 case checkForCycles statuses of
534 case checkForCycles statuses of
535 Nothing ->
535 Nothing ->
536 do maybeForeigns <- readMVar dmvar
536 do maybeForeigns <- readMVar dmvar
@@ -722,7 +722,7 @@ finalizeExposed docsGoal exposed results =
723 case Map.foldr addErrors [] results of
723 case Map.foldr addErrors [] results of
724 [] -> Right <$> finalizeDocs docsGoal results
724 [] -> Right <$> finalizeDocs docsGoal results
725− e:es -> return $ Left $ Exit.BuildModuleProblems e es
725+ e:es -> return $ Left $ Exit.BuildBadModules e es
728addErrors :: Result -> [Error.Module] -> [Error.Module]
728addErrors :: Result -> [Error.Module] -> [Error.Module]
@@ -810,6 +810,93 @@ toDocs result =
813+--------------------------------------------------------------------------------
814+------ NOW FOR SOME REPL STUFF -------------------------------------------------
815+--------------------------------------------------------------------------------
823+ { _repl_home :: ModuleName.Canonical
824+ , _repl_modules :: [Module]
825+ , _repl_localizer :: L.Localizer
826+ , _repl_annotations :: Map.Map Name.Name Can.Annotation
830+fromRepl :: FilePath -> Details.Details -> B.ByteString -> IO (Either Exit.Repl ReplArtifacts)
831+fromRepl root details source =
833+ env@(Env _ _ pkg _ _ _) = makeEnv Reporting.ignorer root details
835+ case Parse.fromByteString pkg source of
837+ return $ Left $ Exit.ReplBadInput source $ Error.BadSyntax syntaxError
839+ Right modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
840+ do dmvar <- Details.loadInterfaces root details
842+ let deps = map Src.getImportName imports
843+ mvar <- newMVar Map.empty
844+ crawlDeps env mvar deps ()
846+ statuses <- traverse readMVar =<< readMVar mvar
847+ midpoint <- checkMidpoint dmvar statuses
851+ return $ Left $ Exit.ReplProjectProblem problem
854+ do rmvar <- newEmptyMVar
855+ resultMVars <- forkWithKey (checkModule env foreigns rmvar) statuses
856+ putMVar rmvar resultMVars
857+ results <- traverse readMVar resultMVars
858+ writeDetails root details results
859+ depsStatus <- checkDeps root resultMVars deps
860+ finalizeReplArtifacts env source modul depsStatus resultMVars results
863+finalizeReplArtifacts :: Env -> B.ByteString -> Src.Module -> DepsStatus -> ResultDict -> Map.Map ModuleName.Raw Result -> IO (Either Exit.Repl ReplArtifacts)
864+finalizeReplArtifacts env@(Env _ root pkg _ _ _) source modul@(Src.Module _ _ _ imports _ _ _ _ _) depsStatus resultMVars results =
866+ compileInput ifaces =
867+ case Compile.compile pkg ifaces modul of
868+ Right (Compile.Artifacts canonical annotations objects) ->
870+ h = Can._name canonical
871+ m = Fresh (Src.getName modul) (I.fromModule pkg canonical annotations) objects
872+ ms = Map.foldrWithKey addInside [] results
874+ return $ Right $ ReplArtifacts h (m:ms) (L.fromModule modul) annotations
877+ return $ Left $ Exit.ReplBadInput source errors
880+ DepsChange ifaces ->
883+ DepsSame same cached ->
884+ do maybeLoaded <- loadInterfaces root same cached
886+ Just ifaces -> compileInput ifaces
887+ Nothing -> return $ Left $ Exit.ReplBadCache
890+ case Map.foldr addErrors [] results of
891+ [] -> return $ Left $ Exit.ReplBlocked
892+ e:es -> return $ Left $ Exit.ReplBadLocalDeps e es
894+ DepsNotFound problems ->
895+ return $ Left $ Exit.ReplBadInput source $ Error.BadImports $
896+ toImportErrors env resultMVars imports problems
813--------------------------------------------------------------------------------
900--------------------------------------------------------------------------------
814--------------------------------------------------------------------------------
901--------------------------------------------------------------------------------
815------ AFTER THIS, EVERYTHING IS ABOUT HANDLING MODULES GIVEN BY FILEPATH ------
902------ AFTER THIS, EVERYTHING IS ABOUT HANDLING MODULES GIVEN BY FILEPATH ------
@@ -994,14 +1081,10 @@ checkMain env@(Env _ root _ _ _ _) results pendingMain =
994 return $ compileOutside env local source ifaces modul
1081 return $ compileOutside env local source ifaces modul
996 DepsSame same cached ->
1083 DepsSame same cached ->
997− do maybeLoaded <- checkCachedInterfaces root cached
1084+ do maybeLoaded <- loadInterfaces root same cached
998 case maybeLoaded of
1085 case maybeLoaded of
1000− return ROutsideBlocked
1086+ Nothing -> return ROutsideBlocked
1003− do let ifaces = Map.union loaded (Map.fromList same)
1004− return $ compileOutside env local source ifaces modul
1087+ Just ifaces -> return $ compileOutside env local source ifaces modul
1006 DepsBlock ->
1089 DepsBlock ->
1007 return ROutsideBlocked
1090 return ROutsideBlocked
@@ -1038,7 +1121,7 @@ toArtifacts :: Env -> Dependencies -> Map.Map ModuleName.Raw Result -> NE.List M
1038toArtifacts (Env _ _ pkg _ _ _) foreigns results mainResults =
1121toArtifacts (Env _ _ pkg _ _ _) foreigns results mainResults =
1039 case gatherProblemsOrMains results mainResults of
1122 case gatherProblemsOrMains results mainResults of
1040 Left (NE.List e es) ->
1123 Left (NE.List e es) ->
1041− Left (Exit.BuildModuleProblems e es)
1124+ Left (Exit.BuildBadModules e es)
1043 Right mains ->
1126 Right mains ->
1044 Right $ Artifacts pkg foreigns mains $
1127 Right $ Artifacts pkg foreigns mains $