module DDC.Driver.Command.ToSalt
(cmdToSalt)
where
import DDC.Driver.Stage
import DDC.Driver.Source
import DDC.Build.Pipeline
import DDC.Build.Language
import DDC.Core.Fragment
import DDC.Core.Module
import DDC.Data.Canned
import System.FilePath
import Control.Monad.Trans.Error
import Control.Monad.IO.Class
import qualified DDC.Build.Language.Salt as Salt
import qualified DDC.Build.Language.Lite as Lite
import qualified DDC.Base.Pretty as P
import qualified Data.Map as Map
cmdToSalt
:: Config
-> Language
-> Source
-> String
-> ErrorT String IO ()
cmdToSalt config language source sourceText
| Language bundle <- language
, fragment <- bundleFragment bundle
, profile <- fragmentProfile fragment
= do let fragName = profileName profile
let mSuffix = case source of
SourceFile filePath -> Just $ takeExtension filePath
_ -> Nothing
let compile
| fragName == "Lite" || mSuffix == Just ".dcl"
= liftIO
$ pipeText (nameOfSource source) (lineStartOfSource source) sourceText
$ PipeTextLoadCore Lite.fragment
[ PipeCoreStrip
[ stageLiteOpt config source
[ stageLiteToSalt config source
[ stageSaltOpt config source
[ PipeCoreCheck Salt.fragment
[ (if configSuppressCoreImports config
then PipeCoreHacks (Canned (\x -> return $ eraseImports x))
else PipeCoreId)
[ PipeCoreOutput SinkStdout]]]]]]]
| otherwise
= throwError $ "Don't know how to convert this to Salt"
errs <- compile
case errs of
[] -> return ()
es -> throwError $ P.renderIndent $ P.vcat $ map P.ppr es
eraseImports :: Module a n -> Module a n
eraseImports mm
= mm { moduleImportKinds = Map.empty
, moduleImportTypes = Map.empty }