@@ -0,0 +1,283 @@
1+{-|
2+Module : Idris.Options
3+Description : Compiler options for Idris.
4+Copyright :
5+License : BSD3
6+Maintainer : The Idris Community.
7+-}
8+{-# LANGUAGE DeriveDataTypeable, DeriveFunctor, DeriveGeneric, PatternGuards #-}
9+
10+module Idris.Options where
11+
12+import Data.Maybe
13+import GHC.Generics (Generic)
14+import IRTS.CodegenCommon (OutputType)
15+import Network.Socket (PortNumber)
16+
17+data Opt = Filename String
18+ | Quiet
19+ | NoBanner
20+ | ColourREPL Bool
21+ | Idemode
22+ | IdemodeSocket
23+ | IndentWith Int
24+ | IndentClause Int
25+ | ShowAll
26+ | ShowLibs
27+ | ShowLibDir
28+ | ShowDocDir
29+ | ShowIncs
30+ | ShowPkgs
31+ | ShowLoggingCats
32+ | NoBasePkgs
33+ | NoPrelude
34+ | NoBuiltins -- only for the really primitive stuff!
35+ | NoREPL
36+ | OLogging Int
37+ | OLogCats [LogCat]
38+ | Output String
39+ | Interface
40+ | TypeCase
41+ | TypeInType
42+ | DefaultTotal
43+ | DefaultPartial
44+ | WarnPartial
45+ | WarnReach
46+ | AuditIPkg
47+ | EvalTypes
48+ | NoCoverage
49+ | ErrContext
50+ | ShowImpl
51+ | Verbose Int
52+ | Port REPLPort -- ^ REPL TCP port
53+ | IBCSubDir String
54+ | ImportDir String
55+ | SourceDir String
56+ | PkgBuild String
57+ | PkgInstall String
58+ | PkgClean String
59+ | PkgCheck String
60+ | PkgREPL String
61+ | PkgDocBuild String -- IdrisDoc
62+ | PkgDocInstall String
63+ | PkgTest String
64+ | PkgIndex FilePath
65+ | WarnOnly
66+ | Pkg String
67+ | BCAsm String
68+ | DumpDefun String
69+ | DumpCases String
70+ | UseCodegen Codegen
71+ | CodegenArgs String
72+ | OutputTy OutputType
73+ | Extension LanguageExt
74+ | InterpretScript String
75+ | EvalExpr String
76+ | TargetTriple String
77+ | TargetCPU String
78+ | OptLevel Int
79+ | AddOpt Optimisation
80+ | RemoveOpt Optimisation
81+ | Client String
82+ | ShowOrigErr
83+ | AutoWidth -- ^ Automatically adjust terminal width
84+ | AutoSolve -- ^ Automatically issue "solve" tactic in old-style interactive prover
85+ | UseConsoleWidth ConsoleWidth
86+ | DumpHighlights
87+ | DesugarNats
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)
91+
92+
93+data REPLPort = DontListen | ListenPort PortNumber
94+ deriving (Eq, Generic, Show)
95+
96+
97+data Codegen = Via IRFormat String
98+ | Bytecode
99+ deriving (Show, Eq, Generic)
100+
101+
102+data LanguageExt = TypeProviders | ErrorReflection | UniquenessTypes
103+ | DSLNotation | ElabReflection | FCReflection
104+ | LinearTypes
105+ deriving (Show, Eq, Read, Ord, Generic)
106+
107+data IRFormat = IBCFormat | JSONFormat deriving (Show, Eq, Generic)
108+
109+
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)
115+
116+data HowMuchDocs = FullDocs | OverviewDocs
117+
118+data OutputFmt = HTMLOutput | LaTeXOutput
119+
120+data Optimisation = PETransform -- ^ partial eval and associated transforms
121+ deriving (Show, Eq, Generic)
122+
123+-- | Recognised logging categories for the Idris compiler.
124+--
125+-- @TODO add in sub categories.
126+data LogCat = IParse
127+ | IElab
128+ | ICodeGen
129+ | IErasure
130+ | ICoverage
131+ | IIBC
132+ deriving (Show, Eq, Ord, Generic)
133+
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"
141+
142+codegenCats :: [LogCat]
143+codegenCats = [ICodeGen]
144+
145+parserCats :: [LogCat]
146+parserCats = [IParse]
147+
148+elabCats :: [LogCat]
149+elabCats = [IElab]
150+
151+loggingCatsStr :: String
152+loggingCatsStr = unlines
153+ [ (strLogCat IParse)
154+ , (strLogCat IElab)
155+ , (strLogCat ICodeGen)
156+ , (strLogCat IErasure)
157+ , (strLogCat ICoverage)
158+ , (strLogCat IIBC)
159+ ]
160+
161+getFile :: Opt -> Maybe String
162+getFile (Filename s) = Just s
163+getFile _ = Nothing
164+
165+getBC :: Opt -> Maybe String
166+getBC (BCAsm s) = Just s
167+getBC _ = Nothing
168+
169+getOutput :: Opt -> Maybe String
170+getOutput (Output s) = Just s
171+getOutput _ = Nothing
172+
173+getIBCSubDir :: Opt -> Maybe String
174+getIBCSubDir (IBCSubDir s) = Just s
175+getIBCSubDir _ = Nothing
176+
177+getImportDir :: Opt -> Maybe String
178+getImportDir (ImportDir s) = Just s
179+getImportDir _ = Nothing
180+
181+getSourceDir :: Opt -> Maybe String
182+getSourceDir (SourceDir s) = Just s
183+getSourceDir _ = Nothing
184+
185+getPkgDir :: Opt -> Maybe String
186+getPkgDir (Pkg s) = Just s
187+getPkgDir _ = Nothing
188+
189+getPkg :: Opt -> Maybe (Bool, String)
190+getPkg (PkgBuild s) = Just (False, s)
191+getPkg (PkgInstall s) = Just (True, s)
192+getPkg _ = Nothing
193+
194+getPkgClean :: Opt -> Maybe String
195+getPkgClean (PkgClean s) = Just s
196+getPkgClean _ = Nothing
197+
198+getPkgREPL :: Opt -> Maybe String
199+getPkgREPL (PkgREPL s) = Just s
200+getPkgREPL _ = Nothing
201+
202+getPkgCheck :: Opt -> Maybe String
203+getPkgCheck (PkgCheck s) = Just s
204+getPkgCheck _ = Nothing
205+
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
213+
214+getPkgTest :: Opt -- ^ the option to extract
215+ -> Maybe String -- ^ the package file to test
216+getPkgTest (PkgTest f) = Just f
217+getPkgTest _ = Nothing
218+
219+getCodegen :: Opt -> Maybe Codegen
220+getCodegen (UseCodegen x) = Just x
221+getCodegen _ = Nothing
222+
223+getCodegenArgs :: Opt -> Maybe String
224+getCodegenArgs (CodegenArgs args) = Just args
225+getCodegenArgs _ = Nothing
226+
227+getConsoleWidth :: Opt -> Maybe ConsoleWidth
228+getConsoleWidth (UseConsoleWidth x) = Just x
229+getConsoleWidth _ = Nothing
230+
231+getExecScript :: Opt -> Maybe String
232+getExecScript (InterpretScript expr) = Just expr
233+getExecScript _ = Nothing
234+
235+getPkgIndex :: Opt -> Maybe FilePath
236+getPkgIndex (PkgIndex file) = Just file
237+getPkgIndex _ = Nothing
238+
239+getEvalExpr :: Opt -> Maybe String
240+getEvalExpr (EvalExpr expr) = Just expr
241+getEvalExpr _ = Nothing
242+
243+getOutputTy :: Opt -> Maybe OutputType
244+getOutputTy (OutputTy t) = Just t
245+getOutputTy _ = Nothing
246+
247+getLanguageExt :: Opt -> Maybe LanguageExt
248+getLanguageExt (Extension e) = Just e
249+getLanguageExt _ = Nothing
250+
251+getTriple :: Opt -> Maybe String
252+getTriple (TargetTriple x) = Just x
253+getTriple _ = Nothing
254+
255+getCPU :: Opt -> Maybe String
256+getCPU (TargetCPU x) = Just x
257+getCPU _ = Nothing
258+
259+getOptLevel :: Opt -> Maybe Int
260+getOptLevel (OptLevel x) = Just x
261+getOptLevel _ = Nothing
262+
263+getOptimisation :: Opt -> Maybe (Bool,Optimisation)
264+getOptimisation (AddOpt p) = Just (True, p)
265+getOptimisation (RemoveOpt p) = Just (False, p)
266+getOptimisation _ = Nothing
267+
268+getColour :: Opt -> Maybe Bool
269+getColour (ColourREPL b) = Just b
270+getColour _ = Nothing
271+
272+getClient :: Opt -> Maybe String
273+getClient (Client x) = Just x
274+getClient _ = Nothing
275+
276+-- Get the first valid port
277+getPort :: [Opt] -> Maybe REPLPort
278+getPort [] = Nothing
279+getPort (Port p : _ ) = Just p
280+getPort (_ : xs) = getPort xs
281+
282+opt :: (Opt -> Maybe a) -> [Opt] -> [a]
283+opt = mapMaybe