Skip to content

Commit 38db2c6

Browse files
committed
Never rebuild the Prelude. Always rebuild temporary modules in PSCI.
1 parent 9bd4e3e commit 38db2c6

File tree

8 files changed

+41
-29
lines changed

8 files changed

+41
-29
lines changed

psc-docs/Main.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import Control.Monad.Writer
2020
import Control.Arrow (first)
2121
import Data.Function (on)
2222
import Data.List
23+
import Data.Maybe (fromMaybe)
2324
import Data.Version (showVersion)
2425
import qualified Language.PureScript as P
2526
import qualified Paths_purescript as Paths
@@ -30,7 +31,7 @@ import System.IO (stderr)
3031

3132
docgen :: Bool -> [FilePath] -> IO ()
3233
docgen showHierarchy input = do
33-
e <- P.parseModulesFromFiles <$> mapM (fmap (first Just) . parseFile) (nub input)
34+
e <- P.parseModulesFromFiles (fromMaybe "") <$> mapM (fmap (first Just) . parseFile) (nub input)
3435
case e of
3536
Left err -> do
3637
U.hPutStr stderr $ show err

psc-make/Main.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ data InputOptions = InputOptions
3838
, ioInputFiles :: [FilePath]
3939
}
4040

41-
readInput :: InputOptions -> IO [(Maybe FilePath, String)]
41+
readInput :: InputOptions -> IO [(Either P.RebuildPolicy FilePath, String)]
4242
readInput InputOptions{..} = do
43-
content <- forM ioInputFiles $ \inputFile -> (Just inputFile, ) <$> U.readFile inputFile
44-
return $ bool ((Nothing, P.prelude) :) id ioNoPrelude content
43+
content <- forM ioInputFiles $ \inputFile -> (Right inputFile, ) <$> U.readFile inputFile
44+
return $ bool ((Left P.RebuildNever, P.prelude) :) id ioNoPrelude content
4545

4646
newtype Make a = Make { unMake :: ErrorT String IO a } deriving (Functor, Applicative, Monad, MonadIO, MonadError String)
4747

@@ -69,7 +69,7 @@ instance P.MonadMake Make where
6969

7070
compile :: [FilePath] -> FilePath -> P.Options P.Make -> Bool -> IO ()
7171
compile input outputDir opts usePrefix = do
72-
modules <- P.parseModulesFromFiles <$> readInput (InputOptions (P.optionsNoPrelude opts) input)
72+
modules <- P.parseModulesFromFiles (either (const "") id) <$> readInput (InputOptions (P.optionsNoPrelude opts) input)
7373
case modules of
7474
Left err -> do
7575
U.print err

psc/Main.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import Control.Applicative
2020
import Control.Monad.Error
2121

2222
import Data.Bool (bool)
23+
import Data.Maybe (fromMaybe)
2324
import Data.Version (showVersion)
2425

2526
import System.Console.CmdTheLine
@@ -46,7 +47,7 @@ readInput InputOptions{..}
4647

4748
compile :: P.Options P.Compile -> Bool -> [FilePath] -> Maybe FilePath -> Maybe FilePath -> Bool -> IO ()
4849
compile opts stdin input output externs usePrefix = do
49-
modules <- P.parseModulesFromFiles <$> readInput (InputOptions (P.optionsNoPrelude opts) stdin input)
50+
modules <- P.parseModulesFromFiles (fromMaybe "") <$> readInput (InputOptions (P.optionsNoPrelude opts) stdin input)
5051
case modules of
5152
Left err -> do
5253
U.hPutStr stderr $ show err

psci/Main.hs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ import qualified Language.PureScript.Declarations as D
6666
data PSCiState = PSCiState
6767
{ psciImportedFilenames :: [FilePath]
6868
, psciImportedModuleNames :: [P.ModuleName]
69-
, psciLoadedModules :: [(Maybe FilePath, P.Module)]
69+
, psciLoadedModules :: [(Either P.RebuildPolicy FilePath, P.Module)]
7070
, psciLetBindings :: [P.Expr -> P.Expr]
7171
}
7272

