module Helium.StaticAnalysis.Directives.TS_Compile where
import Helium.StaticAnalysis.Directives.TS_CoreSyntax
import Helium.ModuleSystem.ImportEnvironment
import Helium.StaticAnalysis.Directives.TS_ToCore (typingStrategyToCore)
import System.Exit (exitWith, ExitCode(..) )
import System.Directory (doesFileExist)
import Helium.StaticAnalysis.Directives.TS_Parser (parseTypingStrategies)
import Helium.Parser.Lexer (strategiesLexer)
import Helium.StaticAnalysis.Directives.TS_Analyse (analyseTypingStrategies)
import Helium.StaticAnalysis.Messages.HeliumMessages (sortAndShowMessages)
import Control.Monad (unless, when)
import qualified Helium.Main.Args as Args
import Helium.Parser.ParseMessage ()
import Helium.CodeGeneration.CoreUtils
import Lvm.Core.Expr
readTypingStrategiesFromFile :: [Args.Option] -> String -> ImportEnvironment ->
IO (Core_TypingStrategies, [CoreDecl])
readTypingStrategiesFromFile options filename importEnvironment =
doesFileExist filename >>=
\exists -> if not exists then return ([], []) else
do fileContent <- readFile filename
case strategiesLexer options filename fileContent of
Left lexError -> do
putStrLn "Parse error in typing strategy: "
putStr . sortAndShowMessages $ [lexError]
exitWith (ExitFailure 1)
Right (tokens, _) ->
case parseTypingStrategies (operatorTable importEnvironment) filename tokens of
Left parseError -> do
putStrLn "Parse error in typing strategy: "
putStr . sortAndShowMessages $ [parseError]
exitWith (ExitFailure 1)
Right strategies ->
do let (errors, warnings) = analyseTypingStrategies strategies importEnvironment
unless (null errors) $
do putStr . sortAndShowMessages $ errors
exitWith (ExitFailure 1)
unless (Args.NoWarnings `elem` options || null warnings) $
do putStrLn "\nWarnings in typing strategies:"
putStrLn . sortAndShowMessages $ warnings
let number = length strategies
when (Args.Verbose `elem` options && number > 0) $
putStrLn (" (" ++
(if number == 1
then "1 strategy is included)"
else show number ++ " strategies are included)"))
let coreTypingStrategies = map (typingStrategyToCore importEnvironment) strategies
when (Args.DumpTypeDebug `elem` options) $
do putStrLn "Core typing strategies:"
mapM_ print coreTypingStrategies
return ( coreTypingStrategies, [ customStrategy (show coreTypingStrategies) ] )