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)
45 , _target :: Obj.Target
46 , _output :: Maybe Output
50generate :: Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
51generate options summary graph@(Crawl.Graph args _ _ _ _) =
57 generateMonolith options summary graph (NonEmpty.toList names)
64generateMonolith :: Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
65generateMonolith (Options debug target output_) summary@(Summary.Summary _ project _ ifaces _) graph names =
66 do let pkg = Project.getName project
67 let roots = map (Module.Canonical pkg) names
68 objectGraph <- organize summary graph
69 case Obj.generate debug target ifaces objectGraph roots of
76 "(function(scope){\n'use strict';"
77 <> Functions.functions <> builder <> "}(this));"
82 IO.writeBuilder "elm.js" monolith
87 Just (Custom maybeDir fileName) ->
88 do path <- safeCustomPath maybeDir fileName
89 IO.writeBuilder path monolith
93-- GENERATE REPL MONOLITH
96generateReplFile :: Summary.Summary -> Crawl.Result -> N.Name -> Task.Task FilePath
97generateReplFile summary@(Summary.Summary _ project _ ifaces _) graph name =
99 objectGraph <- organize summary graph
101 let home = Module.Canonical (Project.getName project) "ElmRepl"
102 let builder = Obj.generateForRepl ifaces objectGraph home name
104 liftIO $ IO.writeBuilder Paths.temp $
105 replRecovery <> "(function(){\n'use strict';" <> Functions.functions <> builder <> "}());"
110replRecovery :: B.Builder
112 "process.on('uncaughtException', function(err) { process.stderr.write(err.toString()); process.exit(1); });"
119organize :: Summary.Summary -> Crawl.Result -> Task.Task Obj.Graph
120organize (Summary.Summary root _ _ _ deps) (Crawl.Graph _ locals _ _ _) =
121 do localObjs <- Obj.unions <$> traverse (loadModuleObj root) (Map.keys locals)
122 foreignObjs <- Obj.unions <$> traverse loadPackageObj (Map.toList deps)
123 return (Obj.union localObjs foreignObjs)
126loadModuleObj :: FilePath -> Module.Raw -> Task.Task Obj.Graph
127loadModuleObj root name =
128 IO.readBinary (Paths.elmo root name)
131loadPackageObj :: ( Pkg.Name, (Pkg.Version, deps) ) -> Task.Task Obj.Graph
132loadPackageObj ( name, (version,_) ) =
133 do dir <- Task.getPackageCacheDirFor name version
134 IO.readBinary (dir </> "objs.dat")
143 | Custom (Maybe FilePath) FilePath
146safeCustomPath :: Maybe FilePath -> FilePath -> IO FilePath
147safeCustomPath maybeDirectory fileName =
148 case maybeDirectory of
153 do Dir.createDirectoryIfMissing True dir
154 return (dir </> fileName)
161output :: Parser Output
164 { _singular = "output file"
165 , _plural = "output files"
166 , _parser = parseOutput
167 , _suggest = suggestFiles ["js","html"]
168 , _examples = exampleOutput
172parseOutput :: String -> Maybe Output
174 if string == "/dev/null" || string == "NUL" || string == "$null" then
177 else if FP.takeExtension string == ".js" then
184toCustom :: String -> Maybe Output
186 case FP.splitPath string of
191 Just $ Custom Nothing name
194 Just $ Custom (Just (FP.joinPath (init segments))) (last segments)
197exampleOutput :: String -> IO [String]
199 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