-- Copyright (c) 2019 The DAML Authors. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 {-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TupleSections #-} {-# OPTIONS_GHC -Wno-dodgy-imports #-} -- GHC no longer exports def in GHC 8.6 and above module Ide.Arguments ( Arguments(..) , GhcideArguments(..) , PrintVersion(..) , getArguments , haskellLanguageServerVersion , haskellLanguageServerNumericVersion ) where import Data.Version import Development.GitRev import Development.IDE.Main (Command (..), commandP) import Options.Applicative import Paths_haskell_language_server import System.Environment -- --------------------------------------------------------------------- data Arguments = VersionMode PrintVersion | ProbeToolsMode | Ghcide GhcideArguments | VSCodeExtensionSchemaMode | DefaultConfigurationMode data GhcideArguments = GhcideArguments {argsCommand :: Command ,argsCwd :: Maybe FilePath ,argsShakeProfiling :: Maybe FilePath ,argsTesting :: Bool ,argsExamplePlugin :: Bool -- These next two are for compatibility with existing hie clients, allowing -- them to just change the name of the exe and still work. , argsDebugOn :: Bool , argsLogFile :: Maybe String , argsThreads :: Int , argsProjectGhcVersion :: Bool } deriving Show data PrintVersion = PrintVersion | PrintNumericVersion deriving (Show, Eq, Ord) getArguments :: String -> IO Arguments getArguments exeName = execParser opts where opts = info (( VersionMode <$> printVersionParser exeName <|> probeToolsParser exeName <|> Ghcide <$> arguments <|> vsCodeExtensionSchemaModeParser <|> defaultConfigurationModeParser) <**> helper) ( fullDesc <> progDesc "Used as a test bed to check your IDE Client will work" <> header (exeName ++ " - GHC Haskell LSP server")) printVersionParser :: String -> Parser PrintVersion printVersionParser exeName = flag' PrintVersion (long "version" <> help ("Show " ++ exeName ++ " and GHC versions")) <|> flag' PrintNumericVersion (long "numeric-version" <> help ("Show numeric version of " ++ exeName)) probeToolsParser :: String -> Parser Arguments probeToolsParser exeName = flag' ProbeToolsMode (long "probe-tools" <> help ("Show " ++ exeName ++ " version and other tools of interest")) vsCodeExtensionSchemaModeParser :: Parser Arguments vsCodeExtensionSchemaModeParser = flag' VSCodeExtensionSchemaMode (long "vscode-extension-schema" <> help "Print generic config schema for plugins (used in the package.json of haskell vscode extension)") defaultConfigurationModeParser :: Parser Arguments defaultConfigurationModeParser = flag' DefaultConfigurationMode (long "generate-default-config" <> help "Print config supported by the server with default values") arguments :: Parser GhcideArguments arguments = GhcideArguments <$> (commandP <|> lspCommand <|> checkCommand) <*> optional (strOption $ long "cwd" <> metavar "DIR" <> help "Change to this directory") <*> optional (strOption $ long "shake-profiling" <> metavar "DIR" <> help "Dump profiling reports to this directory") <*> switch (long "test" <> help "Enable additional lsp messages used by the testsuite") <*> switch (long "example" <> help "Include the Example Plugin. For Plugin devs only") <*> switch ( long "debug" <> short 'd' <> help "Generate debug output" ) <*> optional (strOption ( long "logfile" <> short 'l' <> metavar "LOGFILE" <> help "File to log to, defaults to stdout" )) <*> option auto (short 'j' <> help "Number of threads (0: automatic)" <> metavar "NUM" <> value 0 <> showDefault ) <*> switch (long "project-ghc-version" <> help "Work out the project GHC version and print it") where lspCommand = LSP <$ flag' True (long "lsp" <> help "Start talking to an LSP server") checkCommand = Check <$> many (argument str (metavar "FILES/DIRS...")) -- --------------------------------------------------------------------- haskellLanguageServerNumericVersion :: String haskellLanguageServerNumericVersion = showVersion version haskellLanguageServerVersion :: IO String haskellLanguageServerVersion = do path <- getExecutablePath let gitHashSection = case $(gitHash) of x | x == "UNKNOWN" -> "" x -> " (GIT hash: " <> x <> ")" return $ "haskell-language-server version: " <> haskellLanguageServerNumericVersion <> " (GHC: " <> VERSION_ghc <> ") (PATH: " <> path <> ")" <> gitHashSection