@@ -1,19 +1,17 @@
1{-# LANGUAGE DeriveDataTypeable #-}
1{-# LANGUAGE DeriveDataTypeable #-}
2module Main where
2module Main where
4−import Control.Monad (foldM, when)
4+import Control.Monad
5import qualified Data.Map as Map
5import qualified Data.Map as Map
6−import Data.Either (lefts, rights)
6+import qualified Data.List as List
7−import Data.List (intersect, intercalate, lookup)
8−import Data.Maybe (fromMaybe)
9import Data.Version (showVersion)
7import Data.Version (showVersion)
10import System.Console.CmdArgs
8import System.Console.CmdArgs
11import System.Directory
9import System.Directory
12import System.Exit
10import System.Exit
13import System.FilePath
11import System.FilePath
14import qualified Text.Blaze.Html.Renderer.Pretty as Pretty
13import qualified Text.Blaze.Html.Renderer.Pretty as Pretty
15import qualified Text.Blaze.Html.Renderer.String as Normal
14import qualified Text.Blaze.Html.Renderer.String as Normal
17import qualified Text.Jasmine as JS
15import qualified Text.Jasmine as JS
18import qualified Data.ByteString.Lazy.Char8 as BS
16import qualified Data.ByteString.Lazy.Char8 as BS
@@ -21,9 +19,12 @@ import SourceSyntax.Module
21import Initialize (buildFromSource, getSortedModuleNames)
19import Initialize (buildFromSource, getSortedModuleNames)
22import Generate.JavaScript (jsModule)
20import Generate.JavaScript (jsModule)
23import Generate.Html (createHtml, JSStyle(..), JSSource(..))
21import Generate.Html (createHtml, JSStyle(..), JSSource(..))
24−import qualified Metadata.Libraries as Libraries
25import Paths_Elm
22import Paths_Elm
24+import Text.PrettyPrint as P
25+import qualified Type.Type as Type
27data Flags =
28data Flags =
28 Flags { make :: Bool
29 Flags { make :: Bool
29 , files :: [FilePath]
30 , files :: [FilePath]
@@ -72,6 +73,7 @@ file flags filePath ext = output_directory flags </> replaceExtension filePath e
73elmo :: Flags -> FilePath -> FilePath
74elmo :: Flags -> FilePath -> FilePath
74elmo flags filePath = file flags filePath "elmo"
75elmo flags filePath = file flags filePath "elmo"
76+elmi flags filePath = file flags filePath "elmi"
77buildFile :: Flags -> Int -> Int -> FilePath -> IO Interface
79buildFile :: Flags -> Int -> Int -> FilePath -> IO Interface
@@ -92,20 +94,32 @@ buildFile flags moduleNum numModules filePath =
92 number = "[" ++ show moduleNum ++ " of " ++ show numModules ++ "]"
94 number = "[" ++ show moduleNum ++ " of " ++ show numModules ++ "]"
94 name :: String
96 name :: String
95− name = intercalate "." (splitDirectories (dropExtensions filePath))
97+ name = List.intercalate "." (splitDirectories (dropExtensions filePath))
97 compile :: IO Interface
99 compile :: IO Interface
98 compile = do
100 compile = do
99 putStrLn (number ++ " Compiling " ++ name)
101 putStrLn (number ++ " Compiling " ++ name)
100 source <- readFile filePath
102 source <- readFile filePath
101− obj <-
103+ (js, maybeModule) <-
102− if takeExtension filePath == ".js" then return source else
104+ if takeExtension filePath == ".js" then return (source, Nothing) else
103 case buildFromSource (no_prelude flags) source of
105 case buildFromSource (no_prelude flags) source of
104 Left err -> mapM print err >> exitFailure
106 Left err -> mapM print err >> exitFailure
105− Right modul -> return . jsModule $ (modul :: MetadataModule () ())
107+ Right modul -> return (jsModule modul, Just modul)
106 createDirectoryIfMissing True (output_directory flags)
108 createDirectoryIfMissing True (output_directory flags)
107− writeFile (elmo flags filePath) obj
109+ writeFile (elmo flags filePath) js
110+ writeTypes maybeModule
108− return obj
111+ return js
113+ writeTypes :: Maybe (MetadataModule () ()) -> IO ()
114+ writeTypes maybeModule =
116+ Nothing -> return ()
117+ Just metaModule -> do
118+ tipes <- forM (Map.toList (types metaModule)) $ \(n,t) -> do
119+ pt <- Type.extraPretty t
120+ return $ P.text n <+> P.text ":" <+> pt
121+ writeFile (elmi flags filePath) (P.render $ P.vcat tipes)
111getRuntime :: Flags -> IO FilePath
125getRuntime :: Flags -> IO FilePath
@@ -147,6 +161,6 @@ buildFiles :: Flags -> Int -> Map.Map String Interface -> [FilePath] -> IO ()
147buildFiles _ _ _ [] = return ()
161buildFiles _ _ _ [] = return ()
148buildFiles flags numModules interfaces (filePath:rest) = do
162buildFiles flags numModules interfaces (filePath:rest) = do
149 interface <- buildFile flags (numModules - length rest) numModules filePath
163 interface <- buildFile flags (numModules - length rest) numModules filePath
150− let moduleName = intercalate "." (splitDirectories (dropExtensions filePath))
164+ let moduleName = List.intercalate "." (splitDirectories (dropExtensions filePath))
151 interfaces' = Map.insert moduleName interface interfaces
165 interfaces' = Map.insert moduleName interface interfaces
152 buildFiles flags numModules interfaces' rest
166 buildFiles flags numModules interfaces' rest