git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Improve let declaration handling
6e719f4Gary Burgess
psci/Main.hs+36−27
@@ -17,46 +17,40 @@
17
17
18module Main where
18module Main where
19
19
20−import Commands
20+import Data.Foldable (traverse_)
21+import Data.List (intercalate, isPrefixOf, nub, sortBy, sort)
22+import Data.Maybe (mapMaybe)
23+import Data.Traversable (traverse)
24+import Data.Version (showVersion)
25+import qualified Data.Map as M
21
26
22import Control.Applicative
27import Control.Applicative
23import Control.Monad
28import Control.Monad
29+import Control.Monad.Error (ErrorT(..), MonadError)
30+import Control.Monad.Error.Class (MonadError(..))
24import Control.Monad.Trans.Class
31import Control.Monad.Trans.Class
25import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)
32import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)
26import Control.Monad.Trans.State.Strict
33import Control.Monad.Trans.State.Strict
27import qualified Control.Monad.Trans.State.Lazy as L
34import qualified Control.Monad.Trans.State.Lazy as L
28−import Control.Monad.Error (ErrorT(..), MonadError)
29−import Control.Monad.Error.Class (MonadError(..))
30−
31−import Data.List (intercalate, isPrefixOf, nub, sortBy, sort)
32−import Data.Maybe (mapMaybe)
33−import Data.Foldable (traverse_)
34−import Data.Version (showVersion)
35−import Data.Traversable (traverse)
36−
37−import Parser
38
35
39−import System.IO.Error (tryIOError)
40import System.Console.Haskeline
36import System.Console.Haskeline
41−import System.Directory
42− (createDirectoryIfMissing, getModificationTime, doesFileExist,
37+import System.Directory (createDirectoryIfMissing, getModificationTime, doesFileExist, findExecutable, getHomeDirectory, getCurrentDirectory)
43− findExecutable, getHomeDirectory, getCurrentDirectory)
44−import System.Process (readProcessWithExitCode)
45import System.Exit
38import System.Exit
46−import System.FilePath
47− (pathSeparator, takeDirectory, (</>), isPathSeparator)
39+import System.FilePath (pathSeparator, takeDirectory, (</>), isPathSeparator)
40+import System.IO.Error (tryIOError)
41+import System.Process (readProcessWithExitCode)
48import qualified System.Console.CmdTheLine as Cmd
42import qualified System.Console.CmdTheLine as Cmd
43+import qualified System.IO.UTF8 as U (writeFile, putStrLn, print, readFile)
49
44
50import Text.Parsec (ParseError)
45import Text.Parsec (ParseError)
51
46
52−import qualified Data.Map as M
53import qualified Language.PureScript as P
47import qualified Language.PureScript as P
54−import qualified Paths_purescript as Paths
55−import qualified System.IO.UTF8 as U
56− (writeFile, putStrLn, print, readFile)
57−import qualified Language.PureScript.Names as N
58import qualified Language.PureScript.Declarations as D
48import qualified Language.PureScript.Declarations as D
59−import qualified Language.PureScript.Constants as C
49+import qualified Language.PureScript.Names as N
50+import qualified Paths_purescript as Paths
51+
52+import Commands
53+import Parser
60
54
61-- |
55-- |
62-- The PSCI state.
56-- The PSCI state.
@@ -316,6 +310,23 @@ handleDeclaration value = do
316 Just (ExitFailure _, _, err) -> PSCI $ outputStrLn err
310 Just (ExitFailure _, _, err) -> PSCI $ outputStrLn err
317 Nothing -> PSCI $ outputStrLn "Couldn't find node.js"
311 Nothing -> PSCI $ outputStrLn "Couldn't find node.js"
318
312
313+-- |
314+-- Takes a let declaration and updates the environment, then run a make. If the declaration fails,
315+-- restore the pre-let environment.
316+--
317+handleLet :: (P.Expr -> P.Expr) -> PSCI ()
318+handleLet l = do
319+ st <- PSCI $ lift get
320+ PSCI $ lift $ modify (updateLets l)
321+ st' <- PSCI $ lift get
322+ let m = createTemporaryModule False st' (P.ObjectLiteral [])
323+ e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st' ++ [(Left P.RebuildAlways, m)]) []
324+ case e of
325+ Left err -> do
326+ PSCI $ outputStrLn err
327+ PSCI $ lift (put st)
328+ Right _ -> return ()
329+
319-- |
330-- |
320-- Show actual loaded modules in psci.
331-- Show actual loaded modules in psci.
321--
332--
@@ -445,9 +456,7 @@ handleCommand :: Command -> PSCI ()
445handleCommand (Expression val) = handleDeclaration val
456handleCommand (Expression val) = handleDeclaration val
446handleCommand Help = PSCI $ outputStrLn helpMessage
457handleCommand Help = PSCI $ outputStrLn helpMessage
447handleCommand (Import moduleName) = handleImport moduleName
458handleCommand (Import moduleName) = handleImport moduleName
448−handleCommand (Let l) = do
459+handleCommand (Let l) = handleLet l
449− PSCI $ lift $ modify (updateLets l)
450− handleDeclaration (D.Var (N.Qualified (Just $ N.ModuleName [N.ProperName C.prelude]) (N.Ident C.unit)))
451handleCommand (LoadFile filePath) = do
460handleCommand (LoadFile filePath) = do
452 absPath <- psciIO $ expandTilde filePath
461 absPath <- psciIO $ expandTilde filePath
453 exists <- psciIO $ doesFileExist absPath
462 exists <- psciIO $ doesFileExist absPath