hsdev-0.1.3.3: tools/hsinspect.hs
{-# LANGUAGE OverloadedStrings, ViewPatterns #-}
module Main (
main
) where
import Control.Applicative
import Control.Monad (liftM, (>=>))
import Control.Monad.IO.Class
import Data.Aeson (toJSON)
import System.Directory (canonicalizePath)
import System.FilePath (takeExtension)
import HsDev.Project (readProject)
import HsDev.Scan (scanModule, scanModify)
import HsDev.Inspect (inspectContents, inspectDocs)
import HsDev.Symbols.Location (ModuleLocation(..), Cabal(..))
import HsDev.Tools.GhcMod.InferType (infer)
import Tool
main :: IO ()
main = toolMain "hsinspect" [
jsonCmd "" ["what"] [ghcOpts] "depending of what <what> is, inspect installed module, source file (.hs), cabal file (.cabal) or contents, passes as input if no <what> specified" inspect']
where
ghcOpts = list "ghc" "option" `short` ['g'] `desc` "options to pass to GHC"
ghcs = listArg "ghc"
inspect' (Args [] opts) = liftIO getContents >>= liftM toJSON . inspectContents "stdin" (ghcs opts)
inspect' (Args [fname@(takeExtension -> ".hs")] opts) = do
fname' <- liftIO $ canonicalizePath fname
im <- scanModule (ghcs opts) (FileModule fname' Nothing)
let
scanAdditional =
scanModify (\opts cabal -> inspectDocs opts) >=>
scanModify infer
toJSON <$> scanAdditional im
inspect' (Args [fcabal@(takeExtension -> ".cabal")] _) = do
fcabal' <- liftIO $ canonicalizePath fcabal
toJSON <$> readProject fcabal'
inspect' (Args [mname] opts) = toJSON <$> scanModule (ghcs opts) (CabalModule Cabal Nothing mname)
inspect' _ = toolError "Specify module name or file name (.hs or .cabal)"