module Elara.Settings where

data CompilerSettings = CompilerSettings
    { CompilerSettings -> Set DumpTarget
dumpTargets :: Set DumpTarget
    -- ^ Which compilation stages to dump
    , CompilerSettings -> Maybe FilePath
mainFile :: Maybe FilePath
    -- ^ The main file to compile/run
    , CompilerSettings -> [FilePath]
sourceDirs :: [FilePath]
    -- ^ Directories to search for source files
    , CompilerSettings -> [FilePath]
programArgs :: [String]
    -- ^ A list of arguments to pass to the program being run
    , CompilerSettings -> FilePath
outputDir :: FilePath
    -- ^ Directory for build artifacts (e.g. JVM class files, dump output)
    }
    deriving (Int -> CompilerSettings -> ShowS
[CompilerSettings] -> ShowS
CompilerSettings -> FilePath
(Int -> CompilerSettings -> ShowS)
-> (CompilerSettings -> FilePath)
-> ([CompilerSettings] -> ShowS)
-> Show CompilerSettings
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CompilerSettings -> ShowS
showsPrec :: Int -> CompilerSettings -> ShowS
$cshow :: CompilerSettings -> FilePath
show :: CompilerSettings -> FilePath
$cshowList :: [CompilerSettings] -> ShowS
showList :: [CompilerSettings] -> ShowS
Show, CompilerSettings -> CompilerSettings -> Bool
(CompilerSettings -> CompilerSettings -> Bool)
-> (CompilerSettings -> CompilerSettings -> Bool)
-> Eq CompilerSettings
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CompilerSettings -> CompilerSettings -> Bool
== :: CompilerSettings -> CompilerSettings -> Bool
$c/= :: CompilerSettings -> CompilerSettings -> Bool
/= :: CompilerSettings -> CompilerSettings -> Bool
Eq)