@@ -87,7 +87,7 @@ updateImports name st = st { psciImportedModuleNames = name : psciImportedModule
8787
-- |
8888
-- Updates the state to have more loaded files.
8989
--
90-
updateModules :: [(Maybe FilePath, P.Module)] -> PSCiState -> PSCiState
90+
updateModules :: [(Either P.RebuildPolicy FilePath, P.Module)] -> PSCiState -> PSCiState
9191
updateModules modules st = st { psciLoadedModules = psciLoadedModules st ++ modules }
9292

9393
-- |
@@ -130,12 +130,12 @@ loadModule filename = either (Left . show) Right . P.runIndentParser filename P.
130130
-- |
131131
-- Load all modules, including the Prelude
132132
--
133-
loadAllModules :: [FilePath] -> IO (Either ParseError [(Maybe FilePath, P.Module)])
133+
loadAllModules :: [FilePath] -> IO (Either ParseError [(Either P.RebuildPolicy FilePath, P.Module)])
134134
loadAllModules files = do
135135
filesAndContent <- forM files $ \filename -> do
136136
content <- U.readFile filename
137-
return (Just filename, content)
138-
return $ P.parseModulesFromFiles $ (Nothing, P.prelude) : filesAndContent
137+
return (Right filename, content)
138+
return $ P.parseModulesFromFiles (either (const "") id) $ (Left P.RebuildNever, P.prelude) : filesAndContent
139139

140140

141141
-- |
@@ -303,7 +303,7 @@ handleDeclaration :: P.Expr -> PSCI ()
303303
handleDeclaration value = do
304304
st <- PSCI $ lift get
305305
let m = createTemporaryModule True st value
306-
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Nothing, m)]) []
306+
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Left P.RebuildAlways, m)]) []
307307
case e of
308308
Left err -> PSCI $ outputStrLn err
309309
Right _ -> do
@@ -343,7 +343,7 @@ handleImport :: P.ModuleName -> PSCI ()
343343
handleImport moduleName = do
344344
st <- updateImports moduleName <$> PSCI (lift get)
345345
let m = createTemporaryModuleForImports st
346-
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Nothing, m)]) []
346+
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Left P.RebuildAlways, m)]) []
347347
case e of
348348
Left err -> PSCI $ outputStrLn err
349349
Right _ -> do
@@ -357,7 +357,7 @@ handleTypeOf :: P.Expr -> PSCI ()
357357
handleTypeOf value = do
358358
st <- PSCI $ lift get
359359
let m = createTemporaryModule False st value
360-
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Nothing, m)]) []
360+
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Left P.RebuildAlways, m)]) []
361361
case e of
362362
Left err -> PSCI $ outputStrLn err
363363
Right env' ->
@@ -407,7 +407,7 @@ handleKindOf typ = do
407407
st <- PSCI $ lift get
408408
let m = createTemporaryModuleForKind st typ
409409
mName = P.ModuleName [P.ProperName "$PSCI"]
410-
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Nothing, m)]) []
410+
e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st ++ [(Left P.RebuildAlways, m)]) []
411411
case e of
412412
Left err -> PSCI $ outputStrLn err
413413
Right env' ->
@@ -453,7 +453,7 @@ handleCommand (LoadFile filePath) = do
453453
m <- psciIO $ loadModule absPath
454454
case m of
455455
Left err -> PSCI $ outputStrLn err
456-
Right mods -> PSCI . lift $ modify (updateModules (map ((,) (Just absPath)) mods))
456+
Right mods -> PSCI . lift $ modify (updateModules (map ((,) (Right absPath)) mods))
457457
else
458458
PSCI . outputStrLn $ "Couldn't locate: " ++ filePath
459459
handleCommand Reset = do

purescript.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: purescript
2-
version: 0.6.0
2+
version: 0.6.0.1
33
cabal-version: >=1.8
44
build-type: Simple
55
license: MIT

