git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Merge pull request #2071 from kRITZCREEK/psc-ide-watcher-improvements

Always reload Externs

commitdd9ebefedda399f960804c4c4c4ad425071ed69f authorPhil Freeman <paf31@cantab.net> dateSat 30 Apr 2016, 20:08 (10 years ago) parent13fb81eeaa0b47
1 file changed+18−25
src/Language/PureScript/Ide/Watcher.hs+18−25
src/Language/PureScript/Ide/Watcher.hs+18−25
@@ -12,44 +12,37 @@
1212-- File watcher for externs files
1313-----------------------------------------------------------------------------
1414
15−{-# LANGUAGE RecordWildCards #-}
16−
1715module Language.PureScript.Ide.Watcher where
1816
19−import Prelude ()
20−import Prelude.Compat
21−
2217import Control.Concurrent (threadDelay)
2318import Control.Concurrent.STM
2419import Control.Monad
2520import Control.Monad.Trans.Except
26−import qualified Data.Map as M
27−import Data.Maybe (isJust)
28−import Language.PureScript.Externs
2921import Language.PureScript.Ide.Externs
3022import Language.PureScript.Ide.State
3123import Language.PureScript.Ide.Types
24+import Prelude
3225import System.FilePath
3326import System.FSNotify
3427
28+-- | Reloads an ExternsFile from Disc. If the Event indicates the ExternsFile
29+-- was deleted we don't do anything.
30+reloadFile :: TVar PscIdeState -> Event -> IO ()
31+reloadFile _ Removed{} = pure ()
32+reloadFile stateVar ev = do
33+ let fp = eventPath ev
34+ ef' <- runExceptT (readExternFile fp)
35+ case ef' of
36+ Left _ -> pure ()
37+ Right ef -> do
38+ atomically (insertModule' stateVar ef)
39+ putStrLn ("Reloaded File at: " ++ fp)
3540
36−reloadFile :: TVar PscIdeState -> FilePath -> IO ()
37−reloadFile stateVar fp = do
38− (Right ef@ExternsFile{..}) <- runExceptT $ readExternFile fp
39− reloaded <- atomically $ do
40− st <- readTVar stateVar
41− if isLoaded efModuleName st
42− then
43− insertModule' stateVar ef *> pure True
44− else
45− pure False
46− when reloaded $ putStrLn $ "Reloaded File at: " ++ fp
47− where
48− isLoaded name st = isJust (M.lookup name (externsFiles st))
49−
41+-- | Installs filewatchers for the given directory and reloads ExternsFiles when
42+-- they change on disc
5043watcher :: TVar PscIdeState -> FilePath -> IO ()
51−watcher stateVar fp = withManager $ \mgr -> do
44+watcher stateVar fp = withManagerConf (defaultConfig { confDebounce = NoDebounce }) $ \mgr -> do
5245 _ <- watchTree mgr fp
5346 (\ev -> takeFileName (eventPath ev) == "externs.json")
54− (reloadFile stateVar . eventPath)
55− forever (threadDelay 10000)
47+ (reloadFile stateVar)
48+ forever (threadDelay 100000)