@@ -119,54 +119,65 @@ class MonadMake m where
119-- If timestamps have not changed, the externs file can be used to provide the module's types without
119-- If timestamps have not changed, the externs file can be used to provide the module's types without
120-- having to typecheck the module again.
120-- having to typecheck the module again.
122−make :: (Monad m, MonadMake m) => Options -> [(FilePath, Module)] -> m ()
122+make :: (Functor m, Monad m, MonadMake m) => Options -> [(FilePath, Module)] -> m ()
123make opts ms = do
123make opts ms = do
124 let filePathMap = M.fromList (map (\(fp, (Module mn _ _)) -> (mn, fp)) ms)
124 let filePathMap = M.fromList (map (\(fp, (Module mn _ _)) -> (mn, fp)) ms)
126− desugared <- liftError $ do
127− sorted <- sortModules (map snd ms)
126+ sorted <- liftError $ sortModules (map snd ms)
129− go initEnvironment filePathMap desugared
132− go :: (Monad m, MonadMake m) => Environment -> M.Map ModuleName FilePath -> [Module] -> m ()
133− go _ _ [] = return ()
134− go env filePathMap (Module moduleName' decls exps : ms') = do
128+ marked <- forM sorted $ \m@(Module moduleName' _ _) -> do
135 let filePath = toFileName moduleName'
129 let filePath = toFileName moduleName'
136− let jsFile = "js" ++ pathSeparator : filePath ++ ".js"
131+ jsFile = "js" ++ pathSeparator : filePath ++ ".js"
137 externsFile = "externs" ++ pathSeparator : filePath ++ ".externs"
132 externsFile = "externs" ++ pathSeparator : filePath ++ ".externs"
133+ inputFile = fromMaybe (error "Input file is undefined in make") $ M.lookup moduleName' filePathMap
139 jsTimestamp <- getTimestamp jsFile
135 jsTimestamp <- getTimestamp jsFile
140 externsTimestamp <- getTimestamp externsFile
136 externsTimestamp <- getTimestamp externsFile
142− let inputFile = fromMaybe (error "Input file is undefined in make") $ M.lookup moduleName' filePathMap
143 inputTimestamp <- getTimestamp inputFile
137 inputTimestamp <- getTimestamp inputFile
146− _ | inputTimestamp < min jsTimestamp externsTimestamp -> do
139+ case inputTimestamp < min jsTimestamp externsTimestamp of
147− externs <- readTextFile externsFile
141+ externs <- readTextFile externsFile
148− externsModules <- liftError . either (Left . show) Right $ P.runIndentParser externsFile P.parseModules externs
142+ externsModules <- liftError . either (Left . show) Right $ P.runIndentParser externsFile P.parseModules externs
149− case externsModules of
143+ case externsModules of
150− [m@(Module moduleName'' _ _)] | moduleName' == moduleName'' -> do
144+ [m'@(Module moduleName'' _ _)] | moduleName' == moduleName'' -> return (True, m')
151− [Module _ typings _] <- liftError $ desugar [m]
152− (_, env') <- liftError . runCheck' env $ do
153− modify (\s -> s { checkCurrentModule = Just moduleName' })
154− typeCheckAll Nothing moduleName' typings
156− _ -> liftError . Left $ "Externs file " ++ externsFile ++ " was invalid"
145+ _ -> liftError . Left $ "Externs file " ++ externsFile ++ " was invalid"
157− | otherwise -> do
146+ False -> return (False, m)
148+ desugared <- liftError $ zip (map fst marked) <$> desugar (map snd marked)
150+ go initEnvironment desugared
153+ go :: (Functor m, Monad m, MonadMake m) => Environment -> [(Bool, Module)] -> m ()
155+ go env ((True, Module moduleName' typings _) : ms') = do
156+ (_, env') <- liftError . runCheck' env $ do
157+ modify (\s -> s { checkCurrentModule = Just moduleName' })
158+ typeCheckAll Nothing moduleName' typings
161+ go env ((False, Module moduleName' decls exps) : ms') = do
162+ let filePath = toFileName moduleName'
163+ jsFile = "js" ++ pathSeparator : filePath ++ ".js"
164+ externsFile = "externs" ++ pathSeparator : filePath ++ ".externs"
158− (elaborated, env') <- liftError . runCheck' env $ do
166+ (elaborated, env') <- liftError . runCheck' env $ do
159− modify (\s -> s { checkCurrentModule = Just moduleName' })
167+ modify (\s -> s { checkCurrentModule = Just moduleName' })
160− typeCheckAll Nothing moduleName' decls
168+ typeCheckAll Nothing moduleName' decls
161− regrouped <- liftError . createBindingGroups moduleName' . collapseBindingGroups $ elaborated
170+ regrouped <- liftError . createBindingGroups moduleName' . collapseBindingGroups $ elaborated
162− let mod' = Module moduleName' regrouped exps
172+ let mod' = Module moduleName' regrouped exps
163− js = moduleToJs opts mod' env'
173+ js = moduleToJs opts mod' env'
164− exts = moduleToPs mod' env'
174+ exts = moduleToPs mod' env'
165− js' = maybe "" (prettyPrintJS . return . wrapExportsContainer opts . return) js
175+ js' = maybe "" (prettyPrintJS . return . wrapExportsContainer opts . return) js
166− writeTextFile jsFile js'
177+ writeTextFile jsFile js'
167− writeTextFile externsFile exts
178+ writeTextFile externsFile exts
169− go env' filePathMap ms'
180+ go env' ms'
171 toFileName :: ModuleName -> FilePath
182 toFileName :: ModuleName -> FilePath
172 toFileName (ModuleName ps) = intercalate [pathSeparator] . map runProperName $ ps
183 toFileName (ModuleName ps) = intercalate [pathSeparator] . map runProperName $ ps