@@ -20,7 +20,6 @@ import LambdaBuffers.Codegen.Haskell.Config (Config, opaques)
2020import LambdaBuffers.Codegen.Haskell.Print qualified as Print
2121import LambdaBuffers.Codegen.Haskell.Syntax qualified as H
2222import LambdaBuffers.Compiler.ProtoCompat.InfoLess qualified as PC
23- import LambdaBuffers.Compiler.ProtoCompat.Types (Module , TyAbs (TyAbs ), TyBody (OpaqueI , SumI ), TyDef )
2423import LambdaBuffers.Compiler.ProtoCompat.Types qualified as PC
2524import Prettyprinter (Doc )
2625import Proto.Compiler qualified as P
@@ -51,7 +50,7 @@ data PrintState = MkPrintState
5150
5251type MonadPrint m = (MonadRWS PrintRead PrintWrite PrintState m , MonadError PrintErr m )
5352
54- runPrint :: Config -> Module -> Either P. CompilerError (Doc () )
53+ runPrint :: Config -> PC. Module -> Either P. CompilerError (Doc () )
5554runPrint cfg m =
5655 let p = runRWST (goModule m) (cfg, ModuleCtx $ m ^. # moduleName) (MkPrintState mempty mempty mempty )
5756 p' = runExcept p
@@ -91,16 +90,16 @@ _importClass :: MonadPrint m => (H.QClassName, [H.FunctionName]) -> m ()
9190_importClass qhClassRef = modify (\ s -> s {moduleClassImports = Set. union (moduleClassImports s) (Set. singleton qhClassRef)})
9291
9392-- | Traverse the module and collect imports, exports and type definition documents.
94- goModule :: MonadPrint m => Module -> m H. ModuleName
93+ goModule :: MonadPrint m => PC. Module -> m H. ModuleName
9594goModule m = do
9695 for_ (m ^. # typeDefs) (\ td -> local (\ (cfg, _) -> (cfg, TyDefCtx (m ^. # moduleName) td)) (goTyDef td))
9796 return $ H. fromLbModuleName (m ^. # moduleName)
9897
99- goTyDef :: MonadPrint m => TyDef -> m ()
98+ goTyDef :: MonadPrint m => PC. TyDef -> m ()
10099goTyDef td = goTyAbs $ td ^. # tyAbs
101100
102- goTyAbs :: MonadPrint m => TyAbs -> m ()
103- goTyAbs (TyAbs _ (OpaqueI _) _) = do
101+ goTyAbs :: MonadPrint m => PC. TyAbs -> m ()
102+ goTyAbs (PC. TyAbs _ (PC. OpaqueI _) _) = do
104103 cfg <- askConfig
105104 (currentModuleName, currentTyDef) <- askTyDefCtx
106105 qhTyRef <- case Map. lookup (PC. mkInfoLess currentModuleName, PC. mkInfoLess $ currentTyDef ^. # tyName) (cfg ^. opaques) of
@@ -111,16 +110,22 @@ goTyAbs (TyAbs _ (OpaqueI _) _) = do
111110 tell
112111 [ AddTyDef $ Print. printTyDefOpaque (currentTyDef ^. # tyName) qhTyRef
113112 ]
114- goTyAbs (TyAbs args (SumI s) _) = do
113+ goTyAbs (PC. TyAbs args (PC. SumI s) _) = do
114+ goSum s
115115 currentTyDef <- snd <$> askTyDefCtx
116116 exportTy (H. fromLbTyName (currentTyDef ^. # tyName))
117117 tell
118118 [ AddTyDef $ Print. printTyDefNonOpaque (currentTyDef ^. # tyName) args (Print. Sum s)
119119 ]
120120
121- _foreignTyRefToHaskImport :: PC. ForeignRef -> (H. CabalPackageName , H. ModuleName , H. TyName )
122- _foreignTyRefToHaskImport fr =
123- ( H. cabalFromLbModuleName $ fr ^. # moduleName
124- , H. fromLbModuleName $ fr ^. # moduleName
125- , H. fromLbTyName $ fr ^. # tyName
126- )
121+ goSum :: MonadPrint m => PC. Sum -> m ()
122+ goSum s = for_ (s ^. # constructors) (\ c -> goProduct (c ^. # product ))
123+
124+ goProduct :: MonadPrint m => PC. Product -> m ()
125+ goProduct (PC. TupleI t) = for_ (t ^. # fields) goTy
126+ goProduct (PC. RecordI r) = for_ (r ^. # fields) (\ f -> goTy $ f ^. # fieldTy)
127+
128+ goTy :: MonadPrint m => PC. Ty -> m ()
129+ goTy (PC. TyRefI (PC. ForeignI fr)) = importTy (H. fromLbForeignRef fr)
130+ goTy (PC. TyAppI ta) = goTy (ta ^. # tyFunc) >> for_ (ta ^. # tyArgs) goTy
131+ goTy _ = return ()
0 commit comments