on master help sign in
add logic for building from REPL bytestrings
21fe4a9Evan Czaplicki
builder/src/Build.hs+117−34
@@ -3,10 +3,12 @@
3module Build
3module Build
4 ( fromExposed
4 ( fromExposed
5 , fromMains
5 , fromMains
6+ , fromRepl
6 , Artifacts(..)
7 , Artifacts(..)
7 , Main(..)
8 , Main(..)
8 , Module(..)
9 , Module(..)
9 , CachedInterface(..)
10 , CachedInterface(..)
11+ , ReplArtifacts(..)
10 , DocsGoal(..)
12 , DocsGoal(..)
11 , getMainNames
13 , getMainNames
12 )
14 )
@@ -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
55
58
56
59
@@ -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
116
119
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
375
378
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
379− Nothing ->
380− return RBlocked
382+ Nothing -> return RBlocked
381−
382− Just loaded ->
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
385
384
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
455
454
456 else
455 else
457− do maybeLoaded <- checkCachedInterfaces root cached
456+ do maybeLoaded <- loadInterfaces root same cached
458 case maybeLoaded of
457 case maybeLoaded of
459− Nothing ->
460− return DepsBlock
458+ Nothing -> return DepsBlock
461−
462− Just loaded ->
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))
465
460
466
461
467
462
@@ -491,18 +486,23 @@ toImportErrors (Env _ _ _ _ locals foreigns) results imports problems =
491
486
492
487
493
488
494−-- CACHED INTERFACE
489+-- LOAD CACHED INTERFACES
495
490
496
491
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
497+ Nothing ->
498+ return Nothing
499+
500+ Just loaded ->
501+ return $ Just $ Map.union (Map.fromList loaded) (Map.fromList same)
502
502
503
503
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
530
530
531
531
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 =
722 [] ->
722 [] ->
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
726
726
727
727
728addErrors :: Result -> [Error.Module] -> [Error.Module]
728addErrors :: Result -> [Error.Module] -> [Error.Module]
@@ -810,6 +810,93 @@ toDocs result =
810
810
811
811
812
812
813+--------------------------------------------------------------------------------
814+------ NOW FOR SOME REPL STUFF -------------------------------------------------
815+--------------------------------------------------------------------------------
816+
817+
818+-- FROM REPL
819+
820+
821+data ReplArtifacts =
822+ ReplArtifacts
823+ { _repl_home :: ModuleName.Canonical
824+ , _repl_modules :: [Module]
825+ , _repl_localizer :: L.Localizer
826+ , _repl_annotations :: Map.Map Name.Name Can.Annotation
827+ }
828+
829+
830+fromRepl :: FilePath -> Details.Details -> B.ByteString -> IO (Either Exit.Repl ReplArtifacts)
831+fromRepl root details source =
832+ let
833+ env@(Env _ _ pkg _ _ _) = makeEnv Reporting.ignorer root details
834+ in
835+ case Parse.fromByteString pkg source of
836+ Left syntaxError ->
837+ return $ Left $ Exit.ReplBadInput source $ Error.BadSyntax syntaxError
838+
839+ Right modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
840+ do dmvar <- Details.loadInterfaces root details
841+
842+ let deps = map Src.getImportName imports
843+ mvar <- newMVar Map.empty
844+ crawlDeps env mvar deps ()
845+
846+ statuses <- traverse readMVar =<< readMVar mvar
847+ midpoint <- checkMidpoint dmvar statuses
848+
849+ case midpoint of
850+ Left problem ->
851+ return $ Left $ Exit.ReplProjectProblem problem
852+
853+ Right foreigns ->
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
861+
862+
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 =
865+ let
866+ compileInput ifaces =
867+ case Compile.compile pkg ifaces modul of
868+ Right (Compile.Artifacts canonical annotations objects) ->
869+ let
870+ h = Can._name canonical
871+ m = Fresh (Src.getName modul) (I.fromModule pkg canonical annotations) objects
872+ ms = Map.foldrWithKey addInside [] results
873+ in
874+ return $ Right $ ReplArtifacts h (m:ms) (L.fromModule modul) annotations
875+
876+ Left errors ->
877+ return $ Left $ Exit.ReplBadInput source errors
878+ in
879+ case depsStatus of
880+ DepsChange ifaces ->
881+ compileInput ifaces
882+
883+ DepsSame same cached ->
884+ do maybeLoaded <- loadInterfaces root same cached
885+ case maybeLoaded of
886+ Just ifaces -> compileInput ifaces
887+ Nothing -> return $ Left $ Exit.ReplBadCache
888+
889+ DepsBlock ->
890+ case Map.foldr addErrors [] results of
891+ [] -> return $ Left $ Exit.ReplBlocked
892+ e:es -> return $ Left $ Exit.ReplBadLocalDeps e es
893+
894+ DepsNotFound problems ->
895+ return $ Left $ Exit.ReplBadInput source $ Error.BadImports $
896+ toImportErrors env resultMVars imports problems
897+
898+
899+
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
995
1082
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
999− Nothing ->
1000− return ROutsideBlocked
1086+ Nothing -> return ROutsideBlocked
1001−
1002− Just loaded ->
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
1005
1088
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)
1042
1125
1043 Right mains ->
1126 Right mains ->
1044 Right $ Artifacts pkg foreigns mains $
1127 Right $ Artifacts pkg foreigns mains $