Skip to content

Commit 3384f20

Browse files
committed
Made a passing test
1 parent e72081e commit 3384f20

File tree

4 files changed

+29
-18
lines changed

4 files changed

+29
-18
lines changed

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Haskell/Print.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ module LambdaBuffers.Codegen.Haskell.Print (printTyDefOpaque, printTyDefNonOpaqu
33
import Control.Lens ((^.))
44
import Data.Char qualified as Char
55
import Data.Foldable (Foldable (toList))
6-
import Data.Map qualified as Map
76
import Data.Map.Ordered (OMap)
87
import Data.Set (Set)
98
import Data.Set qualified as Set
@@ -20,8 +19,8 @@ printModuleHeader (H.MkModuleName mn) exports =
2019

2120
printImports :: Set H.QTyName -> Doc a
2221
printImports imports =
23-
let grouped = Map.unionsWith Set.union [Map.singleton (c, mn) (Set.singleton tn) | (c, mn, tn) <- toList imports]
24-
typeImportsDocs = (\((_, H.MkModuleName mn), tns) -> "import qualified" <+> pretty mn <+> encloseSep lparen rparen comma ((\(H.MkTyName tn) -> pretty tn) <$> toList tns)) <$> Map.toList grouped
22+
let grouped = Set.fromList [(c, mn) | (c, mn, _tn) <- toList imports]
23+
typeImportsDocs = (\(_, H.MkModuleName mn) -> "import qualified" <+> pretty mn) <$> toList grouped
2524
typeImportsDoc = vsep typeImportsDocs
2625
in typeImportsDoc
2726

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Haskell/PrintM.hs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import LambdaBuffers.Codegen.Haskell.Config (Config, opaques)
2020
import LambdaBuffers.Codegen.Haskell.Print qualified as Print
2121
import LambdaBuffers.Codegen.Haskell.Syntax qualified as H
2222
import LambdaBuffers.Compiler.ProtoCompat.InfoLess qualified as PC
23-
import LambdaBuffers.Compiler.ProtoCompat.Types (Module, TyAbs (TyAbs), TyBody (OpaqueI, SumI), TyDef)
2423
import LambdaBuffers.Compiler.ProtoCompat.Types qualified as PC
2524
import Prettyprinter (Doc)
2625
import Proto.Compiler qualified as P
@@ -51,7 +50,7 @@ data PrintState = MkPrintState
5150

5251
type 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 ())
5554
runPrint 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
9594
goModule 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 ()
10099
goTyDef 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 ()

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Haskell/Syntax.hs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
module LambdaBuffers.Codegen.Haskell.Syntax (QTyName, QClassName, CabalPackageName (..), ModuleName (..), TyName (..), ClassName (..), FunctionName (..), fromLbModuleName, cabalFromLbModuleName, fromLbTyName) where
1+
module LambdaBuffers.Codegen.Haskell.Syntax (QTyName, QClassName, CabalPackageName (..), ModuleName (..), TyName (..), ClassName (..), FunctionName (..), fromLbModuleName, cabalFromLbModuleName, fromLbTyName, fromLbForeignRef) where
22

33
import Control.Lens ((^.))
44
import Data.Text (Text)
@@ -23,3 +23,10 @@ fromLbModuleName mn = MkModuleName $ Text.intercalate "." ("LambdaBuffers" : [p
2323
-- TODO(bladyjoker): Figure out the Cabal package name syntax.
2424
cabalFromLbModuleName :: PC.ModuleName -> CabalPackageName
2525
cabalFromLbModuleName mn = MkCabalPackageName $ Text.intercalate "-" ([Text.toLower $ p ^. #name | p <- mn ^. #parts] <> ["-lb"])
26+
27+
fromLbForeignRef :: PC.ForeignRef -> QTyName
28+
fromLbForeignRef fr =
29+
( cabalFromLbModuleName $ fr ^. #moduleName
30+
, fromLbModuleName $ fr ^. #moduleName
31+
, fromLbTyName $ fr ^. #tyName
32+
)

lambda-buffers-codegen/test/Test/LambdaBuffers/Codegen/Haskell.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ tests :: TestTree
2525
tests =
2626
testGroup
2727
"LambdaBuffers.Codegen.Haskell"
28-
[testCase "should succeed" $ testPrint testCompInp testConfig ""]
28+
[testCase "should succeed" $ testPrint testCompInp testConfig "module LambdaBuffers.TestMod (Either,I8,Maybe,Set) where\n\n\nimport qualified Data.Int\nimport qualified Data.Set\n\n\ndata Either a b = Either'Left a | Either'Right b\ntype I8 = Data.Int.Int8\ndata Maybe a = Maybe'Just a | Maybe'Nothing \ntype Set = Data.Set.Set\n\n\nmodule LambdaBuffers.TestMod2 (Foo,I16) where\n\n\nimport qualified Data.Int\nimport qualified LambdaBuffers.TestMod\n\n\ndata Foo a = Foo'MkFoo a I16 TestMod.I8\ntype I16 = Data.Int.Int16\n\n"]
2929

3030
testPrint :: P.CompilerInput -> H.Config -> String -> Assertion
3131
testPrint compInp cfg want = do

0 commit comments

Comments
 (0)