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 =
67 objectGraph <- organize summary graph
68 let pkg = Project.getName project
69 let roots = map (Module.Canonical pkg) names
70 let (Right builder) = Obj.generate debug target ifaces objectGraph roots
72 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
77 IO.writeBuilder "elm.js" monolith
82 Just (Custom maybeDir fileName) ->
83 do path <- safeCustomPath maybeDir fileName
84 IO.writeBuilder path monolith
88-- GENERATE REPL MONOLITH
91generateReplFile :: Summary.Summary -> Crawl.Result -> N.Name -> Task.Task FilePath
92generateReplFile summary@(Summary.Summary _ project _ ifaces _) graph name =
94 objectGraph <- organize summary graph
96 let home = Module.Canonical (Project.getName project) "ElmRepl"
97 let builder = Obj.generateForRepl ifaces objectGraph home name
99 liftIO $ IO.writeBuilder Paths.temp $
100 replRecovery <> "(function(){\n'use strict';" <> Functions.functions <> builder <> "}());"
105replRecovery :: B.Builder
107 "process.on('uncaughtException', function(err) { process.stderr.write(err.toString()); process.exit(1); });"
114organize :: Summary.Summary -> Crawl.Result -> Task.Task Obj.Graph
115organize (Summary.Summary root _ _ _ deps) (Crawl.Graph _ locals _ _ _) =
116 do localObjs <- Obj.unions <$> traverse (loadModuleObj root) (Map.keys locals)
117 foreignObjs <- Obj.unions <$> traverse loadPackageObj (Map.toList deps)
118 return (Obj.union localObjs foreignObjs)
121loadModuleObj :: FilePath -> Module.Raw -> Task.Task Obj.Graph
122loadModuleObj root name =
123 IO.readBinary (Paths.elmo root name)
126loadPackageObj :: ( Pkg.Name, (Pkg.Version, deps) ) -> Task.Task Obj.Graph
127loadPackageObj ( name, (version,_) ) =
128 do dir <- Task.getPackageCacheDirFor name version
129 IO.readBinary (dir </> "objs.dat")
138 | Custom (Maybe FilePath) FilePath
141safeCustomPath :: Maybe FilePath -> FilePath -> IO FilePath
142safeCustomPath maybeDirectory fileName =
143 case maybeDirectory of
148 do Dir.createDirectoryIfMissing True dir
149 return (dir </> fileName)
156output :: Parser Output
159 { _singular = "output file"
160 , _plural = "output files"
161 , _parser = parseOutput
162 , _suggest = suggestFiles ["js","html"]
163 , _examples = exampleOutput
167parseOutput :: String -> Maybe Output
169 if string == "/dev/null" || string == "NUL" || string == "$null" then
172 else if FP.takeExtension string == ".js" then
179toCustom :: String -> Maybe Output
181 case FP.splitPath string of
186 Just $ Custom Nothing name
189 Just $ Custom (Just (FP.joinPath (init segments))) (last segments)
192exampleOutput :: String -> IO [String]
194 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