@@ -1,19 +1,17 @@
11{-# LANGUAGE DeriveDataTypeable #-}
22module Main where
33
4−import Control.Monad (foldM, when)
4+import Control.Monad
55import qualified Data.Map as Map
6−import Data.Either (lefts, rights)
7−import Data.List (intersect, intercalate, lookup)
8−import Data.Maybe (fromMaybe)
6+import qualified Data.List as List
97import Data.Version (showVersion)
108import System.Console.CmdArgs
119import System.Directory
1210import System.Exit
1311import System.FilePath
12+
1413import qualified Text.Blaze.Html.Renderer.Pretty as Pretty
1514import qualified Text.Blaze.Html.Renderer.String as Normal
16−
1715import qualified Text.Jasmine as JS
1816import qualified Data.ByteString.Lazy.Char8 as BS
1917
@@ -21,9 +19,12 @@ import SourceSyntax.Module
2119import Initialize (buildFromSource, getSortedModuleNames)
2220import Generate.JavaScript (jsModule)
2321import Generate.Html (createHtml, JSStyle(..), JSSource(..))
24−import qualified Metadata.Libraries as Libraries
2522import Paths_Elm
2623
24+import Text.PrettyPrint as P
25+import qualified Type.Type as Type
26+
27+
2728data Flags =
2829 Flags { make :: Bool
2930 , files :: [FilePath]
@@ -72,6 +73,7 @@ file flags filePath ext = output_directory flags </> replaceExtension filePath e
7273
7374elmo :: Flags -> FilePath -> FilePath
7475elmo flags filePath = file flags filePath "elmo"
76+elmi flags filePath = file flags filePath "elmi"
7577
7678
7779buildFile :: Flags -> Int -> Int -> FilePath -> IO Interface
@@ -92,20 +94,32 @@ buildFile flags moduleNum numModules filePath =
9294 number = "[" ++ show moduleNum ++ " of " ++ show numModules ++ "]"
9395
9496 name :: String
95− name = intercalate "." (splitDirectories (dropExtensions filePath))
97+ name = List.intercalate "." (splitDirectories (dropExtensions filePath))
9698
9799 compile :: IO Interface
98100 compile = do
99101 putStrLn (number ++ " Compiling " ++ name)
100102 source <- readFile filePath
101− obj <-
102− if takeExtension filePath == ".js" then return source else
103+ (js, maybeModule) <-
104+ if takeExtension filePath == ".js" then return (source, Nothing) else
103105 case buildFromSource (no_prelude flags) source of
104106 Left err -> mapM print err >> exitFailure
105− Right modul -> return . jsModule $ (modul :: MetadataModule () ())
107+ Right modul -> return (jsModule modul, Just modul)
106108 createDirectoryIfMissing True (output_directory flags)
107− writeFile (elmo flags filePath) obj
108− return obj
109+ writeFile (elmo flags filePath) js
110+ writeTypes maybeModule
111+ return js
112+
113+ writeTypes :: Maybe (MetadataModule () ()) -> IO ()
114+ writeTypes maybeModule =
115+ case maybeModule of
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)
122+
109123
110124
111125getRuntime :: Flags -> IO FilePath
@@ -147,6 +161,6 @@ buildFiles :: Flags -> Int -> Map.Map String Interface -> [FilePath] -> IO ()
147161buildFiles _ _ _ [] = return ()
148162buildFiles flags numModules interfaces (filePath:rest) = do
149163 interface <- buildFile flags (numModules - length rest) numModules filePath
150− let moduleName = intercalate "." (splitDirectories (dropExtensions filePath))
164+ let moduleName = List.intercalate "." (splitDirectories (dropExtensions filePath))
151165 interfaces' = Map.insert moduleName interface interfaces
152166 buildFiles flags numModules interfaces' rest