77
88module Main (main ) where
99
10- import Control.Monad (unless , (>=>) )
10+ import Control.Monad (unless , (>=>) , foldM )
1111import Control.Monad.Error.Class (throwError )
1212import Control.Monad.IO.Class (liftIO )
1313import Control.Monad.Logger (runLogger' )
@@ -16,6 +16,7 @@ import qualified Control.Monad.State as State
1616import Control.Monad.Trans (lift )
1717import Control.Monad.Trans.Except (ExceptT (.. ), runExceptT )
1818import Control.Monad.Trans.Reader (runReaderT )
19+ import Control.Monad.Writer.Strict (runWriterT )
1920import qualified Data.Aeson as A
2021import Data.Aeson ((.=) )
2122import Data.Bifunctor (first , second )
@@ -59,8 +60,8 @@ data Error
5960
6061instance A. ToJSON Error
6162
62- server :: [P. ExternsFile ] -> P. Environment -> Int -> IO ()
63- server externs initEnv port = do
63+ server :: [P. ExternsFile ] -> P. Env -> P. Environment -> Int -> IO ()
64+ server externs initNamesEnv initEnv port = do
6465 let compile :: Text -> IO (Either Error ([P. JSONError ], JS ))
6566 compile input
6667 | T. length input > 20000 = return (Left (OtherError " Please limit your input to 20000 characters" ))
@@ -72,7 +73,7 @@ server externs initEnv port = do
7273 Right m | P. getModuleName m == P. ModuleName [P. ProperName " Main" ] -> do
7374 (resultMay, ws) <- runLogger' . runExceptT . flip runReaderT P. defaultOptions $ do
7475 ((P. Module ss coms moduleName elaborated exps, env), nextVar) <- P. runSupplyT 0 $ do
75- desugared <- P. desugar externs [P. importPrim m] >>= \ case
76+ desugared <- P. desugar initNamesEnv externs [P. importPrim m] >>= \ case
7677 [d] -> pure d
7778 _ -> error " desugaring did not produce one module"
7879 P. runCheck' (P. emptyCheckState initEnv) $ P. typeCheckModule desugared
@@ -167,7 +168,9 @@ main = do
167168 let onError f = either (Left . f) Right
168169 e <- runExceptT $ do
169170 modules <- ExceptT $ I. loadAllModules inputFiles
170- ExceptT . I. runMake . I. make $ map (second CST. pureResult) modules
171+ (exts, env) <- ExceptT . I. runMake . I. make $ map (second CST. pureResult) modules
172+ namesEnv <- fmap fst . runWriterT $ foldM P. externsEnv P. primEnv exts
173+ pure (exts, namesEnv, env)
171174 case e of
172175 Left err -> print err >> exitFailure
173- Right (exts, env) -> server exts env port
176+ Right (exts, namesEnv, env) -> server exts namesEnv env port
0 commit comments