Skip to content

Commit 6f60a48

Browse files
committed
Rust codegen: collect all Rust foreign references under Refs module
1 parent 59e3157 commit 6f60a48

File tree

6 files changed

+70
-68
lines changed

6 files changed

+70
-68
lines changed

lambda-buffers-codegen/lambda-buffers-codegen.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ library
151151
LambdaBuffers.Codegen.Rust.Print.InstanceDef
152152
LambdaBuffers.Codegen.Rust.Print.LamVal
153153
LambdaBuffers.Codegen.Rust.Print.MonadPrint
154+
LambdaBuffers.Codegen.Rust.Print.Refs
154155
LambdaBuffers.Codegen.Rust.Print.Syntax
155156
LambdaBuffers.Codegen.Rust.Print.TyDef
156157

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Print/Derive.hs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import LambdaBuffers.Codegen.LamVal.PlutusData (deriveFromPlutusDataImpl, derive
1313
import LambdaBuffers.Codegen.Print qualified as Print
1414
import LambdaBuffers.Codegen.Rust.Print (MonadPrint)
1515
import LambdaBuffers.Codegen.Rust.Print.LamVal (printInstance)
16+
import LambdaBuffers.Codegen.Rust.Print.Refs qualified as RR
1617
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
1718
import LambdaBuffers.ProtoCompat qualified as PC
1819
import Prettyprinter (Doc, align, braces, colon, comma, encloseSep, hcat, indent, lparen, parens, rparen, space, vsep, (<+>))
@@ -31,22 +32,10 @@ rsTraitImplPrinters ::
3132
)
3233
rsTraitImplPrinters =
3334
Map.fromList
34-
[
35-
( R.qForeignRef R.MkTraitName "std" ["cmp"] "PartialEq"
36-
, printDerivePartialEqBase
37-
)
38-
,
39-
( R.qForeignRef R.MkTraitName "std" ["cmp"] "Eq"
40-
, printDeriveEqBase
41-
)
42-
,
43-
( R.qForeignRef R.MkTraitName "plutus-ledger-api" ["plutus_data"] "IsPlutusData"
44-
, printDeriveIsPlutusData
45-
)
46-
,
47-
( R.qForeignRef R.MkTraitName "lbr-prelude" ["json"] "Json"
48-
, printDeriveJson
49-
)
35+
[ (RR.partialEqTrait, printDerivePartialEqBase)
36+
, (RR.eqTrait, printDeriveEqBase)
37+
, (RR.isPlutusDataTrait, printDeriveIsPlutusData)
38+
, (RR.jsonTrait, printDeriveJson)
5039
]
5140
eqTraitMethodName :: R.ValueName
5241
eqTraitMethodName = R.MkValueName "eq"

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Print/InstanceDef.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Control.Lens (view)
44
import Data.Foldable (Foldable (toList))
55
import Data.Set (Set)
66
import Data.Set qualified as Set
7+
import LambdaBuffers.Codegen.Rust.Print.Refs qualified as RR
78
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
89
import LambdaBuffers.Codegen.Rust.Print.TyDef (printTyInner)
910
import LambdaBuffers.ProtoCompat qualified as PC
@@ -36,7 +37,7 @@ printInstanceContext :: R.QTraitName -> [PC.Ty] -> Doc ann
3637
printInstanceContext rsQTraitName = printInstanceContext' [rsQTraitName]
3738

3839
defaultTraitBounds :: [R.QTraitName]
39-
defaultTraitBounds = [R.qForeignRef R.MkTraitName "std" ["clone"] "Clone"]
40+
defaultTraitBounds = [RR.cloneTrait]
4041

4142
printInstanceContext' :: [R.QTraitName] -> [PC.Ty] -> Doc ann
4243
printInstanceContext' rsQTraitNames tys =

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Print/LamVal.hs

Lines changed: 14 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,55 +13,29 @@ import Data.Text qualified as Text
1313
import Data.Traversable (for)
1414
import LambdaBuffers.Codegen.LamVal qualified as LV
1515
import LambdaBuffers.Codegen.LamVal.MonadPrint qualified as LV
16+
import LambdaBuffers.Codegen.Rust.Print.Refs qualified as RR
1617
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
1718
import LambdaBuffers.Codegen.Rust.Print.TyDef qualified as TD
1819
import LambdaBuffers.Compiler.LamTy qualified as LT
1920
import LambdaBuffers.ProtoCompat qualified as PC
2021
import Prettyprinter (Doc, Pretty (pretty), align, angles, braces, brackets, colon, comma, dot, dquotes, encloseSep, equals, group, langle, lbracket, line, lparen, parens, pipe, punctuate, rangle, rbracket, rparen, semi, space, vsep, (<+>))
2122
import Proto.Codegen_Fields qualified as P
2223

23-
caseIntERef :: R.QValName
24-
caseIntERef = R.qForeignRef R.MkValueName "lbr-prelude" ["lamval"] "case_int"
25-
26-
bigInt :: R.QValName
27-
bigInt = R.qForeignRef R.MkValueName "num-bigint" [] "BigInt"
28-
29-
vecAsSlice :: R.QValName
30-
vecAsSlice = R.qForeignRef R.MkValueName "lbr-prelude" ["lamval"] "case_int"
31-
32-
vecMacro :: R.QValName
33-
vecMacro = R.qForeignRef R.MkValueName "std" [] "vec!"
34-
35-
fromU32Trait :: R.QTraitName
36-
fromU32Trait = R.qForeignRef R.MkTraitName "std" ["convert"] "From<u32>"
37-
38-
fromStrTrait :: R.QTraitName
39-
fromStrTrait = R.qForeignRef R.MkTraitName "std" ["convert"] "From<&str>"
40-
41-
cloneTrait :: R.QTraitName
42-
cloneTrait = R.qForeignRef R.MkTraitName "std" ["clone"] "Clone"
43-
44-
boxNew :: R.QValName
45-
boxNew = R.qForeignRef R.MkValueName "std" ["boxed"] "Box::new"
46-
47-
phantomData :: R.QTyName
48-
phantomData = R.qForeignRef R.MkTyName "std" ["marker"] "PhantomData"
49-
5024
{- | Clone a value (converting a type to owned)
5125
As in codegen we cannot know whether a type is owned or borrowed, we make sure to have an owned type by making a clone.
5226
We must also borrow it first for the same reason (worst case it's a double && which Rust knows how to deal with)
5327
-}
5428
clone :: Doc ann -> Doc ann
55-
clone = useTraitMethod cloneTrait "clone" . borrow
29+
clone = useTraitMethod RR.cloneTrait "clone" . borrow
5630

5731
borrow :: Doc ann -> Doc ann
5832
borrow doc = "&" <> doc
5933

6034
fromU32 :: Doc ann -> Doc ann
61-
fromU32 = useTraitMethod fromU32Trait "from"
35+
fromU32 = useTraitMethod RR.fromU32Trait "from"
6236

6337
fromStr :: Doc ann -> Doc ann
64-
fromStr = useTraitMethod fromStrTrait "from"
38+
fromStr = useTraitMethod RR.fromStrTrait "from"
6539

6640
useTraitMethod :: R.QTraitName -> Text -> Doc ann -> Doc ann
6741
useTraitMethod trait method d = angles ("_" <+> "as" <+> R.printRsQTraitName trait) <> R.doubleColon <> pretty method <> parens d
@@ -132,7 +106,7 @@ printLamE iTyDefs lamVal = do
132106
bodyDoc <- printValueE iTyDefs body
133107
argDoc <- printValueE iTyDefs arg
134108

135-
return $ R.printRsQValName boxNew <> parens ("move" <+> pipe <> argDoc <> colon <+> "&_" <> pipe <+> braces (space <> group bodyDoc))
109+
return $ R.printRsQValName RR.boxNew <> parens ("move" <+> pipe <> argDoc <> colon <+> "&_" <> pipe <+> braces (space <> group bodyDoc))
136110

137111
printAppE :: MonadPrint m => PC.TyDefs -> LV.ValueE -> LV.ValueE -> m (Doc ann)
138112
printAppE iTyDefs funVal argVal = do
@@ -192,8 +166,8 @@ printOtherCase iTyDefs otherCase = do
192166
--- | `printCaseIntE i [(1, x), (2,y)] (\other -> z)` translates into `LambdaBuffers.Runtime.Plutus.LamValcaseIntE i [(1,x), (2,y)] (\other -> z)`
193167
printCaseIntE :: MonadPrint m => PC.TyDefs -> LV.ValueE -> [(LV.ValueE, LV.ValueE)] -> (LV.ValueE -> LV.ValueE) -> m (Doc ann)
194168
printCaseIntE iTyDefs caseIntVal cases otherCase = do
195-
caseIntERefDoc <- R.printRsQValName <$> LV.importValue caseIntERef
196-
_ <- LV.importValue bigInt
169+
caseIntERefDoc <- R.printRsQValName <$> LV.importValue RR.caseIntERef
170+
_ <- LV.importValue RR.bigInt
197171
caseValDoc <- printValueE iTyDefs caseIntVal
198172
caseDocs <-
199173
for
@@ -204,7 +178,7 @@ printCaseIntE iTyDefs caseIntVal cases otherCase = do
204178
return $ group $ parens (fromU32 conditionDoc <> "," <+> bodyDoc)
205179
)
206180
otherDoc <- printLamE iTyDefs otherCase
207-
return $ group $ caseIntERefDoc <> encloseSep lparen rparen comma [caseValDoc, align (R.printRsQValName vecMacro <> encloseSep lbracket rbracket comma caseDocs), otherDoc]
181+
return $ group $ caseIntERefDoc <> encloseSep lparen rparen comma [caseValDoc, align (R.printRsQValName RR.vecMacro <> encloseSep lbracket rbracket comma caseDocs), otherDoc]
208182

209183
printListE :: MonadPrint m => PC.TyDefs -> [LV.ValueE] -> m (Doc ann)
210184
printListE iTyDefs vals = do
@@ -214,12 +188,12 @@ printListE iTyDefs vals = do
214188
printNewListE :: MonadPrint m => PC.TyDefs -> [LV.ValueE] -> m (Doc ann)
215189
printNewListE iTyDefs vals = do
216190
lst <- printListE iTyDefs vals
217-
return $ R.printRsQValName vecMacro <> lst
191+
return $ R.printRsQValName RR.vecMacro <> lst
218192

219193
printCaseListE :: MonadPrint m => PC.TyDefs -> LV.ValueE -> [(Int, [LV.ValueE] -> LV.ValueE)] -> (LV.ValueE -> LV.ValueE) -> m (Doc ann)
220194
printCaseListE iTyDefs caseListVal cases otherCase = do
221195
caseValDoc <- printValueE iTyDefs caseListVal
222-
vecAsSliceDoc <- R.printRsQValName <$> LV.importValue vecAsSlice
196+
vecAsSliceDoc <- R.printRsQValName <$> LV.importValue RR.vecAsSlice
223197
caseDocs <-
224198
for
225199
cases
@@ -282,7 +256,7 @@ printRecordE iTyDefs (qtyN@(mn', tyN'), _) vals = do
282256

283257
printPhantomDataField :: PC.TyArg -> Doc ann
284258
printPhantomDataField tyArg =
285-
TD.phantomFieldIdent tyArg <> colon <+> R.printRsQTyName phantomData
259+
TD.phantomFieldIdent tyArg <> colon <+> R.printRsQTyName RR.phantomData
286260

287261
printProductE :: MonadPrint m => PC.TyDefs -> LV.QProduct -> [LV.ValueE] -> m (Doc ann)
288262
printProductE iTyDefs (qtyN@(mn', tyN'), _) vals = do
@@ -294,7 +268,7 @@ printProductE iTyDefs (qtyN@(mn', tyN'), _) vals = do
294268
case Map.lookup qtyN iTyDefs of
295269
Just (PC.TyDef _ (PC.TyAbs tyArgs (PC.ProductI (PC.Product fields _)) _) _) -> return (toList tyArgs, fields)
296270
_ -> throwInternalError "Expected a ProductE but got something else (TODO(szg251): Print got)"
297-
let phantomFieldDocs = R.printRsQTyName phantomData <$ TD.collectPhantomTyArgs fieldTys tyArgs
271+
let phantomFieldDocs = R.printRsQTyName RR.phantomData <$ TD.collectPhantomTyArgs fieldTys tyArgs
298272
mayBoxedFields = zip vals $ TD.isRecursive iTyDefs mn tyN <$> fieldTys
299273

300274
fieldDocs <- for mayBoxedFields (printMaybeBoxed iTyDefs)
@@ -305,7 +279,7 @@ printMaybeBoxed :: MonadPrint m => PC.TyDefs -> (LV.ValueE, Bool) -> m (Doc ann)
305279
printMaybeBoxed iTyDefs (val, False) = clone <$> printValueE iTyDefs val
306280
printMaybeBoxed iTyDefs (val, True) = do
307281
valDoc <- clone <$> printValueE iTyDefs val
308-
return $ R.printRsQValName boxNew <> parens valDoc
282+
return $ R.printRsQValName RR.boxNew <> parens valDoc
309283

310284
printTupleE :: MonadPrint m => PC.TyDefs -> LV.ValueE -> LV.ValueE -> m (Doc ann)
311285
printTupleE iTyDefs l r = do
@@ -395,4 +369,4 @@ printInstanceLamE (argTy : argTys) iTyDefs lamVal = do
395369
argDoc <- printValueE iTyDefs arg
396370
let argTy' = "&'a" <+> R.printRsQTyName argTy
397371

398-
return $ R.printRsQValName boxNew <> parens ("move" <+> pipe <> argDoc <> colon <+> argTy' <> pipe <+> braces (space <> group bodyDoc))
372+
return $ R.printRsQValName RR.boxNew <> parens ("move" <+> pipe <> argDoc <> colon <+> argTy' <> pipe <+> braces (space <> group bodyDoc))
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
module LambdaBuffers.Codegen.Rust.Print.Refs where
2+
3+
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
4+
5+
caseIntERef :: R.QValName
6+
caseIntERef = R.qForeignRef R.MkValueName "lbr-prelude" ["lamval"] "case_int"
7+
8+
bigInt :: R.QValName
9+
bigInt = R.qForeignRef R.MkValueName "num-bigint" [] "BigInt"
10+
11+
vecAsSlice :: R.QValName
12+
vecAsSlice = R.qForeignRef R.MkValueName "lbr-prelude" ["lamval"] "case_int"
13+
14+
vecMacro :: R.QValName
15+
vecMacro = R.qForeignRef R.MkValueName "std" [] "vec!"
16+
17+
boxNew :: R.QValName
18+
boxNew = R.qForeignRef R.MkValueName "std" ["boxed", "Box"] "new"
19+
20+
phantomData :: R.QTyName
21+
phantomData = R.qForeignRef R.MkTyName "std" ["marker"] "PhantomData"
22+
23+
debugTrait :: R.QTraitName
24+
debugTrait = R.qForeignRef R.MkTraitName "std" ["fmt"] "Debug"
25+
26+
fromU32Trait :: R.QTraitName
27+
fromU32Trait = R.qForeignRef R.MkTraitName "std" ["convert"] "From<u32>"
28+
29+
fromStrTrait :: R.QTraitName
30+
fromStrTrait = R.qForeignRef R.MkTraitName "std" ["convert"] "From<&str>"
31+
32+
cloneTrait :: R.QTraitName
33+
cloneTrait = R.qForeignRef R.MkTraitName "std" ["clone"] "Clone"
34+
35+
partialEqTrait :: R.QTraitName
36+
partialEqTrait = R.qForeignRef R.MkTraitName "std" ["cmp"] "PartialEq"
37+
38+
eqTrait :: R.QTraitName
39+
eqTrait = R.qForeignRef R.MkTraitName "std" ["cmp"] "Eq"
40+
41+
isPlutusDataTrait :: R.QTraitName
42+
isPlutusDataTrait = R.qForeignRef R.MkTraitName "plutus-ledger-api" ["plutus_data"] "IsPlutusData"
43+
44+
jsonTrait :: R.QTraitName
45+
jsonTrait = R.qForeignRef R.MkTraitName "lbr-prelude" ["json"] "Json"

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Print/TyDef.hs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import LambdaBuffers.Codegen.Config (cfgOpaques)
1414
import LambdaBuffers.Codegen.Print (throwInternalError)
1515
import LambdaBuffers.Codegen.Print qualified as Print
1616
import LambdaBuffers.Codegen.Rust.Print.MonadPrint (MonadPrint)
17+
import LambdaBuffers.Codegen.Rust.Print.Refs qualified as RR
1718
import LambdaBuffers.Codegen.Rust.Print.Syntax (
1819
TyDefKw (EnumTyDef, StructTyDef, SynonymTyDef),
1920
encloseGenerics,
@@ -60,15 +61,6 @@ printTyDefKw StructTyDef = "pub struct"
6061
printTyDefKw EnumTyDef = "pub enum"
6162
printTyDefKw SynonymTyDef = "pub type"
6263

63-
debugMacro :: R.QTraitName
64-
debugMacro = R.qForeignRef R.MkTraitName "std" ["fmt"] "Debug"
65-
66-
cloneMacro :: R.QTraitName
67-
cloneMacro = R.qForeignRef R.MkTraitName "std" ["clone"] "Clone"
68-
69-
phantomData :: R.QTyName
70-
phantomData = R.qForeignRef R.MkTyName "std" ["marker"] "PhantomData"
71-
7264
box :: R.QTyName
7365
box = R.qForeignRef R.MkTyName "std" ["boxed"] "Box"
7466

@@ -77,7 +69,7 @@ boxed doc = R.printRsQTyName box <> angles doc
7769

7870
printDeriveDebug :: Doc ann
7971
printDeriveDebug =
80-
"#" <> brackets ("derive" <> parens (printRsQTraitName debugMacro <> comma <+> printRsQTraitName cloneMacro))
72+
"#" <> brackets ("derive" <> parens (printRsQTraitName RR.debugTrait <> comma <+> printRsQTraitName RR.cloneTrait))
8173

8274
{- | Prints the type abstraction.
8375
@@ -183,7 +175,7 @@ printField parentTyN (PC.Field fn ty) = do
183175

184176
printPhantomData :: PC.TyArg -> Doc ann
185177
printPhantomData tyArg =
186-
R.printRsQTyName phantomData <> angles (R.printTyArg tyArg)
178+
R.printRsQTyName RR.phantomData <> angles (R.printTyArg tyArg)
187179

188180
printPhantomDataField :: PC.TyArg -> Doc ann
189181
printPhantomDataField tyArg =

0 commit comments

Comments
 (0)