hsinspect-0.0.1: exe/Main.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE ViewPatterns #-}
module Main where
import Control.Monad
import Control.Monad.IO.Class
import DynFlags (parseDynamicFlagsCmdLine)
import qualified GHC as GHC
import GHC.Paths (libdir)
import HsInspect.Imports
import HsInspect.Sexp as S
import Json
import Outputable (defaultUserStyle, initSDocContext, runSDoc)
import System.Environment (getArgs)
import System.Exit
version :: String
#ifdef CURRENT_PACKAGE_VERSION
version = CURRENT_PACKAGE_VERSION
#else
version = "unknown"
#endif
help :: String
help =
"hsinspect command ARGS [--json|help|version] -- [ghcflags]\n\n" ++
" `command ARGS' can be:\n\n" ++
" imports /path/to/file.hs - list the qualified imports for the file\n" ++
" along with their locally qualified (and\n" ++
" unqualified) names."
-- Possible backends:
--
-- https://github.com/mpickering/hie-bios
-- http://hackage.haskell.org/package/cabal-helper
main :: IO ()
main = do
(break ("--" ==) -> (args, _ : flags)) <- getArgs
when (elem "--help" args) $
(putStrLn help) >> exitWith ExitSuccess
when (elem "--version" args) $
(putStrLn version) >> exitWith ExitSuccess
GHC.runGhc (Just libdir) $ do
dflags <- GHC.getSessionDynFlags
(dflags', _, _) <- liftIO $ parseDynamicFlagsCmdLine dflags (GHC.noLoc <$> flags)
void $ GHC.setSessionDynFlags dflags'
{ GHC.hscTarget = GHC.HscNothing
, GHC.ghcLink = GHC.NoLink
}
case args of
"imports" : file : rest -> do
quals <- imports file
let output = if (elem "--json" rest)
then encodeJson dflags' . JSArray $ (json <$> quals)
else S.encode quals
liftIO . putStrLn $ output
_ ->
liftIO $ error "invalid parameters"
encodeJson :: GHC.DynFlags -> JsonDoc -> String
encodeJson dflags = show . flip runSDoc ctx . renderJSON
where ctx = initSDocContext dflags $ defaultUserStyle dflags