@@ -0,0 +1,108 @@
1+{-# LANGUAGE Arrows #-}
2+module Idris.CmdOptions where
3+
4+import Idris.AbsSyntaxTree
5+import Idris.REPL
6+
7+import IRTS.CodegenCommon
8+
9+import Options.Applicative
10+import Options.Applicative.Arrows
11+import Data.Maybe
12+
13+runArgParser :: IO [Opt]
14+runArgParser = do opts <- execParser $ info parser $
15+ header ("Idris version " ++ ver ++ ", (C) The Idris Community 2014")
16+ return $ preProcOpts opts []
17+
18+pureArgParser :: [String] -> [Opt]
19+pureArgParser args = case execParserMaybe (info parser idm) args of
20+ Just opts -> preProcOpts opts []
21+ Nothing -> []
22+
23+parser :: Parser [Opt]
24+parser = runA $ proc () -> do
25+ flags <- asA parseFlags -< ()
26+ files <- asA (many $ argument ((fmap . fmap) Filename str) (metavar "FILES")) -< ()
27+ A parseVersion >>> A helper -< (flags ++ files)
28+
29+parseFlags :: Parser [Opt]
30+parseFlags = many $
31+ flag' NoBanner (long "nobanner" <> help "Suppress the banner")
32+ <|> flag' Quiet (short 'q' <> long "quiet" <> help "Quiet verbosity")
33+ <|> flag' Ideslave (long "ideslave")
34+ <|> (Client <$> strOption (long "client"))
35+ <|> (OLogging <$> option (long "log" <> metavar "LEVEL" <> help "Debugging log level"))
36+ <|> flag' NoBasePkgs (long "nobasepkgs")
37+ <|> flag' NoPrelude (long "noprelude")
38+ <|> flag' NoBuiltins (long "nobuiltins")
39+ <|> flag' NoREPL (long "check")
40+ <|> (Output <$> strOption (short 'o' <> long "output" <> metavar "FILE" <> help "Specify output file"))
41+ <|> flag' TypeCase (long "typecase")
42+ <|> flag' TypeInType (long "typeintype")
43+ <|> flag' DefaultTotal (long "total" <> help "Require functions to be total by default")
44+ <|> flag' DefaultPartial (long "partial")
45+ <|> flag' WarnPartial (long "warnpartial" <> help "Warn about undeclared partial functions")
46+ <|> flag' WarnReach (long "warnreach" <> help "Warn about reachable but inaccessible arguments")
47+ <|> flag' NoCoverage (long "nocoverage")
48+ <|> flag' ErrContext (long "errorcontext")
49+ <|> flag' ShowLibs (long "link" <> help "Display link flags")
50+ <|> flag' ShowLibdir (long "libdir" <> help "Display library directory")
51+ <|> flag' ShowIncs (long "include" <> help "Display the includes flags")
52+ <|> flag' Verbose (short 'V' <> long "verbose" <> help "Loud verbosity")
53+ <|> (IBCSubDir <$> strOption (long "ibcsubdir" <> metavar "FILE" <> help "Write IBC files into sub directory"))
54+ <|> (ImportDir <$> strOption (short 'i' <> long "idrispath" <> help "Add directory to the list of import paths"))
55+ <|> flag' WarnOnly (long "warn")
56+ <|> (Pkg <$> strOption (short 'p' <> long "package"))
57+ -- Package commands
58+ <|> (PkgBuild <$> strOption (long "build" <> metavar "IPKG" <> help "Build package"))
59+ <|> (PkgInstall <$> strOption (long "install" <> metavar "IPKG" <> help "Install package"))
60+ <|> (PkgREPL <$> strOption (long "repl"))
61+ <|> (PkgClean <$> strOption (long "clean" <> metavar "IPKG" <> help "Clean package"))
62+ <|> (PkgMkDoc <$> strOption (long "mkdoc" <> metavar "IPKG" <> help "Generate IdrisDoc for package"))
63+ <|> (PkgCheck <$> strOption (long "check"))
64+ -- Misc options
65+ <|> (BCAsm <$> strOption (long "bytecode"))
66+ <|> flag' (OutputTy Raw) (short 'S' <> long "codegenonly" <> help "Do no further compilation of code generator output")
67+ <|> flag' (OutputTy Object) (short 'c' <> long "compileonly" <> help "Compile to object files rather than an executable")
68+ <|> flag' (OutputTy MavenProject) (long "mvn" <> help "Create a maven project (for Java codegen)")
69+ <|> (DumpDefun <$> strOption (long "dumpdefuns"))
70+ <|> (DumpCases <$> strOption (long "dumpcases"))
71+ <|> ((\s -> UseCodegen $ parseCodegen s) <$> strOption (long "codegen" <> metavar "TARGET" <> help "Select code generator: C, Java, bytecode"))
72+ <|> (EvalExpr <$> strOption (long "eval" <> short 'e' <> metavar "EXPR" <> help "Evaluate an expression without loading the REPL"))
73+ <|> flag' (InterpretScript "Main.main") (long "execute" <> help "Execute as idris")
74+ <|> (InterpretScript <$> strOption (long "exec" <> metavar "EXPR" <> help "Execute as idris"))
75+ <|> ((\s -> Extension $ getExt s) <$> strOption (long "extension" <> short 'X' <> metavar "EXT" <> help "Turn on langage extension (TypeProviders or ErrorReflection)"))
76+ <|> flag' (OptLevel 3) (long "O3")
77+ <|> flag' (OptLevel 2) (long "O2")
78+ <|> flag' (OptLevel 1) (long "O1")
79+ <|> flag' (OptLevel 0) (long "O0")
80+ <|> (OptLevel <$> option (short 'O' <> long "level"))
81+ <|> (TargetTriple <$> strOption (long "target" <> metavar "TRIPLE" <> help "Select target triple (for llvm codegen)"))
82+ <|> (TargetCPU <$> strOption (long "cpu" <> metavar "CPU" <> help "Select target CPU e.g. corei7 or cortex-m3 (for LLVM codegen)"))
83+ <|> flag' (ColourREPL True) (long "colour" <> long "color" <> help "Force coloured output")
84+ <|> flag' (ColourREPL False) (long "nocolour" <> long "nocolor" <> help "Disable coloured output")
85+ where
86+ getExt s = case maybeRead s of
87+ Just ext -> ext
88+ Nothing -> error ("Unknown extension " ++ s)
89+ maybeRead = fmap fst . listToMaybe . reads
90+
91+parseVersion :: Parser (a -> a)
92+parseVersion = infoOption ver (short 'v' <> long "version" <> help "Print version information")
93+
94+preProcOpts :: [Opt] -> [Opt] -> [Opt]
95+preProcOpts [] ys = ys
96+preProcOpts (NoBuiltins:xs) ys = NoBuiltins : NoPrelude : preProcOpts xs ys
97+preProcOpts (Output s:xs) ys = Output s : NoREPL : preProcOpts xs ys
98+preProcOpts (BCAsm s:xs) ys = BCAsm s : NoREPL : preProcOpts xs ys
99+preProcOpts (x:xs) ys = preProcOpts xs (x:ys)
100+
101+parseCodegen :: String -> Codegen
102+parseCodegen "C" = ViaC
103+parseCodegen "Java" = ViaJava
104+parseCodegen "bytecode" = Bytecode
105+parseCodegen "javascript" = ViaJavaScript
106+parseCodegen "node" = ViaNode
107+parseCodegen "llvm" = ViaLLVM
108+parseCodegen _ = error "unknown codegen" -- FIXME: partial function