@@ -1,4 +1,4 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
1+{-# LANGUAGE OverloadedStrings #-}
3 ( Flags(..)
3 ( Flags(..)
4 , Output(..)
4 , Output(..)
@@ -11,26 +11,18 @@ module Make
14−import Control.Concurrent (MVar, forkIO, newEmptyMVar, newMVar, putMVar, readMVar)
15−import Control.Monad (liftM2)
16import qualified Data.ByteString.Builder as B
14import qualified Data.ByteString.Builder as B
17−import qualified Data.Map as Map
18import qualified Data.Maybe as Maybe
15import qualified Data.Maybe as Maybe
19import qualified Data.NonEmptyList as NE
16import qualified Data.NonEmptyList as NE
20import qualified System.FilePath as FP
17import qualified System.FilePath as FP
22import qualified AST.Optimized as Opt
19import qualified AST.Optimized as Opt
23import qualified Build
20import qualified Build
24−import qualified Elm.Compiler.Type.Extract as Extract
25import qualified Elm.Details as Details
21import qualified Elm.Details as Details
26−import qualified Elm.Interface as I
27import qualified Elm.ModuleName as ModuleName
22import qualified Elm.ModuleName as ModuleName
28−import qualified Elm.Package as Pkg
29import qualified File
23import qualified File
24+import qualified Generate
30import qualified Generate.Html as Html
25import qualified Generate.Html as Html
31−import qualified Generate.JavaScript as Generate
32−import qualified Generate.Mode as Mode
33−import qualified Nitpick.Debug as Nitpick
34import qualified Reporting
26import qualified Reporting
35import qualified Reporting.Exit as Exit
27import qualified Reporting.Exit as Exit
36import qualified Reporting.Task as Task
28import qualified Reporting.Task as Task
@@ -105,7 +97,7 @@ run paths (Flags debug optimize maybeOutput report maybeDocs) =
105 case getNoMains artifacts of
97 case getNoMains artifacts of
107 do builder <- toBuilder root details desiredMode artifacts
99 do builder <- toBuilder root details desiredMode artifacts
108− generate style target builder (getMainNames artifacts)
100+ generate style target builder (Build.getMainNames artifacts)
110 name:names ->
102 name:names ->
111 Task.throw (Exit.MakeNonMainFilesIntoJavaScript name names)
103 Task.throw (Exit.MakeNonMainFilesIntoJavaScript name names)
@@ -133,10 +125,7 @@ getStyle report =
134getRoot :: Task FilePath
126getRoot :: Task FilePath
136− do maybeRoot <- Task.io Stuff.findRoot
128+ Task.mio Exit.MakeNoOutline Stuff.findRoot
138− Nothing -> Task.throw Exit.MakeNeedsOutline
139− Just root -> return root
142getMode :: Bool -> Bool -> Task DesiredMode
131getMode :: Bool -> Bool -> Task DesiredMode
@@ -252,22 +241,6 @@ getNoMain modules main =
258−getMainNames :: Build.Artifacts -> NE.List ModuleName.Raw
259−getMainNames (Build.Artifacts _ _ mains _) =
260− fmap getMainName mains
263−getMainName :: Build.Main -> ModuleName.Raw
266− Build.Inside name -> name
267− Build.Outside name _ _ -> name
271-- GENERATE
244-- GENERATE
@@ -286,150 +259,12 @@ data DesiredMode = Debug | Dev | Prod
288toBuilder :: FilePath -> Details.Details -> DesiredMode -> Build.Artifacts -> Task B.Builder
261toBuilder :: FilePath -> Details.Details -> DesiredMode -> Build.Artifacts -> Task B.Builder
289−toBuilder root details desiredMode (Build.Artifacts pkg ifaces roots modules) =
262+toBuilder root details desiredMode artifacts =
263+ Task.mapError Exit.MakeBadGenerate $
290− case desiredMode of
264+ case desiredMode of
291− Debug ->
265+ Debug -> Generate.debug root details artifacts
292− do loading <- loadObjects root details modules
266+ Dev -> Generate.dev root details artifacts
293− types <- loadTypes root ifaces modules
267+ Prod -> Generate.prod root details artifacts
294− objects <- finalizeObjects loading
295− let mode = Mode.Dev (Just types)
296− let graph = toGlobalGraph objects
297− let mains = gatherMains pkg objects roots
298− return $ Generate.generate mode graph mains
301− do objects <- finalizeObjects =<< loadObjects root details modules
302− let mode = Mode.Dev Nothing
303− let graph = toGlobalGraph objects
304− let mains = gatherMains pkg objects roots
305− return $ Generate.generate mode graph mains
308− do objects <- finalizeObjects =<< loadObjects root details modules
309− checkForDebugUses objects
310− let graph = toGlobalGraph objects
311− let mode = Mode.Prod (Mode.shortenFieldNames graph)
312− let mains = gatherMains pkg objects roots
313− return $ Generate.generate mode graph mains
316−checkForDebugUses :: LoadedObjects -> Task ()
317−checkForDebugUses (LoadedObjects _ locals) =
318− case Map.keys (Map.filter Nitpick.hasDebugUses locals) of
320− m:ms -> Task.throw (Exit.MakeCannotOptimizeDebugValues m ms)
323−toGlobalGraph :: LoadedObjects -> Opt.GlobalGraph
324−toGlobalGraph (LoadedObjects globals locals) =
325− foldr Opt.addLocalGraph globals locals
332−data LoadingObjects =
334− { _foreign_mvar :: MVar (Maybe Opt.GlobalGraph)
335− , _local_mvars :: Map.Map ModuleName.Raw (MVar (Maybe Opt.LocalGraph))
339−loadObjects :: FilePath -> Details.Details -> [Build.Module] -> Task LoadingObjects
340−loadObjects root details modules =
342− do mvar <- Details.loadObjects root details
343− mvars <- traverse (loadObject root) modules
344− return $ LoadingObjects mvar (Map.fromList mvars)
347−loadObject :: FilePath -> Build.Module -> IO (ModuleName.Raw, MVar (Maybe Opt.LocalGraph))
348−loadObject root modul =
350− Build.Fresh name _ graph ->
351− do mvar <- newMVar (Just graph)
354− Build.Cached name _ _ ->
355− do mvar <- newEmptyMVar
356− _ <- forkIO $ putMVar mvar =<< File.readBinary (Stuff.elmo root name)
362− { _foreign :: Opt.GlobalGraph
363− , _locals :: Map.Map ModuleName.Raw Opt.LocalGraph
367−finalizeObjects :: LoadingObjects -> Task LoadedObjects
368−finalizeObjects (LoadingObjects mvar mvars) =
370− do result <- readMVar mvar
371− results <- traverse readMVar mvars
372− case liftM2 LoadedObjects result (sequence results) of
373− Just loaded -> return (Right loaded)
374− Nothing -> return (Left Exit.MakeCannotLoadArtifacts)
381−loadTypes :: FilePath -> Map.Map ModuleName.Canonical I.DependencyInterface -> [Build.Module] -> Task Extract.Types
382−loadTypes root ifaces modules =
384− do mvars <- traverse (loadTypesHelp root) modules
385− let !foreigns = Extract.mergeMany (Map.elems (Map.mapWithKey Extract.fromDependencyInterface ifaces))
386− results <- traverse readMVar mvars
387− case sequence results of
388− Just ts -> return (Right (Extract.merge foreigns (Extract.mergeMany ts)))
389− Nothing -> return (Left Exit.MakeCannotLoadArtifacts)
392−loadTypesHelp :: FilePath -> Build.Module -> IO (MVar (Maybe Extract.Types))
393−loadTypesHelp root modul =
395− Build.Fresh name iface _ ->
396− newMVar (Just (Extract.fromInterface name iface))
398− Build.Cached name _ ciMVar ->
399− do cachedInterface <- readMVar ciMVar
400− case cachedInterface of
402− do mvar <- newEmptyMVar
404− do maybeIface <- File.readBinary (Stuff.elmo root name)
405− putMVar mvar (Extract.fromInterface name <$> maybeIface)
408− Build.Loaded iface ->
409− newMVar (Just (Extract.fromInterface name iface))
419−gatherMains :: Pkg.Name -> LoadedObjects -> NE.List Build.Main -> Map.Map ModuleName.Canonical Opt.Main
420−gatherMains pkg (LoadedObjects _ locals) buildMains =
421− Map.fromList $ Maybe.mapMaybe (lookupMain pkg locals) (NE.toList buildMains)
424−lookupMain :: Pkg.Name -> Map.Map ModuleName.Raw Opt.LocalGraph -> Build.Main -> Maybe (ModuleName.Canonical, Opt.Main)
425−lookupMain pkg locals buildMain =
427− toPair name (Opt.LocalGraph maybeMain _ _) =
428− (,) (ModuleName.Canonical pkg name) <$> maybeMain
431− Build.Inside name -> toPair name =<< Map.lookup name locals
432− Build.Outside name _ g -> toPair name g