on 32ff950 help sign in
elk/builder/src/Generate/Output.hs
117 lines 3.5 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.Output
4 ( generate
5 , generateReplFile
6 )
7 where
10import Control.Monad.Trans (liftIO)
11import qualified Data.ByteString.Builder as B
12import qualified Data.List.NonEmpty as NonEmpty
13import qualified Data.Map as Map
14import Data.Monoid ((<>))
15import System.FilePath ((</>))
17import qualified Elm.Compiler.Module as Module
18import qualified Elm.Compiler.Objects as Obj
19import qualified Elm.Name as N
20import qualified Elm.Package as Pkg
22import qualified Elm.Project.Flags as Flags
23import qualified Elm.Project.Json as Project
24import qualified Elm.Project.Summary as Summary
25import qualified File.Args as Args
26import qualified File.Crawl as Crawl
27import qualified File.IO as IO
28import qualified Generate.Functions as Functions
29import qualified Reporting.Task as Task
30import qualified Stuff.Paths as Paths
34-- GENERATE
37generate :: Flags.Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
38generate options summary graph@(Crawl.Graph args _ _ _ _) =
39 case args of
40 Args.Pkg _ ->
41 return ()
43 Args.Roots names ->
44 generateMonolith options summary graph (NonEmpty.toList names)
48-- GENERATE MONOLITH
51generateMonolith :: Flags.Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
52generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _ project _ ifaces _) graph names =
53 do
54 objectGraph <- organize summary graph
55 let pkg = Project.getName project
56 let roots = map (Module.Canonical pkg) names
57 let (Right builder) = Obj.generate debug target ifaces objectGraph roots
58 let monolith =
59 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
61 liftIO $
62 case output of
63 Nothing ->
64 IO.writeBuilder "elm.js" monolith
66 Just Flags.None ->
67 return ()
69 Just (Flags.Custom maybeDir fileName) ->
70 do path <- Flags.safeCustomPath maybeDir fileName
71 IO.writeBuilder path monolith
75-- GENERATE REPL MONOLITH
78generateReplFile :: Summary.Summary -> Crawl.Result -> N.Name -> Task.Task FilePath
79generateReplFile summary@(Summary.Summary _ project _ ifaces _) graph name =
80 do
81 objectGraph <- organize summary graph
83 let home = Module.Canonical (Project.getName project) "ElmRepl"
84 let builder = Obj.generateForRepl ifaces objectGraph home name
86 liftIO $ IO.writeBuilder Paths.temp $
87 replRecovery <> "(function(){\n'use strict';" <> Functions.functions <> builder <> "}());"
89 return Paths.temp
92replRecovery :: B.Builder
93replRecovery =
94 "process.on('uncaughtException', function(err) { process.stderr.write(err.toString()); process.exit(1); });"
98-- ORGANIZE
101organize :: Summary.Summary -> Crawl.Result -> Task.Task Obj.Graph
102organize (Summary.Summary root _ _ _ deps) (Crawl.Graph _ locals _ _ _) =
103 do localObjs <- Obj.unions <$> traverse (loadModuleObj root) (Map.keys locals)
104 foreignObjs <- Obj.unions <$> traverse loadPackageObj (Map.toList deps)
105 return (Obj.union localObjs foreignObjs)
108loadModuleObj :: FilePath -> Module.Raw -> Task.Task Obj.Graph
109loadModuleObj root name =
110 IO.readBinary (Paths.elmo root name)
113loadPackageObj :: ( Pkg.Name, (Pkg.Version, deps) ) -> Task.Task Obj.Graph
114loadPackageObj ( name, (version,_) ) =
115 do dir <- Task.getPackageCacheDirFor name version
116 IO.readBinary (dir </> "objs.dat")