src/Language/PureScript.hs

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
{-# LANGUAGE DataKinds, QuasiQuotes, TemplateHaskell #-}
1717

18-
module Language.PureScript (module P, compile, compile', MonadMake(..), make, prelude) where
18+
module Language.PureScript (module P, compile, compile', RebuildPolicy(..), MonadMake(..), make, prelude) where
1919

2020
import Language.PureScript.Types as P
2121
import Language.PureScript.Kinds as P
@@ -133,13 +133,22 @@ class MonadMake m where
133133
--
134134
progress :: String -> m ()
135135

136+
-- |
137+
-- Determines when to rebuild a module
138+
--
139+
data RebuildPolicy
140+
-- | Never rebuild this module
141+
= RebuildNever
142+
-- | Always rebuild this module
143+
| RebuildAlways deriving (Show, Eq, Ord)
144+
136145
-- |
137146
-- Compiles in "make" mode, compiling each module separately to a js files and an externs file
138147
--
139148
-- If timestamps have not changed, the externs file can be used to provide the module's types without
140149
-- having to typecheck the module again.
141150
--
142-
make :: (Functor m, Applicative m, Monad m, MonadMake m) => FilePath -> Options Make -> [(Maybe FilePath, Module)] -> [String] -> m Environment
151+
make :: (Functor m, Applicative m, Monad m, MonadMake m) => FilePath -> Options Make -> [(Either RebuildPolicy FilePath, Module)] -> [String] -> m Environment
143152
make outputDir opts ms prefix = do
144153
let filePathMap = M.fromList (map (\(fp, Module mn _ _) -> (mn, fp)) ms)
145154

@@ -150,14 +159,15 @@ make outputDir opts ms prefix = do
150159

151160
jsFile = outputDir </> filePath </> "index.js"
152161
externsFile = outputDir </> filePath </> "externs.purs"
153-
inputFile = join $ M.lookup moduleName' filePathMap
162+
inputFile = fromMaybe (error "Module has no filename in 'make'") $ M.lookup moduleName' filePathMap
154163

155164
jsTimestamp <- getTimestamp jsFile
156165
externsTimestamp <- getTimestamp externsFile
157-
inputTimestamp <- join <$> traverse getTimestamp inputFile
166+
inputTimestamp <- traverse getTimestamp inputFile
158167

159168
return $ case (inputTimestamp, jsTimestamp, externsTimestamp) of
160-
(Just t1, Just t2, Just t3) | t1 < min t2 t3 -> s
169+
(Right (Just t1), Just t2, Just t3) | t1 < min t2 t3 -> s
170+
(Left RebuildNever, Just _, Just _) -> s
161171
_ -> S.insert moduleName' s) S.empty sorted
162172

163173
marked <- rebuildIfNecessary (reverseDependencies graph) toRebuild sorted

src/Language/PureScript/Parser/Declarations.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,10 @@ parseModule = do
235235
-- |
236236
-- Parse a collection of modules
237237
--
238-
parseModulesFromFiles :: [(Maybe FilePath, String)] -> Either P.ParseError [(Maybe FilePath, Module)]
239-
parseModulesFromFiles input =
238+
parseModulesFromFiles :: (k -> String) -> [(k, String)] -> Either P.ParseError [(k, Module)]
239+
parseModulesFromFiles toFilePath input =
240240
fmap collect . forM input $ \(filename, content) -> do
241-
ms <- runIndentParser (fromMaybe "" filename) parseModules content
241+
ms <- runIndentParser (toFilePath filename) parseModules content
242242
return (filename, ms)
243243
where
244244
collect :: [(k, [v])] -> [(k, v)]

tests/Main.hs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,20 @@ import System.Directory (getCurrentDirectory, getTemporaryDirectory, getDirector
3030
import Text.Parsec (ParseError)
3131
import qualified System.IO.UTF8 as U
3232

33-
readInput :: [FilePath] -> IO [(Maybe FilePath, String)]
33+
readInput :: [FilePath] -> IO [(FilePath, String)]
3434
readInput inputFiles = forM inputFiles $ \inputFile -> do
3535
text <- U.readFile inputFile
36-
return (Just inputFile, text)
36+
return (inputFile, text)
3737

3838
loadPrelude :: Either String (String, String, P.Environment)
3939
loadPrelude =
40-
case P.parseModulesFromFiles [(Nothing, P.prelude)] of
40+
case P.parseModulesFromFiles id [("", P.prelude)] of
4141
Left parseError -> Left (show parseError)
4242
Right ms -> P.compile (P.defaultCompileOptions { P.optionsAdditional = P.CompileOptions "Tests" [] [] }) (map snd ms) []
4343

4444
compile :: P.Options P.Compile -> [FilePath] -> IO (Either String (String, String, P.Environment))
4545
compile opts inputFiles = do
46-
modules <- P.parseModulesFromFiles <$> readInput inputFiles
46+
modules <- P.parseModulesFromFiles id <$> readInput inputFiles
4747
case modules of
4848
Left parseError ->
4949
return (Left $ show parseError)

0 commit comments

Comments
 (0)