@@ -35,6 +35,7 @@ import CoqGen ( prettyCoq )
3535import SExpr ( prettySexp )
3636import LambdaBox.Env
3737import LambdaBox.Names (KerName )
38+ import LambdaBox.Typecheck (typecheck )
3839import Agda2Lambox.Compile.Monad (runCompile , CompileEnv (.. ))
3940
4041
@@ -48,12 +49,13 @@ data Output = RocqOutput | AstOutput
4849data Options = forall t . Options
4950 { optOutDir :: Maybe FilePath
5051 , optTarget :: Target t
52+ , optWithTC :: Bool
5153 , optOutput :: Output
5254 , optNoBlocks :: Bool
5355 }
5456
5557instance NFData Options where
56- rnf (Options m t o nb) = rnf m `seq` rnf t `seq` rnf o `seq` rnf nb
58+ rnf (Options m t tc o nb) = rnf m `seq` rnf t `seq` rnf tc `seq` rnf o `seq` rnf nb
5759
5860-- | Setter for output directory option.
5961outdirOpt :: Monad m => FilePath -> Options -> m Options
@@ -68,11 +70,15 @@ rocqOpt opts = return opts { optOutput = RocqOutput }
6870noBlocksOpt :: Monad m => Options -> m Options
6971noBlocksOpt opts = return opts { optNoBlocks = True }
7072
73+ withTC :: Monad m => Options -> m Options
74+ withTC opts = return opts { optWithTC = True }
75+
7176-- | Default backend options.
7277defaultOptions :: Options
7378defaultOptions = Options
7479 { optOutDir = Nothing
7580 , optTarget = ToUntyped
81+ , optWithTC = False
7682 , optOutput = AstOutput
7783 , optNoBlocks = False
7884 }
@@ -97,6 +103,8 @@ agda2lambox = Backend backend
97103 " Write output files to DIR. (default: project root)"
98104 , Option [' t' ] [" typed" ] (NoArg typedOpt)
99105 " Compile to typed λ□ environments."
106+ , Option " tc" [" typecheck" ] (NoArg typedOpt)
107+ " Typecheck output λ□."
100108 , Option [' c' ] [" rocq" ] (NoArg rocqOpt)
101109 " Output a Rocq file."
102110 , Option [] [" no-blocks" ] (NoArg noBlocksOpt)
@@ -134,6 +142,11 @@ writeModule Options{..} menv IsMain m defs = do
134142 mains <- getMain optTarget programs
135143 env <- runCompile (CompileEnv optNoBlocks) $ compile defs
136144
145+ liftIO $ putStrLn $ " Typechecking generated λ□."
146+ if (typecheck env)
147+ then genericError " Failure"
148+ else liftIO $ putStrLn " Success"
149+
137150 liftIO $ createDirectoryIfMissing True outDir
138151
139152 let fileName = outDir </> prettyShow m
0 commit comments