@@ -24,6 +24,7 @@ import Parse.Module (getModuleName)
2424import Initialize (buildFromSource, getSortedDependencies)
2525import Generate.JavaScript (jsModule)
2626import Generate.Html (createHtml, JSSource(..))
27+import qualified InterfaceSerialization as IS
2728import Paths_Elm
2829
2930import SourceSyntax.PrettyPrint (pretty, variable)
@@ -39,9 +40,9 @@ data Flags =
3940 , print_types :: Bool
4041 , scripts :: [FilePath]
4142 , no_prelude :: Bool
42− , cache_dir :: FilePath
43− , build_dir :: FilePath
44− , src_dir :: [FilePath]
43+ , cache_dir :: FilePath
44+ , build_dir :: FilePath
45+ , src_dir :: [FilePath]
4546 }
4647 deriving (Data,Typeable,Show,Eq)
4748
@@ -93,27 +94,30 @@ elmo flags filePath = cachePath flags filePath "elmo"
9394elmi :: Flags -> FilePath -> FilePath
9495elmi flags filePath = cachePath flags filePath "elmi"
9596
97+buildFile :: Flags -> Int -> Int -> Interfaces -> FilePath -> IO (String, ModuleInterface)
98+buildFile flags moduleNum numModules interfaces filePath = do
99+ compiled <- alreadyCompiled
100+ if compiled then do
101+ bytes <- IS.loadInterface (elmi flags filePath)
102+ case bytes >>= IS.interfaceDecode (elmi flags filePath) >>=
103+ IS.validVersion filePath of
96104
97−buildFile :: Flags -> Int -> Int -> Interfaces -> FilePath -> IO (String,ModuleInterface)
98−buildFile flags moduleNum numModules interfaces filePath =
99− do compiled <- alreadyCompiled
100− case compiled of
101− False -> compile
102− True -> do
103− handle <- openBinaryFile (elmi flags filePath) ReadMode
104− bits <- L.hGetContents handle
105− let info :: (String, ModuleInterface)
106− info = Binary.decode bits
107− modInterface = snd info
105+ Left err -> do
106+ hPutStrLn stderr err
107+ exitFailure
108108
109− when (print_types flags)
110− (printTypes interfaces
111− (iTypes modInterface)
112− (iAliases modInterface)
113− (iImports modInterface))
109+ Right (name, interface) -> do
110+ when (print_types flags)
111+ (printTypes interfaces
112+ (iTypes interface)
113+ (iAliases interface)
114+ (iImports interface))
115+
116+ return (name, interface)
117+
118+ else
119+ compile
114120
115− L.length bits `seq` hClose handle
116− return info
117121 where
118122 alreadyCompiled :: IO Bool
119123 alreadyCompiled = do
@@ -140,6 +144,7 @@ buildFile flags moduleNum numModules interfaces filePath =
140144
141145 createDirectoryIfMissing True (cache_dir flags)
142146 createDirectoryIfMissing True (build_dir flags)
147+
143148 metaModule <-
144149 case buildFromSource (no_prelude flags) interfaces source of
145150 Left errors -> do
@@ -152,6 +157,7 @@ buildFile flags moduleNum numModules interfaces filePath =
152157 (types metaModule) (aliases metaModule) (imports metaModule))
153158
154159 let interface = Canonical.interface name $ ModuleInterface {
160+ iVersion = showVersion version,
155161 iTypes = types metaModule,
156162 iImports = imports metaModule,
157163 iAdts = datatypes metaModule,
@@ -206,12 +212,12 @@ build flags rootFile = do
206212 where
207213 appendToOutput :: BS.ByteString -> FilePath -> IO BS.ByteString
208214 appendToOutput js filePath =
209− do src <- BS.readFile (elmo flags filePath)
210− return (BS.append src js)
215+ do
216+ src <- BS.readFile (elmo flags filePath)
217+ return (BS.append src js)
211218
212219 sources js = map Link (scripts flags) ++ [ Source js ]
213220
214−
215221buildFiles :: Flags -> Int -> Interfaces -> String -> [FilePath] -> IO (String, Interfaces)
216222buildFiles _ _ interfaces moduleName [] = return (moduleName, interfaces)
217223buildFiles flags numModules interfaces _ (filePath:rest) = do