1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-15 01:52:11 +03:00
juvix/app/Commands/Dev/Termination.hs

100 lines
2.7 KiB
Haskell
Raw Normal View History

module Commands.Dev.Termination where
import Control.Monad.Extra
2022-04-05 20:57:21 +03:00
import Data.Text qualified as Text
import GlobalOptions
import Juvix.Compiler.Abstract.Pretty.Base qualified as A
import Juvix.Prelude hiding (Doc)
import Options.Applicative
data TerminationCommand
= Calls CallsOptions
| CallGraph CallGraphOptions
data CallsOptions = CallsOptions
{ _callsFunctionNameFilter :: Maybe (NonEmpty Text),
_callsShowDecreasingArgs :: A.ShowDecrArgs
}
newtype CallGraphOptions = CallGraphOptions
{ _graphFunctionNameFilter :: Maybe (NonEmpty Text)
}
makeLenses ''CallsOptions
makeLenses ''CallGraphOptions
parseCalls :: Parser CallsOptions
parseCalls = do
_callsFunctionNameFilter <-
fmap msum . optional $
nonEmpty . Text.words
<$> option
str
( long "function"
<> short 'f'
<> metavar "fun1 fun2 ..."
<> help "Only shows the specified functions"
)
_callsShowDecreasingArgs <-
option
decrArgsParser
( long "show-decreasing-args"
<> short 'd'
<> value A.ArgRel
<> help "possible values: argument, relation, both"
)
pure CallsOptions {..}
where
decrArgsParser :: ReadM A.ShowDecrArgs
decrArgsParser = eitherReader $ \s ->
case map toLower s of
"argument" -> return A.OnlyArg
"relation" -> return A.OnlyRel
"both" -> return A.ArgRel
_ -> Left "bad argument"
parseCallGraph :: Parser CallGraphOptions
parseCallGraph = do
_graphFunctionNameFilter <-
fmap msum . optional $
nonEmpty . Text.words
<$> option
str
( long "function"
<> short 'f'
<> help "Only shows the specified function"
)
pure CallGraphOptions {..}
parseTerminationCommand :: Parser TerminationCommand
parseTerminationCommand =
hsubparser $
mconcat
[ commandCalls,
commandGraph
]
where
commandCalls :: Mod CommandFields TerminationCommand
commandCalls = command "calls" minfo
where
minfo :: ParserInfo TerminationCommand
minfo =
info
(Calls <$> parseCalls)
(progDesc "Compute the calls table of a .juvix file")
commandGraph :: Mod CommandFields TerminationCommand
commandGraph = command "graph" minfo
where
minfo :: ParserInfo TerminationCommand
minfo =
info
(CallGraph <$> parseCallGraph)
(progDesc "Compute the complete call graph of a .juvix file")
callsPrettyOptions :: GlobalOptions -> CallsOptions -> A.Options
callsPrettyOptions GlobalOptions {..} CallsOptions {..} =
A.defaultOptions
{ A._optShowNameIds = _globalShowNameIds,
A._optShowDecreasingArgs = _callsShowDecreasingArgs
}