kempe-0.1.0.1: src/Kempe/File.hs
module Kempe.File ( tcFile
, dumpMono
, dumpTyped
, irFile
, x86File
, dumpX86
, compile
, parsedFp
) where
-- common b/w test suite and exec, repl utils
import Control.Composition ((.*))
import Control.Exception (Exception, throwIO)
import Data.Bifunctor (bimap)
import qualified Data.ByteString.Lazy as BSL
import Data.Functor (void)
import qualified Data.Set as S
import Data.Tuple.Extra (fst3)
import Kempe.AST
import Kempe.Asm.X86.Type
import Kempe.Check.Pattern
import Kempe.Error
import Kempe.IR
import Kempe.Lexer
import Kempe.Parser
import Kempe.Pipeline
import Kempe.Proc.Nasm
import Kempe.Shuttle
import Kempe.TyAssign
import Prettyprinter (Doc, hardline)
import Prettyprinter.Render.Text (putDoc)
tcFile :: FilePath -> IO (Either (Error ()) ())
tcFile fp = do
contents <- BSL.readFile fp
(maxU, m) <- yeetIO $ parseWithMax contents
pure $ do
void $ runTypeM maxU (checkModule m)
mErr $ checkModuleExhaustive (void <$> m)
yeetIO :: Exception e => Either e a -> IO a
yeetIO = either throwIO pure
dumpTyped :: FilePath -> IO ()
dumpTyped fp = do
(i, m) <- parsedFp fp
(mTyped, _) <- yeetIO $ runTypeM i (assignModule m)
putDoc $ prettyTypedModule mTyped
dumpMono :: FilePath -> IO ()
dumpMono fp = do
(i, m) <- parsedFp fp
(mMono, _) <- yeetIO $ monomorphize i m
putDoc $ prettyTypedModule (fmap (bimap fromMonoConsAnn fromMono) mMono)
where fromMono (is, os) = StackType S.empty is os
fromMonoConsAnn (ConsAnn _ _ ty) = fromMono ty
dumpIR :: Int -> Module a c b -> Doc ann
dumpIR = prettyIR . fst3 .* irGen
dumpX86 :: Int -> Module a c b -> Doc ann
dumpX86 = prettyAsm .* x86Alloc
irFile :: FilePath -> IO ()
irFile fp = do
res <- parsedFp fp
putDoc $ uncurry dumpIR res <> hardline
parsedFp :: FilePath -> IO (Int, Module AlexPosn AlexPosn AlexPosn)
parsedFp fp = do
contents <- BSL.readFile fp
yeetIO $ parseWithMax contents
x86File :: FilePath -> IO ()
x86File fp = do
res <- parsedFp fp
putDoc $ uncurry dumpX86 res <> hardline
compile :: FilePath
-> FilePath
-> Bool -- ^ Debug symbols?
-> IO ()
compile fp o dbg = do
contents <- BSL.readFile fp
res <- yeetIO $ parseWithMax contents
writeO (uncurry dumpX86 res) o dbg