@@ -0,0 +1,283 @@
3+Description : Compiler options for Idris.
6+Maintainer : The Idris Community.
8+{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveGeneric, PatternGuards #-}
10+module Idris.Options where
13+import GHC.Generics (Generic)
14+import IRTS.CodegenCommon (OutputType)
15+import Network.Socket (PortNumber)
17+data Opt = Filename String
34+ | NoBuiltins -- only for the really primitive stuff!
52+ | Port REPLPort -- ^ REPL TCP port
61+ | PkgDocBuild String -- IdrisDoc
62+ | PkgDocInstall String
72+ | OutputTy OutputType
73+ | Extension LanguageExt
74+ | InterpretScript String
76+ | TargetTriple String
79+ | AddOpt Optimisation
80+ | RemoveOpt Optimisation
83+ | AutoWidth -- ^ Automatically adjust terminal width
84+ | AutoSolve -- ^ Automatically issue "solve" tactic in old-style interactive prover
85+ | UseConsoleWidth ConsoleWidth
88+ | NoElimDeprecationWarnings -- ^ Don't show deprecation warnings for %elim
89+ | NoOldTacticDeprecationWarnings -- ^ Don't show deprecation warnings for old-style tactics
90+ deriving (Show, Eq, Generic)
93+data REPLPort = DontListen | ListenPort PortNumber
94+ deriving (Eq, Generic, Show)
97+data Codegen = Via IRFormat String
99+ deriving (Show, Eq, Generic)
102+data LanguageExt = TypeProviders | ErrorReflection | UniquenessTypes
103+ | DSLNotation | ElabReflection | FCReflection
105+ deriving (Show, Eq, Read, Ord, Generic)
107+data IRFormat = IBCFormat | JSONFormat deriving (Show, Eq, Generic)
110+-- | How wide is the console?
111+data ConsoleWidth = InfinitelyWide -- ^ Have pretty-printer assume that lines should not be broken
112+ | ColsWide Int -- ^ Manually specified - must be positive
113+ | AutomaticWidth -- ^ Attempt to determine width, or 80 otherwise
114+ deriving (Show, Eq, Generic)
116+data HowMuchDocs = FullDocs | OverviewDocs
118+data OutputFmt = HTMLOutput | LaTeXOutput
120+data Optimisation = PETransform -- ^ partial eval and associated transforms
121+ deriving (Show, Eq, Generic)
123+-- | Recognised logging categories for the Idris compiler.
125+-- @TODO add in sub categories.
132+ deriving (Show, Eq, Ord, Generic)
134+strLogCat :: LogCat -> String
135+strLogCat IParse = "parser"
136+strLogCat IElab = "elab"
137+strLogCat ICodeGen = "codegen"
138+strLogCat IErasure = "erasure"
139+strLogCat ICoverage = "coverage"
140+strLogCat IIBC = "ibc"
142+codegenCats :: [LogCat]
143+codegenCats = [ICodeGen]
145+parserCats :: [LogCat]
146+parserCats = [IParse]
151+loggingCatsStr :: String
152+loggingCatsStr = unlines
153+ [ (strLogCat IParse)
155+ , (strLogCat ICodeGen)
156+ , (strLogCat IErasure)
157+ , (strLogCat ICoverage)
161+getFile :: Opt -> Maybe String
162+getFile (Filename s) = Just s
165+getBC :: Opt -> Maybe String
166+getBC (BCAsm s) = Just s
169+getOutput :: Opt -> Maybe String
170+getOutput (Output s) = Just s
171+getOutput _ = Nothing
173+getIBCSubDir :: Opt -> Maybe String
174+getIBCSubDir (IBCSubDir s) = Just s
175+getIBCSubDir _ = Nothing
177+getImportDir :: Opt -> Maybe String
178+getImportDir (ImportDir s) = Just s
179+getImportDir _ = Nothing
181+getSourceDir :: Opt -> Maybe String
182+getSourceDir (SourceDir s) = Just s
183+getSourceDir _ = Nothing
185+getPkgDir :: Opt -> Maybe String
186+getPkgDir (Pkg s) = Just s
187+getPkgDir _ = Nothing
189+getPkg :: Opt -> Maybe (Bool, String)
190+getPkg (PkgBuild s) = Just (False, s)
191+getPkg (PkgInstall s) = Just (True, s)
194+getPkgClean :: Opt -> Maybe String
195+getPkgClean (PkgClean s) = Just s
196+getPkgClean _ = Nothing
198+getPkgREPL :: Opt -> Maybe String
199+getPkgREPL (PkgREPL s) = Just s
200+getPkgREPL _ = Nothing
202+getPkgCheck :: Opt -> Maybe String
203+getPkgCheck (PkgCheck s) = Just s
204+getPkgCheck _ = Nothing
206+-- | Returns None if given an Opt which is not PkgMkDoc
207+-- Otherwise returns Just x, where x is the contents of PkgMkDoc
208+getPkgMkDoc :: Opt -- ^ Opt to extract
209+ -> Maybe (Bool, String) -- ^ Result
210+getPkgMkDoc (PkgDocBuild str) = Just (False,str)
211+getPkgMkDoc (PkgDocInstall str) = Just (True,str)
212+getPkgMkDoc _ = Nothing
214+getPkgTest :: Opt -- ^ the option to extract
215+ -> Maybe String -- ^ the package file to test
216+getPkgTest (PkgTest f) = Just f
217+getPkgTest _ = Nothing
219+getCodegen :: Opt -> Maybe Codegen
220+getCodegen (UseCodegen x) = Just x
221+getCodegen _ = Nothing
223+getCodegenArgs :: Opt -> Maybe String
224+getCodegenArgs (CodegenArgs args) = Just args
225+getCodegenArgs _ = Nothing
227+getConsoleWidth :: Opt -> Maybe ConsoleWidth
228+getConsoleWidth (UseConsoleWidth x) = Just x
229+getConsoleWidth _ = Nothing
231+getExecScript :: Opt -> Maybe String
232+getExecScript (InterpretScript expr) = Just expr
233+getExecScript _ = Nothing
235+getPkgIndex :: Opt -> Maybe FilePath
236+getPkgIndex (PkgIndex file) = Just file
237+getPkgIndex _ = Nothing
239+getEvalExpr :: Opt -> Maybe String
240+getEvalExpr (EvalExpr expr) = Just expr
241+getEvalExpr _ = Nothing
243+getOutputTy :: Opt -> Maybe OutputType
244+getOutputTy (OutputTy t) = Just t
245+getOutputTy _ = Nothing
247+getLanguageExt :: Opt -> Maybe LanguageExt
248+getLanguageExt (Extension e) = Just e
249+getLanguageExt _ = Nothing
251+getTriple :: Opt -> Maybe String
252+getTriple (TargetTriple x) = Just x
253+getTriple _ = Nothing
255+getCPU :: Opt -> Maybe String
256+getCPU (TargetCPU x) = Just x
259+getOptLevel :: Opt -> Maybe Int
260+getOptLevel (OptLevel x) = Just x
261+getOptLevel _ = Nothing
263+getOptimisation :: Opt -> Maybe (Bool,Optimisation)
264+getOptimisation (AddOpt p) = Just (True, p)
265+getOptimisation (RemoveOpt p) = Just (False, p)
266+getOptimisation _ = Nothing
268+getColour :: Opt -> Maybe Bool
269+getColour (ColourREPL b) = Just b
270+getColour _ = Nothing
272+getClient :: Opt -> Maybe String
273+getClient (Client x) = Just x
274+getClient _ = Nothing
276+-- Get the first valid port
277+getPort :: [Opt] -> Maybe REPLPort
279+getPort (Port p : _ ) = Just p
280+getPort (_ : xs) = getPort xs
282+opt :: (Opt -> Maybe a) -> [Opt] -> [a]