@@ -79,8 +79,8 @@ elmo flags filePath = file flags filePath "elmo"
79elmi flags filePath = file flags filePath "elmi"
79elmi flags filePath = file flags filePath "elmi"
82−buildFile :: Flags -> Int -> Int -> FilePath -> IO ModuleInterface
82+buildFile :: Flags -> Int -> Int -> (Map.Map String ModuleInterface) -> FilePath -> IO ModuleInterface
83−buildFile flags moduleNum numModules filePath =
83+buildFile flags moduleNum numModules interfaces filePath =
84 do compiled <- alreadyCompiled
84 do compiled <- alreadyCompiled
85 if compiled then decodeFile (elmi flags filePath) else compile
85 if compiled then decodeFile (elmi flags filePath) else compile
@@ -105,7 +105,7 @@ buildFile flags moduleNum numModules filePath =
105 source <- readFile filePath
105 source <- readFile filePath
106 createDirectoryIfMissing True (output_directory flags)
106 createDirectoryIfMissing True (output_directory flags)
107 metaModule <-
107 metaModule <-
108− case buildFromSource Map.empty source of
108+ case buildFromSource interfaces source of
109 Left err -> mapM print err >> exitFailure
109 Left err -> mapM print err >> exitFailure
110 Right modul -> return (modul :: MetadataModule () ())
110 Right modul -> return (modul :: MetadataModule () ())
111 if print_types flags then printTypes metaModule else return ()
111 if print_types flags then printTypes metaModule else return ()
@@ -124,11 +124,12 @@ toSrcTypes tipes = Traverse.traverse convert tipes
125 convert t = fmap (Parse.readType . P.render) (Type.extraPretty t)
125 convert t = fmap (Parse.readType . P.render) (Type.extraPretty t)
127−printTypes metaModule =
127+printTypes metaModule = do
128− forM_ (Map.toList $ types metaModule) $ \(n,t) -> do
129+ forM_ (Map.toList $ types metaModule) $ \(n,t) -> do
129 pt <- Type.extraPretty t
130 pt <- Type.extraPretty t
130 print $ P.text n <+> P.text ":" <+> pt
131 print $ P.text n <+> P.text ":" <+> pt
133getRuntime :: Flags -> IO FilePath
134getRuntime :: Flags -> IO FilePath
134getRuntime flags =
135getRuntime flags =
@@ -139,7 +140,7 @@ getRuntime flags =
139build :: Flags -> FilePath -> IO ()
140build :: Flags -> FilePath -> IO ()
140build flags rootFile = do
141build flags rootFile = do
141 files <- if make flags then getSortedModuleNames rootFile else return [rootFile]
142 files <- if make flags then getSortedModuleNames rootFile else return [rootFile]
142− buildFiles flags (length files) Map.empty files
143+ interfaces <- buildFiles flags (length files) Map.empty files
143 js <- foldM appendToOutput "" files
144 js <- foldM appendToOutput "" files
144 case only_js flags of
145 case only_js flags of
145 True -> do
146 True -> do
@@ -165,10 +166,14 @@ build flags rootFile = do
165 [ Source (if minify flags then Minified else Readable) js ]
166 [ Source (if minify flags then Minified else Readable) js ]
168−buildFiles :: Flags -> Int -> Map.Map String ModuleInterface -> [FilePath] -> IO ()
171+ -> Map.Map String ModuleInterface
173+ -> IO (Map.Map String ModuleInterface)
169−buildFiles _ _ _ [] = return ()
174+buildFiles _ _ interfaces [] = return interfaces
170buildFiles flags numModules interfaces (filePath:rest) = do
175buildFiles flags numModules interfaces (filePath:rest) = do
171− interface <- buildFile flags (numModules - length rest) numModules filePath
176+ interface <- buildFile flags (numModules - length rest) numModules interfaces filePath
172 let moduleName = List.intercalate "." (splitDirectories (dropExtensions filePath))
177 let moduleName = List.intercalate "." (splitDirectories (dropExtensions filePath))
173 interfaces' = Map.insert moduleName interface interfaces
178 interfaces' = Map.insert moduleName interface interfaces
174 buildFiles flags numModules interfaces' rest
179 buildFiles flags numModules interfaces' rest