@@ -30,6 +30,7 @@ import qualified Data.Text.IO as T
30import qualified Data.ByteString.Lazy.Char8 as BS8
30import qualified Data.ByteString.Lazy.Char8 as BS8
31import Data.Version (showVersion)
31import Data.Version (showVersion)
32import Language.PureScript.Ide
32import Language.PureScript.Ide
33+import Language.PureScript.Ide.Command
33import Language.PureScript.Ide.Util
34import Language.PureScript.Ide.Util
34import Language.PureScript.Ide.Error
35import Language.PureScript.Ide.Error
35import Language.PureScript.Ide.Types
36import Language.PureScript.Ide.Types
@@ -45,7 +46,6 @@ import System.Info as SysInfo
45import System.FilePath
46import System.FilePath
46import System.IO hiding (putStrLn, print)
47import System.IO hiding (putStrLn, print)
47import System.IO.Error (isEOFError)
48import System.IO.Error (isEOFError)
49import qualified Paths_purescript as Paths
49import qualified Paths_purescript as Paths
51listenOnLocalhost :: PortNumber -> IO Socket
51listenOnLocalhost :: PortNumber -> IO Socket
@@ -69,11 +69,12 @@ data Options = Options
69 , optionsNoWatch :: Bool
69 , optionsNoWatch :: Bool
70 , optionsPolling :: Bool
70 , optionsPolling :: Bool
71 , optionsDebug :: Bool
71 , optionsDebug :: Bool
72+ , optionsLoglevel :: IdeLogLevel
72 } deriving (Show)
73 } deriving (Show)
74main :: IO ()
75main :: IO ()
76− opts'@(Options dir globs outputPath port noWatch polling debug) <- Opts.execParser opts
77+ opts'@(Options dir globs outputPath port noWatch polling debug logLevel) <- Opts.execParser opts
77 when debug (putText "Parsed Options:" *> print opts')
78 when debug (putText "Parsed Options:" *> print opts')
78 maybe (pure ()) setCurrentDirectory dir
79 maybe (pure ()) setCurrentDirectory dir
79 ideState <- newTVarIO emptyIdeState
80 ideState <- newTVarIO emptyIdeState
@@ -88,8 +89,8 @@ main = do
89 unless noWatch $
90 unless noWatch $
90 void (forkFinally (watcher polling ideState fullOutputPath) print)
91 void (forkFinally (watcher polling ideState fullOutputPath) print)
91−
92+ -- TODO: deprecate and get rid of `debug`
92− let conf = Configuration {confDebug = debug, confOutputPath = outputPath, confGlobs = globs}
93+ let conf = Configuration {confLogLevel = if debug then LogDebug else logLevel, confOutputPath = outputPath, confGlobs = globs}
93 env = IdeEnvironment {ideStateVar = ideState, ideConfiguration = conf}
94 env = IdeEnvironment {ideStateVar = ideState, ideConfiguration = conf}
94 startServer port env
95 startServer port env
@@ -103,7 +104,17 @@ main = do
103 <*> Opts.switch (Opts.long "no-watch")
104 <*> Opts.switch (Opts.long "no-watch")
104 <*> flipIfWindows (Opts.switch (Opts.long "polling"))
105 <*> flipIfWindows (Opts.switch (Opts.long "polling"))
105 <*> Opts.switch (Opts.long "debug")
106 <*> Opts.switch (Opts.long "debug")
107+ <*> (parseLogLevel <$> Opts.strOption
108+ (Opts.long "log-level"
109+ `mappend` Opts.value ""
110+ `mappend` Opts.help "One of \"debug\", \"perf\", \"all\" or \"none\""))
106 opts = Opts.info (version <*> Opts.helper <*> parser) mempty
111 opts = Opts.info (version <*> Opts.helper <*> parser) mempty
112+ parseLogLevel s = case s of
107 version = Opts.abortOption
118 version = Opts.abortOption
108 (InfoMsg (showVersion Paths.version))
119 (InfoMsg (showVersion Paths.version))
109 (Opts.long "version" `mappend` Opts.help "Show the version number")
120 (Opts.long "version" `mappend` Opts.help "Show the version number")
@@ -115,10 +126,8 @@ main = do
115startServer :: PortNumber -> IdeEnvironment -> IO ()
126startServer :: PortNumber -> IdeEnvironment -> IO ()
116startServer port env = withSocketsDo $ do
127startServer port env = withSocketsDo $ do
117 sock <- listenOnLocalhost port
128 sock <- listenOnLocalhost port
118− runLogger (runReaderT (forever (loop sock)) env)
129+ runLogger (confLogLevel (ideConfiguration env)) (runReaderT (forever (loop sock)) env)
120− runLogger = runStdoutLoggingT . filterLogger (\_ _ -> confDebug (ideConfiguration env))
122 loop :: (Ide m, MonadLogger m) => Socket -> m ()
131 loop :: (Ide m, MonadLogger m) => Socket -> m ()
123 loop sock = do
132 loop sock = do
124 accepted <- runExceptT $ acceptCommand sock
133 accepted <- runExceptT $ acceptCommand sock
@@ -127,7 +136,11 @@ startServer port env = withSocketsDo $ do
127 Right (cmd, h) -> do
136 Right (cmd, h) -> do
128 case decodeT cmd of
137 case decodeT cmd of
129 Just cmd' -> do
138 Just cmd' -> do
139+ let message duration =
140+ "Command " <> commandName cmd'
142+ <> displayTimeSpec duration
130− result <- runExceptT (handleCommand cmd')
143+ result <- logPerf message (runExceptT (handleCommand cmd'))
131 -- $(logDebug) ("Answer was: " <> T.pack (show result))
144 -- $(logDebug) ("Answer was: " <> T.pack (show result))
132 liftIO (hFlush stdout)
145 liftIO (hFlush stdout)
133 case result of
146 case result of
@@ -140,7 +153,6 @@ startServer port env = withSocketsDo $ do
140 hFlush stdout
153 hFlush stdout
141 liftIO (hClose h)
154 liftIO (hClose h)
144acceptCommand :: (MonadIO m, MonadLogger m, MonadError Text m)
156acceptCommand :: (MonadIO m, MonadLogger m, MonadError Text m)
145 => Socket -> m (Text, Handle)
157 => Socket -> m (Text, Handle)
146acceptCommand sock = do
158acceptCommand sock = do