@@ -41,7 +41,6 @@ import Network.Socket hiding (PortNumber, Type,
42import Options.Applicative (ParseError (..))
42import Options.Applicative (ParseError (..))
43import qualified Options.Applicative as Opts
43import qualified Options.Applicative as Opts
45import System.Directory
44import System.Directory
46import System.Info as SysInfo
45import System.Info as SysInfo
47import System.FilePath
46import System.FilePath
@@ -70,11 +69,12 @@ data Options = Options
70 , optionsNoWatch :: Bool
69 , optionsNoWatch :: Bool
71 , optionsPolling :: Bool
70 , optionsPolling :: Bool
72 , optionsDebug :: Bool
71 , optionsDebug :: Bool
72+ , optionsLoglevel :: IdeLogLevel
73 } deriving (Show)
73 } deriving (Show)
75main :: IO ()
75main :: IO ()
77− opts'@(Options dir globs outputPath port noWatch polling debug) <- Opts.execParser opts
77+ opts'@(Options dir globs outputPath port noWatch debug logLevel) <- Opts.execParser opts
78 when debug (putText "Parsed Options:" *> print opts')
78 when debug (putText "Parsed Options:" *> print opts')
79 maybe (pure ()) setCurrentDirectory dir
79 maybe (pure ()) setCurrentDirectory dir
80 ideState <- newTVarIO emptyIdeState
80 ideState <- newTVarIO emptyIdeState
@@ -89,8 +89,8 @@ main = do
90 unless noWatch $
90 unless noWatch $
91 void (forkFinally (watcher polling ideState fullOutputPath) print)
91 void (forkFinally (watcher polling ideState fullOutputPath) print)
92−
92+ -- TODO: deprecate and get rid of `debug`
93− let conf = Configuration {confDebug = debug, confOutputPath = outputPath, confGlobs = globs}
93+ let conf = Configuration {confLogLevel = if debug then LogDebug else logLevel, confOutputPath = outputPath, confGlobs = globs}
94 env = IdeEnvironment {ideStateVar = ideState, ideConfiguration = conf}
94 env = IdeEnvironment {ideStateVar = ideState, ideConfiguration = conf}
95 startServer port env
95 startServer port env
@@ -104,7 +104,16 @@ main = do
104 <*> Opts.switch (Opts.long "no-watch")
104 <*> Opts.switch (Opts.long "no-watch")
105 <*> flipIfWindows (Opts.switch (Opts.long "polling"))
105 <*> flipIfWindows (Opts.switch (Opts.long "polling"))
106 <*> Opts.switch (Opts.long "debug")
106 <*> Opts.switch (Opts.long "debug")
107+ <*> (parseLogLevel <$> Opts.strOption
108+ (Opts.long "log-level"
110+ <> Opts.help "One of \"debug\", \"perf\" or \"all\""))
107 opts = Opts.info (version <*> Opts.helper <*> parser) mempty
111 opts = Opts.info (version <*> Opts.helper <*> parser) mempty
112+ parseLogLevel s = case s of
108 version = Opts.abortOption
117 version = Opts.abortOption
109 (InfoMsg (showVersion Paths.version))
118 (InfoMsg (showVersion Paths.version))
110 (Opts.long "version" `mappend` Opts.help "Show the version number")
119 (Opts.long "version" `mappend` Opts.help "Show the version number")
@@ -116,10 +125,8 @@ main = do
116startServer :: PortNumber -> IdeEnvironment -> IO ()
125startServer :: PortNumber -> IdeEnvironment -> IO ()
117startServer port env = withSocketsDo $ do
126startServer port env = withSocketsDo $ do
118 sock <- listenOnLocalhost port
127 sock <- listenOnLocalhost port
119− runLogger (runReaderT (forever (loop sock)) env)
128+ runLogger (confLogLevel (ideConfiguration env)) (runReaderT (forever (loop sock)) env)
121− runLogger = runStdoutLoggingT . filterLogger (\_ _ -> confDebug (ideConfiguration env))
123 loop :: (Ide m, MonadLogger m) => Socket -> m ()
130 loop :: (Ide m, MonadLogger m) => Socket -> m ()
124 loop sock = do
131 loop sock = do
125 accepted <- runExceptT $ acceptCommand sock
132 accepted <- runExceptT $ acceptCommand sock
@@ -128,10 +135,11 @@ startServer port env = withSocketsDo $ do
128 Right (cmd, h) -> do
135 Right (cmd, h) -> do
129 case decodeT cmd of
136 case decodeT cmd of
130 Just cmd' -> do
137 Just cmd' -> do
131− start <- liftIO (getTime Monotonic)
138+ let message duration =
132− result <- runExceptT (handleCommand cmd')
133− end <- liftIO (getTime Monotonic)
134− $(logDebug) ("Command " <> commandName cmd' <> " took " <> (displayTimeSpec (diffTimeSpec start end)))
139+ "Command " <> commandName cmd'
141+ <> displayTimeSpec duration
142+ result <- logPerf message (runExceptT (handleCommand cmd'))
135 -- $(logDebug) ("Answer was: " <> T.pack (show result))
143 -- $(logDebug) ("Answer was: " <> T.pack (show result))
136 liftIO (hFlush stdout)
144 liftIO (hFlush stdout)
137 case result of
145 case result of