@@ -7,13 +7,15 @@ import Control.Monad ( unless, filterM )
77import Control.Monad.IO.Class ( liftIO )
88import Control.DeepSeq ( NFData (rnf ) )
99import Data.Function ( (&) )
10+ import Data.List.NonEmpty ( NonEmpty )
11+ import Data.List.NonEmpty qualified as NEL
1012import Data.Maybe ( fromMaybe )
1113import Data.Version ( showVersion )
1214import Data.Text ( pack )
1315import GHC.Generics ( Generic )
1416import System.Console.GetOpt ( OptDescr (Option ), ArgDescr (.. ) )
1517import System.Directory ( createDirectoryIfMissing )
16- import System.FilePath ( (</>) )
18+ import System.FilePath ( (</>) , (-<.>) )
1719import Data.Text.Lazy.IO qualified as LText
1820
1921import Paths_agda2lambox ( version )
@@ -32,6 +34,7 @@ import Agda2Lambox.Compile (compile)
3234import CoqGen ( prettyCoq )
3335import SExpr ( prettySexp )
3436import LambdaBox.Env
37+ import LambdaBox.Names (KerName )
3538import Agda2Lambox.Compile.Monad (runCompile , CompileEnv (.. ))
3639
3740
@@ -124,25 +127,37 @@ writeModule
124127writeModule opts menv NotMain _ _ = pure ()
125128writeModule Options {.. } menv IsMain m defs = do
126129 outDir <- flip fromMaybe optOutDir <$> compileDir
127- env <- runCompile (CompileEnv optNoBlocks) $ compile optTarget defs
128130 programs <- filterM hasPragma defs
129131
132+ -- get defs annotated with a COMPILE pragma
133+ -- throw an error if none, when targetting untyped lbox
134+ mains <- getMain optTarget programs
135+ env <- runCompile (CompileEnv optNoBlocks) $ compile optTarget defs
136+
130137 liftIO $ createDirectoryIfMissing True outDir
131138
132- let fileName = ( outDir </> ) . moduleNameToFileName m
133- coqMod = CoqModule env ( map qnameToKName programs)
139+ let fileName = outDir </> prettyShow m
140+ let lboxMod = LBoxModule env mains
134141
135142 liftIO do
136- putStrLn $ " Writing " <> fileName " .txt"
137- pp coqMod <> " \n " & writeFile (fileName " .txt" )
143+ putStrLn $ " Writing " <> fileName -<.> " .txt"
144+ pp lboxMod <> " \n " & writeFile (fileName -<.> " .txt" )
138145
139146 liftIO $ case optOutput of
140147 RocqOutput -> do
141- putStrLn $ " Writing " <> fileName " .v"
142- prettyCoq optTarget coqMod <> " \n "
143- & writeFile (fileName " .v" )
148+ putStrLn $ " Writing " <> fileName -<.> " .v"
149+ prettyCoq optTarget lboxMod <> " \n "
150+ & writeFile (fileName -<.> " .v" )
144151
145152 AstOutput -> do
146- putStrLn $ " Writing " <> fileName " .ast"
147- prettySexp optTarget coqMod <> " \n "
148- & LText. writeFile (fileName " .ast" )
153+ putStrLn $ " Writing " <> fileName -<.> " .ast"
154+ prettySexp optTarget lboxMod <> " \n "
155+ & LText. writeFile (fileName -<.> " .ast" )
156+
157+ where
158+ getMain :: Target t -> [QName ] -> TCM (WhenUntyped t (NonEmpty KerName ))
159+ getMain ToTyped _ = pure NoneU
160+ getMain ToUntyped qs =
161+ case NEL. nonEmpty qs of
162+ Nothing -> genericError " No main program specified. Please use a COMPILE pragma."
163+ Just ms -> pure $ SomeU (NEL. map qnameToKName ms)
0 commit comments