-- | A module for compiling Scala source files using @scalac@. module System.Build.Scala.Scalac( Fsc, Scalac, -- * @Scalac@ members debug, nowarn, verbose, deprecation, unchecked, classpath, sourcepath, bootclasspath, extdirs, directory, encoding, target, print, optimise, explaintypes, uniqid, version, help, (?), etc, -- * @Scalac@ values scalac, scalac', kscalac, fscalac, -- * @Fsc@ members reset, shutdown, server, flags, -- * @Fsc@ values fsc ) where import Prelude hiding (print) import System.Build.Args import System.Build.Scala.Debug import System.Build.Scala.Target import System.Build.CompilePaths import System.Build.Extensions import System.Build.OutputDirectory import System.Build.OutputReferenceSet import System.Build.OutputReferenceGet import System.Build.Command import Data.List import Data.Maybe import System.FilePath -- | Scalac is the compiler for Scala source files. data Scalac = Scalac { debug :: Maybe Debug, -- ^ @-g@ nowarn :: Bool, -- ^ @-nowarn@ verbose :: Bool, -- ^ @-verbose@ deprecation :: Bool, -- ^ @-deprecation@ unchecked :: Bool, -- ^ @-unchecked@ classpath :: [FilePath], -- ^ @-classpath@ sourcepath :: [FilePath], -- ^ @-sourcepath@ bootclasspath :: [FilePath], -- ^ @-bootclasspath@ extdirs :: [FilePath], -- ^ @-extdirs@ directory :: Maybe FilePath, -- ^ @-d@ encoding :: Maybe String, -- ^ @-encoding@ target :: Maybe Target, -- ^ @-target@ print :: Bool, -- ^ @-print@ optimise :: Bool, -- ^ @-optimise@ explaintypes :: Bool, -- ^ @-explaintypes@ uniqid :: Bool, -- ^ @-uniqid@ version :: Bool, -- ^ @-version@ help :: Bool, -- ^ @-help@ (?) :: Maybe FilePath, -- ^ @\@@ etc :: Maybe String } -- | A @Scalac@ with nothing set. scalac :: Scalac scalac = Scalac Nothing False False False False [] [] [] [] Nothing Nothing Nothing False False False False False False Nothing Nothing -- | Construct a @Scalac@. scalac' :: Maybe System.Build.Scala.Debug.Debug -> Bool -> Bool -> Bool -> Bool -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe FilePath -> Maybe String -> Maybe Target -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Maybe String -> Scalac scalac' = Scalac -- | Convert the given scalac to a list of command line options which may be used by other scala tools. kscalac :: Scalac -> [String] kscalac (Scalac debug' nowarn' verbose' deprecation' unchecked' classpath' sourcepath' bootclasspath' extdirs' directory' encoding' target' print' optimise' explaintypes' uniqid' version' help' script' etc') = ["g" -~> debug', "nowarn" ~~ nowarn', "verbose" ~~ verbose', "deprecation" ~~ deprecation', "unchecked" ~~ unchecked', "classpath" ~: classpath', "sourcepath" ~: sourcepath', "bootclasspath" ~: bootclasspath', "extdirs" ~: extdirs', "d" ~~> directory', "encoding" ~~> encoding', "target" -~> target', "print" ~~ print', "optimise" ~~ optimise', "explaintypes" ~~ explaintypes', "uniqid" ~~ uniqid', "version" ~~ version', "help" ~~ help', (:) '@' ~? script', fromMaybe [] etc'] instance Show Scalac where show s = kscalac s ^^^ " " instance CompilePaths Scalac where j =>> ps = show j ++ ' ' : space ps instance Extensions Scalac where exts _ = ["java", "scala"] instance OutputDirectory Scalac where outdir = directory instance OutputReferenceSet Scalac where setReference p j = j { classpath = p } instance OutputReferenceGet Scalac where getReference = classpath instance Command Scalac where command _ = let envs = [ ("SCALA_HOME", ( "bin" "scalac")), ("SCALAC", id) ] in fromMaybe "scalac" `fmap` tryEnvs envs -- | The Scala fast compiler (@fsc@). data Fsc = Fsc { fscalac :: Scalac, -- ^ The scalac options to use. reset :: Bool, -- ^ @-reset@ shutdown :: Bool, -- ^ @-shutdown@ server :: Maybe (String, String), -- ^ @-server@ flags :: [String] -- ^ @-flags@ } instance Show Fsc where show (Fsc fscalac' reset' shutdown' server' flags') = (kscalac fscalac' ++ ["reset" ~~ reset', "shutdown" ~~ shutdown', maybe [] (uncurry (++)) server', intercalate " " (fmap ("-J" ++) flags')]) ^^^ " " instance CompilePaths Fsc where j =>> ps = show j ++ ' ' : space ps instance Extensions Fsc where exts _ = ["java", "scala"] instance OutputDirectory Fsc where outdir = directory . fscalac instance OutputReferenceSet Fsc where setReference p j = let s = fscalac j in j { fscalac = setReference p s } instance OutputReferenceGet Fsc where getReference = getReference . fscalac instance Command Fsc where command _ = let envs = [ ("SCALA_HOME", ( "bin" "fsc")), ("FSC", id) ] in fromMaybe "fsc" `fmap` tryEnvs envs -- | A @Fsc@ with nothing set. fsc :: Fsc fsc = Fsc scalac False False Nothing []