@@ -25,10 +25,10 @@ import Control.Monad
2525import Control.Monad.Error.Class (MonadError (.. ))
2626import Control.Monad.Reader
2727import Control.Monad.Supply (evalSupplyT )
28+ import Control.Monad.Supply.Class (MonadSupply ())
2829import Control.Monad.Writer
2930
3031import Data.Maybe (fromMaybe )
31- import Data.Traversable (traverse )
3232import Data.Version (showVersion )
3333
3434import Options.Applicative as Opts
@@ -83,7 +83,7 @@ compile (PSCOptions input inputForeign opts stdin output externs usePrefix) = do
8383 Right ((ms, foreigns), warnings) -> do
8484 when (P. nonEmpty warnings) $
8585 hPutStrLn stderr (P. prettyPrintMultipleWarnings (P. optionsVerboseErrors opts) warnings)
86- case runPSC opts (compileJS ( map snd ms) foreigns prefix) of
86+ case runPSC opts (compileJS ms foreigns prefix) of
8787 Left errs -> do
8888 hPutStrLn stderr (P. prettyPrintMultipleErrors (P. optionsVerboseErrors opts) errs)
8989 exitFailure
@@ -99,33 +99,39 @@ compile (PSCOptions input inputForeign opts stdin output externs usePrefix) = do
9999 exitSuccess
100100
101101parseInputs :: (Functor m , Applicative m , MonadError P. MultipleErrors m , MonadWriter P. MultipleErrors m )
102- => [(Maybe FilePath , String )] -> [(FilePath , P. ForeignJS )] -> m ([( Maybe FilePath , P. Module) ], M. Map P. ModuleName String )
102+ => [(Maybe FilePath , String )] -> [(FilePath , P. ForeignJS )] -> m ([P. Module ], M. Map P. ModuleName ( FilePath , P. ForeignJS ) )
103103parseInputs modules foreigns =
104- (,) <$> P. parseModulesFromFiles (fromMaybe " " ) modules
104+ (,) <$> ( map snd <$> P. parseModulesFromFiles (fromMaybe " " ) modules)
105105 <*> P. parseForeignModulesFromFiles foreigns
106106
107107compileJS :: forall m . (Functor m , Applicative m , MonadError P. MultipleErrors m , MonadWriter P. MultipleErrors m , MonadReader (P. Options P. Compile ) m )
108- => [P. Module ] -> M. Map P. ModuleName P. ForeignJS -> [String ] -> m (String , String )
108+ => [P. Module ] -> M. Map P. ModuleName ( FilePath , P. ForeignJS) -> [String ] -> m (String , String )
109109compileJS ms foreigns prefix = do
110110 (modulesToCodeGen, env, nextVar, exts) <- P. compile ms
111- js <- concat <$> evalSupplyT nextVar (traverse codegenModule modulesToCodeGen)
111+ js <- concat <$> evalSupplyT nextVar (P. parU modulesToCodeGen codegenModule )
112112 js' <- generateMain env js
113113 let pjs = unlines $ map (" // " ++ ) prefix ++ [P. prettyPrintJS js']
114114 return (pjs, exts)
115115
116116 where
117117
118+ codegenModule :: (Functor n , Applicative n , MonadError P. MultipleErrors n , MonadWriter P. MultipleErrors n , MonadReader (P. Options P. Compile ) n , MonadSupply n )
119+ => CF. Module CF. Ann -> n [J. JS ]
118120 codegenModule m =
119121 let requiresForeign = not $ null (CF. moduleForeign m)
120- in case CF. moduleName m `M.lookup` foreigns of
121- Just js | not requiresForeign -> error " Found unnecessary foreign module"
122- | otherwise -> J. moduleToJs m $ Just $
123- J. JSApp (J. JSFunction Nothing [] $
124- J. JSBlock [ J. JSVariableIntroduction " exports" (Just $ J. JSObjectLiteral [] )
125- , J. JSRaw js
126- , J. JSReturn (J. JSVar " exports" )
127- ]) []
128- Nothing | requiresForeign -> error " Foreign module missing"
122+ mn = CF. moduleName m
123+ in case mn `M.lookup` foreigns of
124+ Just (path, js)
125+ | not requiresForeign -> do
126+ tell $ P. errorMessage $ P. UnnecessaryFFIModule mn path
127+ J. moduleToJs m Nothing
128+ | otherwise -> J. moduleToJs m $ Just $
129+ J. JSApp (J. JSFunction Nothing [] $
130+ J. JSBlock [ J. JSVariableIntroduction " exports" (Just $ J. JSObjectLiteral [] )
131+ , J. JSRaw js
132+ , J. JSReturn (J. JSVar " exports" )
133+ ]) []
134+ Nothing | requiresForeign -> throwError . P. errorMessage $ P. MissingFFIModule mn
129135 | otherwise -> J. moduleToJs m Nothing
130136
131137 generateMain :: P. Environment -> [J. JS ] -> m [J. JS ]
0 commit comments