1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
13import Control.Monad.Trans (liftIO)
14import qualified Data.ByteString.Builder as B
15import qualified Data.List.NonEmpty as NonEmpty
16import qualified Data.Map as Map
17import Data.Monoid ((<>))
18import qualified System.Directory as Dir
19import qualified System.FilePath as FP
20import System.FilePath ((</>))
22import qualified Elm.Compiler.Module as Module
23import qualified Elm.Compiler.Objects as Obj
24import qualified Elm.Name as N
25import qualified Elm.Package as Pkg
27import qualified Elm.Project.Json as Project
28import qualified Elm.Project.Summary as Summary
29import qualified File.Args as Args
30import qualified File.Crawl as Crawl
31import qualified File.IO as IO
32import qualified Generate.Functions as Functions
33import qualified Reporting.Task as Task
34import qualified Stuff.Paths as Paths
35import Terminal.Args (Parser(..), suggestFiles)
46 , _target :: Obj.Target
47 , _output :: Maybe Output
51generate :: Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
52generate options summary graph@(Crawl.Graph args _ _ _ _) =
58 generateMonolith options summary graph (NonEmpty.toList names)
65generateMonolith :: Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
66generateMonolith (Options _ debug target output_) summary@(Summary.Summary _ project _ ifaces _) graph names =
68 objectGraph <- organize summary graph
69 let pkg = Project.getName project
70 let roots = map (Module.Canonical pkg) names
71 let (Right builder) = Obj.generate debug target ifaces objectGraph roots
73 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
78 IO.writeBuilder "elm.js" monolith
83 Just (Custom maybeDir fileName) ->
84 do path <- safeCustomPath maybeDir fileName
85 IO.writeBuilder path monolith
89-- GENERATE REPL MONOLITH
92generateReplFile :: Summary.Summary -> Crawl.Result -> N.Name -> Task.Task FilePath
93generateReplFile summary@(Summary.Summary _ project _ ifaces _) graph name =
95 objectGraph <- organize summary graph
97 let home = Module.Canonical (Project.getName project) "ElmRepl"
98 let builder = Obj.generateForRepl ifaces objectGraph home name
100 liftIO $ IO.writeBuilder Paths.temp $
101 replRecovery <> "(function(){\n'use strict';" <> Functions.functions <> builder <> "}());"
106replRecovery :: B.Builder
108 "process.on('uncaughtException', function(err) { process.stderr.write(err.toString()); process.exit(1); });"
115organize :: Summary.Summary -> Crawl.Result -> Task.Task Obj.Graph
116organize (Summary.Summary root _ _ _ deps) (Crawl.Graph _ locals _ _ _) =
117 do localObjs <- Obj.unions <$> traverse (loadModuleObj root) (Map.keys locals)
118 foreignObjs <- Obj.unions <$> traverse loadPackageObj (Map.toList deps)
119 return (Obj.union localObjs foreignObjs)
122loadModuleObj :: FilePath -> Module.Raw -> Task.Task Obj.Graph
123loadModuleObj root name =
124 IO.readBinary (Paths.elmo root name)
127loadPackageObj :: ( Pkg.Name, (Pkg.Version, deps) ) -> Task.Task Obj.Graph
128loadPackageObj ( name, (version,_) ) =
129 do dir <- Task.getPackageCacheDirFor name version
130 IO.readBinary (dir </> "objs.dat")
139 | Custom (Maybe FilePath) FilePath
142safeCustomPath :: Maybe FilePath -> FilePath -> IO FilePath
143safeCustomPath maybeDirectory fileName =
144 case maybeDirectory of
149 do Dir.createDirectoryIfMissing True dir
150 return (dir </> fileName)
157output :: Parser Output
160 { _singular = "output file"
161 , _plural = "output files"
162 , _parser = parseOutput
163 , _suggest = suggestFiles ["js","html"]
164 , _examples = exampleOutput
168parseOutput :: String -> Maybe Output
170 if string == "/dev/null" || string == "NUL" || string == "$null" then
173 else if FP.takeExtension string == "js" then
180toCustom :: String -> Maybe Output
182 case FP.splitPath string of
187 Just $ Custom Nothing name
190 Just $ Custom (Just (FP.joinPath (init segments))) (last segments)
193exampleOutput :: String -> IO [String]
195 return [ "elm.js", "index.html", "/dev/null" ]
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list