data DumpTarget
    = DumpLexed
    | DumpParsed
    | DumpDesugared
    | DumpRenamed
    | DumpShunted
    | DumpTyped
    | DumpCore
    | DumpIR
    | DumpJVM
    deriving (Int -> DumpTarget -> ShowS
[DumpTarget] -> ShowS
DumpTarget -> FilePath
(Int -> DumpTarget -> ShowS)
-> (DumpTarget -> FilePath)
-> ([DumpTarget] -> ShowS)
-> Show DumpTarget
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DumpTarget -> ShowS
showsPrec :: Int -> DumpTarget -> ShowS
$cshow :: DumpTarget -> FilePath
show :: DumpTarget -> FilePath
$cshowList :: [DumpTarget] -> ShowS
showList :: [DumpTarget] -> ShowS
Show, DumpTarget -> DumpTarget -> Bool
(DumpTarget -> DumpTarget -> Bool)
-> (DumpTarget -> DumpTarget -> Bool) -> Eq DumpTarget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DumpTarget -> DumpTarget -> Bool
== :: DumpTarget -> DumpTarget -> Bool
$c/= :: DumpTarget -> DumpTarget -> Bool
/= :: DumpTarget -> DumpTarget -> Bool
Eq, Eq DumpTarget
Eq DumpTarget =>
(DumpTarget -> DumpTarget -> Ordering)
-> (DumpTarget -> DumpTarget -> Bool)
-> (DumpTarget -> DumpTarget -> Bool)
-> (DumpTarget -> DumpTarget -> Bool)
-> (DumpTarget -> DumpTarget -> Bool)
-> (DumpTarget -> DumpTarget -> DumpTarget)
-> (DumpTarget -> DumpTarget -> DumpTarget)
-> Ord DumpTarget
DumpTarget -> DumpTarget -> Bool
DumpTarget -> DumpTarget -> Ordering
DumpTarget -> DumpTarget -> DumpTarget
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DumpTarget -> DumpTarget -> Ordering
compare :: DumpTarget -> DumpTarget -> Ordering
$c< :: DumpTarget -> DumpTarget -> Bool
< :: DumpTarget -> DumpTarget -> Bool
$c<= :: DumpTarget -> DumpTarget -> Bool
<= :: DumpTarget -> DumpTarget -> Bool
$c> :: DumpTarget -> DumpTarget -> Bool
> :: DumpTarget -> DumpTarget -> Bool
$c>= :: DumpTarget -> DumpTarget -> Bool
>= :: DumpTarget -> DumpTarget -> Bool
$cmax :: DumpTarget -> DumpTarget -> DumpTarget
max :: DumpTarget -> DumpTarget -> DumpTarget
$cmin :: DumpTarget -> DumpTarget -> DumpTarget
min :: DumpTarget -> DumpTarget -> DumpTarget
Ord, Int -> DumpTarget
DumpTarget -> Int
DumpTarget -> [DumpTarget]
DumpTarget -> DumpTarget
DumpTarget -> DumpTarget -> [DumpTarget]
DumpTarget -> DumpTarget -> DumpTarget -> [DumpTarget]
(DumpTarget -> DumpTarget)
-> (DumpTarget -> DumpTarget)
-> (Int -> DumpTarget)
-> (DumpTarget -> Int)
-> (DumpTarget -> [DumpTarget])
-> (DumpTarget -> DumpTarget -> [DumpTarget])
-> (DumpTarget -> DumpTarget -> [DumpTarget])
-> (DumpTarget -> DumpTarget -> DumpTarget -> [DumpTarget])
-> Enum DumpTarget
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: DumpTarget -> DumpTarget
succ :: DumpTarget -> DumpTarget
$cpred :: DumpTarget -> DumpTarget
pred :: DumpTarget -> DumpTarget
$ctoEnum :: Int -> DumpTarget
toEnum :: Int -> DumpTarget
$cfromEnum :: DumpTarget -> Int
fromEnum :: DumpTarget -> Int
$cenumFrom :: DumpTarget -> [DumpTarget]
enumFrom :: DumpTarget -> [DumpTarget]
$cenumFromThen :: DumpTarget -> DumpTarget -> [DumpTarget]
enumFromThen :: DumpTarget -> DumpTarget -> [DumpTarget]
$cenumFromTo :: DumpTarget -> DumpTarget -> [DumpTarget]
enumFromTo :: DumpTarget -> DumpTarget -> [DumpTarget]
$cenumFromThenTo :: DumpTarget -> DumpTarget -> DumpTarget -> [DumpTarget]
enumFromThenTo :: DumpTarget -> DumpTarget -> DumpTarget -> [DumpTarget]
Enum, DumpTarget
DumpTarget -> DumpTarget -> Bounded DumpTarget
forall a. a -> a -> Bounded a
$cminBound :: DumpTarget
minBound :: DumpTarget
$cmaxBound :: DumpTarget
maxBound :: DumpTarget
Bounded, (forall x. DumpTarget -> Rep DumpTarget x)
-> (forall x. Rep DumpTarget x -> DumpTarget) -> Generic DumpTarget
forall x. Rep DumpTarget x -> DumpTarget
forall x. DumpTarget -> Rep DumpTarget x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DumpTarget -> Rep DumpTarget x
from :: forall x. DumpTarget -> Rep DumpTarget x
$cto :: forall x. Rep DumpTarget x -> DumpTarget
to :: forall x. Rep DumpTarget x -> DumpTarget
Generic)

-- | Default is simply an empty set
defaultSettings :: CompilerSettings
defaultSettings :: CompilerSettings
defaultSettings =
    CompilerSettings
        { dumpTargets :: Set DumpTarget
dumpTargets = Set DumpTarget
forall a. Monoid a => a
mempty
        , mainFile :: Maybe FilePath
mainFile = Maybe FilePath
forall a. Maybe a
Nothing
        , sourceDirs :: [FilePath]
sourceDirs = []
        , programArgs :: [FilePath]
programArgs = []
        , outputDir :: FilePath
outputDir = FilePath
"build"
        }