Skip to content

Commit ef80479

Browse files
committed
Rust codegen: add CLI argument
1 parent 19e4e9a commit ef80479

File tree

10 files changed

+281
-234
lines changed

10 files changed

+281
-234
lines changed

lambda-buffers-codegen/app/LambdaBuffers/Codegen/Cli/GenRust.hs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@ module LambdaBuffers.Codegen.Cli.GenRust (GenOpts (..), gen) where
33
import Control.Lens (makeLenses, (^.))
44
import Control.Monad (unless)
55
import Data.Aeson (decodeFileStrict')
6+
import Debug.Trace (trace)
67
import LambdaBuffers.Codegen.Cli.Gen (logError)
78
import LambdaBuffers.Codegen.Cli.Gen qualified as Gen
89
import LambdaBuffers.Codegen.Rust (runPrint)
910
import LambdaBuffers.Codegen.Rust.Config qualified as R
11+
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as RS
1012
import Paths_lambda_buffers_codegen qualified as Paths
1113
import System.Directory (doesFileExist)
1214
import System.Directory.Internal.Prelude (exitFailure)
1315

1416
data GenOpts = MkGenOpts
1517
{ _config :: [FilePath]
18+
, _packages :: FilePath
1619
, _common :: Gen.GenOpts
1720
}
1821

@@ -28,9 +31,12 @@ gen opts = do
2831
cfgs <- traverse readRustConfig fps
2932
return (mconcat cfgs)
3033

34+
let pkgsCfg = opts ^. packages
35+
pkgs <- readPackages pkgsCfg
36+
3137
Gen.gen
3238
(opts ^. common)
33-
(\ci -> fmap (\(fp, code, deps) -> Gen.Generated fp code deps) . runPrint cfg ci <$> (ci ^. #modules))
39+
(\ci -> fmap (\(fp, code, deps) -> Gen.Generated fp code deps) . runPrint cfg pkgs ci <$> (ci ^. #modules))
3440

3541
readRustConfig :: FilePath -> IO R.Config
3642
readRustConfig f = do
@@ -47,3 +53,19 @@ readRustConfig f = do
4753
logError "" $ "Invalid Rust configuration file " <> f
4854
exitFailure
4955
Just cfg -> return cfg
56+
57+
readPackages :: FilePath -> IO RS.PkgMap
58+
readPackages f = do
59+
fExists <- doesFileExist f
60+
unless
61+
fExists
62+
( do
63+
logError "" $ "Provided Rust Codegen package manifest file doesn't exists: " <> f
64+
exitFailure
65+
)
66+
mayPkgs <- decodeFileStrict' f
67+
case mayPkgs of
68+
Nothing -> do
69+
logError "" $ "Invalid Rust package manifest file " <> f
70+
exitFailure
71+
Just pkgs -> trace (show pkgs) (R.mkPkgMap pkgs)

lambda-buffers-codegen/app/Main.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ rustGenOptsP =
128128
<> help "Configuration file for the Rust Codegen module (multiple `config`s are merged with left first merge conflict strategy)"
129129
)
130130
)
131+
<*> strOption
132+
( long "packages"
133+
<> short 'g'
134+
<> metavar "FILEPATH"
135+
<> help "JSON file containing the package-set and all of its modules (including current package)"
136+
)
131137
<*> genOptsP
132138

133139
mkProgDesc :: forall {a}. String -> InfoMod a

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import Proto.Codegen qualified as P
2121
{- | `runPrint cfg inp mod` prints a LambdaBuffers checked module `mod`, given its entire compilation closure in `inp` and Rust configuration file in `cfg`.
2222
It either errors with an API error message or succeeds with a module filepath, code and package dependencies.
2323
-}
24-
runPrint :: RsConfig.Config -> PC.CodegenInput -> PC.Module -> Either P.Error (FilePath, Text, Set Text)
25-
runPrint cfg ci m = case runCheck cfg ci m of
24+
runPrint :: RsConfig.Config -> RsSyntax.PkgMap -> PC.CodegenInput -> PC.Module -> Either P.Error (FilePath, Text, Set Text)
25+
runPrint cfg pkgs ci m = case runCheck cfg ci m of
2626
Left err -> Left err
27-
Right ctx -> case Print.runPrint ctx (RsPrint.printModule rsPrintModuleEnv) of
27+
Right ctx -> case Print.runPrint ctx (RsPrint.printModule rsPrintModuleEnv pkgs) of
2828
Left err -> Left err
2929
Right (modDoc, deps) ->
3030
Right

lambda-buffers-codegen/src/LambdaBuffers/Codegen/Rust/Config.hs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
{-# OPTIONS_GHC -Wno-orphans #-}
22

3-
module LambdaBuffers.Codegen.Rust.Config (Config) where
3+
module LambdaBuffers.Codegen.Rust.Config (Config, mkPkgMap) where
44

5-
import Data.Aeson (FromJSON (parseJSON), ToJSON (toJSON))
5+
import Data.Aeson (FromJSON (parseJSON), FromJSONKey, ToJSON (toJSON))
66
import Data.Aeson qualified as A
7+
import Data.Map (Map)
8+
import Data.Map qualified as Map
9+
import Data.Text (Text)
710
import Data.Vector qualified as Vector
811
import LambdaBuffers.Codegen.Config qualified as Config
912
import LambdaBuffers.Codegen.Rust.Print.Syntax qualified as R
@@ -22,6 +25,8 @@ instance FromJSON R.ModuleName
2225
instance ToJSON R.CrateName
2326
instance FromJSON R.CrateName
2427

28+
instance FromJSONKey R.CrateName
29+
2530
instance (FromJSON a) => FromJSON (R.Qualified a) where
2631
parseJSON v = do
2732
A.withArray
@@ -37,3 +42,12 @@ instance (FromJSON a) => FromJSON (R.Qualified a) where
3742
instance (ToJSON a) => ToJSON (R.Qualified a) where
3843
toJSON (R.Qualified'LibRef cn mn a) = A.Array $ Vector.fromList [toJSON cn, toJSON mn, toJSON a]
3944
toJSON (R.Qualified'Builtin a) = A.Array $ Vector.fromList [toJSON a]
45+
46+
mkPkgMap :: MonadFail m => Map Text [Text] -> m R.PkgMap
47+
mkPkgMap = go . Map.toList
48+
where
49+
go :: MonadFail m => [(Text, [Text])] -> m R.PkgMap
50+
go [] = return mempty
51+
go ((crateName, modules) : xs) = do
52+
pcModules <- traverse Config.moduleNameFromText modules
53+
(Map.fromList ((,R.MkCrateName crateName) <$> pcModules) `Map.union`) <$> go xs

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

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,21 @@ data PrintModuleEnv m ann = PrintModuleEnv
3535
Map
3636
R.QTraitName
3737
( PC.ModuleName ->
38+
R.PkgMap ->
3839
PC.TyDefs ->
3940
(Doc ann -> Doc ann) ->
4041
PC.Ty ->
4142
m (Doc ann)
4243
)
43-
, env'printTyDef :: MonadPrint m => PC.TyDef -> m (Doc ann)
44+
, env'printTyDef :: MonadPrint m => R.PkgMap -> PC.TyDef -> m (Doc ann)
4445
, env'compilationCfgs :: [Text]
4546
}
4647

47-
printModule :: MonadPrint m => PrintModuleEnv m ann -> m (Doc ann, Set Text)
48-
printModule env = do
48+
printModule :: MonadPrint m => PrintModuleEnv m ann -> R.PkgMap -> m (Doc ann, Set Text)
49+
printModule env pkgs = do
4950
ctx <- ask
50-
tyDefDocs <- for (toList $ ctx ^. Print.ctxModule . #typeDefs) (env'printTyDef env)
51-
instDocs <- printInstances env
51+
tyDefDocs <- for (toList $ ctx ^. Print.ctxModule . #typeDefs) (env'printTyDef env pkgs)
52+
instDocs <- printInstances env pkgs
5253
st <- get
5354
let modDoc =
5455
align . vsep $
@@ -59,31 +60,32 @@ printModule env = do
5960
, mempty
6061
, vsep ((line <>) <$> instDocs)
6162
]
62-
(imports, crateDeps) =
63+
imports =
6364
collectPackageDeps
65+
pkgs
6466
(ctx ^. Print.ctxTyImports)
6567
(ctx ^. Print.ctxOpaqueTyImports <> st ^. Print.stTypeImports)
6668
(ctx ^. Print.ctxClassImports <> st ^. Print.stClassImports)
6769
(ctx ^. Print.ctxRuleImports)
6870
(st ^. Print.stValueImports)
6971

70-
return (modDoc, Set.map crateNameToCargoText crateDeps)
72+
return (modDoc, Set.map crateNameToCargoText imports)
7173

72-
printInstances :: MonadPrint m => PrintModuleEnv m ann -> m [Doc ann]
73-
printInstances env = do
74+
printInstances :: MonadPrint m => PrintModuleEnv m ann -> R.PkgMap -> m [Doc ann]
75+
printInstances env pkgs = do
7476
ci <- asks (view Print.ctxCompilerInput)
7577
m <- asks (view Print.ctxModule)
7678
let iTyDefs = PC.indexTyDefs ci
7779
foldrM
7880
( \d instDocs -> do
79-
instDocs' <- printDerive env iTyDefs d
81+
instDocs' <- printDerive env pkgs iTyDefs d
8082
return $ instDocs' <> instDocs
8183
)
8284
mempty
8385
(toList $ m ^. #derives)
8486

85-
printDerive :: MonadPrint m => PrintModuleEnv m ann -> PC.TyDefs -> PC.Derive -> m [Doc ann]
86-
printDerive env iTyDefs d = do
87+
printDerive :: MonadPrint m => PrintModuleEnv m ann -> R.PkgMap -> PC.TyDefs -> PC.Derive -> m [Doc ann]
88+
printDerive env pkgs iTyDefs d = do
8789
mn <- asks (view $ Print.ctxModule . #moduleName)
8890
let qcn = PC.qualifyClassRef mn (d ^. #constraint . #classRef)
8991
classes <- asks (view $ Print.ctxConfig . C.cfgClasses)
@@ -94,17 +96,17 @@ printDerive env iTyDefs d = do
9496
hsqcns
9597
( \hsqcn -> do
9698
Print.importClass hsqcn
97-
printRsQTraitImpl env mn iTyDefs hsqcn d
99+
printRsQTraitImpl env mn pkgs iTyDefs hsqcn d
98100
)
99101

100-
printRsQTraitImpl :: MonadPrint m => PrintModuleEnv m ann -> PC.ModuleName -> PC.TyDefs -> R.QTraitName -> PC.Derive -> m (Doc ann)
101-
printRsQTraitImpl env mn iTyDefs hqcn d =
102+
printRsQTraitImpl :: MonadPrint m => PrintModuleEnv m ann -> PC.ModuleName -> R.PkgMap -> PC.TyDefs -> R.QTraitName -> PC.Derive -> m (Doc ann)
103+
printRsQTraitImpl env mn pkgs iTyDefs hqcn d =
102104
case Map.lookup hqcn (env'implementationPrinter env) of
103105
Nothing -> throwInternalError (d ^. #constraint . #sourceInfo) ("Missing capability to print the Rust trait " <> show hqcn) -- TODO(bladyjoker): Fix hqcn printing
104106
Just implPrinter -> do
105107
let ty = d ^. #constraint . #argument
106-
mkInstanceDoc = printInstanceDef hqcn ty
107-
implPrinter mn iTyDefs mkInstanceDoc ty
108+
mkInstanceDoc = printInstanceDef pkgs hqcn ty
109+
implPrinter mn pkgs iTyDefs mkInstanceDoc ty
108110

109111
printCompilationCfgs :: Pretty a => [a] -> Doc ann
110112
printCompilationCfgs [] = mempty
@@ -120,24 +122,18 @@ printImports crates =
120122
externCrate :: R.CrateName -> Doc ann
121123
externCrate crateName = "extern crate" <+> pretty (crateNameToText crateName) <> semi
122124

123-
{- | `collectPackageDeps lbTyImports rsTyImports traitImps ruleImps valImps` collects all the package dependencies.
124-
125-
Note that LB `lbTyImports` and `ruleImps` are wired by the user (as the user decides on the package name for their schemass), so the imports inside the modules
126-
is different from the crate list in `build.js`. These are returned as a tuple as `(imports, buildDeps)`
127-
-}
128-
collectPackageDeps :: Set PC.QTyName -> Set R.QTyName -> Set R.QTraitName -> Set (PC.InfoLess PC.ModuleName) -> Set R.QValName -> (Set R.CrateName, Set R.CrateName)
129-
collectPackageDeps lbTyImports rsTyImports traitImps ruleImps valImps =
130-
let buildDeps =
131-
Set.singleton (R.MkCrateName "std")
132-
`Set.union` Set.fromList (mapMaybe R.qualifiedToCrate $ toList rsTyImports)
133-
`Set.union` Set.fromList (mapMaybe R.qualifiedToCrate $ toList traitImps)
134-
`Set.union` Set.fromList (mapMaybe R.qualifiedToCrate $ toList valImps)
135-
136-
imports =
137-
Set.fromList [R.crateFromLbModuleName $ withInfo mn | (mn, _tn) <- toList lbTyImports]
138-
`Set.union` Set.fromList [R.crateFromLbModuleName $ withInfo mn | mn <- toList ruleImps]
139-
`Set.union` buildDeps
140-
in (imports, buildDeps)
125+
-- | `collectPackageDeps lbTyImports rsTyImports traitImps ruleImps valImps` collects all the package dependencies.
126+
collectPackageDeps :: R.PkgMap -> Set PC.QTyName -> Set R.QTyName -> Set R.QTraitName -> Set (PC.InfoLess PC.ModuleName) -> Set R.QValName -> Set R.CrateName
127+
collectPackageDeps packages lbTyImports rsTyImports traitImps ruleImps valImps =
128+
Set.filter
129+
(/= R.MkCrateName "crate")
130+
( Set.singleton (R.MkCrateName "std")
131+
`Set.union` Set.fromList [R.crateFromLbModuleName packages $ withInfo mn | (mn, _tn) <- toList lbTyImports]
132+
`Set.union` Set.fromList (mapMaybe R.qualifiedToCrate $ toList rsTyImports)
133+
`Set.union` Set.fromList (mapMaybe R.qualifiedToCrate $ toList traitImps)
134+
`Set.union` Set.fromList [R.crateFromLbModuleName packages $ withInfo mn | mn <- toList ruleImps]
135+
`Set.union` Set.fromList (mapMaybe R.qualifiedToCrate $ toList valImps)
136+
)
141137

142138
withInfo :: PC.InfoLessC b => PC.InfoLess b -> b
143139
withInfo x = PC.withInfoLess x id

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

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ rsTraitImplPrinters ::
2424
Map
2525
R.QTraitName
2626
( PC.ModuleName ->
27+
R.PkgMap ->
2728
PC.TyDefs ->
2829
(Doc ann -> Doc ann) ->
2930
PC.Ty ->
@@ -68,21 +69,21 @@ lvEqBuiltinsBase = LV.MkPrintRead $ \(_ty, refName) ->
6869
, ("PhantomData", R.qLibRef R.MkValueName "std" "marker" "PhantomData")
6970
]
7071

71-
printDerivePartialEqBase :: MonadPrint m => PC.ModuleName -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
72-
printDerivePartialEqBase mn iTyDefs mkInstance ty = do
72+
printDerivePartialEqBase :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
73+
printDerivePartialEqBase mn pkgs iTyDefs mkInstance ty = do
7374
case deriveEqImpl mn iTyDefs ty of
7475
Left err -> Print.throwInternalError' (mn ^. #sourceInfo) ("Deriving Prelude.Eq LamVal implementation from a type failed with: " <> err ^. P.msg)
7576
Right valE -> do
76-
case LV.runPrint lvEqBuiltinsBase (printInstance [R.qBuiltin R.MkTyName "Self", R.qBuiltin R.MkTyName "Self"] iTyDefs valE) of
77+
case LV.runPrint lvEqBuiltinsBase (printInstance pkgs [R.qBuiltin R.MkTyName "Self", R.qBuiltin R.MkTyName "Self"] iTyDefs valE) of
7778
Left err -> Print.throwInternalError' (mn ^. #sourceInfo) ("Interpreting LamVal into Rust failed with: " <> err ^. P.msg)
7879
Right (implDoc, imps) -> do
7980
for_ imps Print.importValue
8081
return $
8182
mkInstance $
8283
printTraitMethod eqTraitMethodName eqTraitMethodArgs eqTraitMethodReturns implDoc
8384

84-
printDeriveEqBase :: MonadPrint m => PC.ModuleName -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
85-
printDeriveEqBase _ _ mkInstance _ = return $ mkInstance mempty
85+
printDeriveEqBase :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
86+
printDeriveEqBase _ _ _ mkInstance _ = return $ mkInstance mempty
8687

8788
lvPlutusDataBuiltins :: LV.PrintRead R.QValName
8889
lvPlutusDataBuiltins = LV.MkPrintRead $ \(_ty, refName) ->
@@ -132,21 +133,21 @@ fromPlutusDataTraitMethodReturns =
132133
"result"
133134
"Result<Self, plutus_ledger_api::plutus_data::PlutusDataError>"
134135

135-
printDeriveIsPlutusData :: MonadPrint m => PC.ModuleName -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
136-
printDeriveIsPlutusData mn iTyDefs mkInstanceDoc ty = do
137-
case printDeriveIsPlutusData' mn iTyDefs mkInstanceDoc ty of
136+
printDeriveIsPlutusData :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
137+
printDeriveIsPlutusData mn pkgs iTyDefs mkInstanceDoc ty = do
138+
case printDeriveIsPlutusData' mn pkgs iTyDefs mkInstanceDoc ty of
138139
Left err -> Print.throwInternalError' (mn ^. #sourceInfo) ("Deriving Prelude.IsPlutusData LamVal implementation from a type failed with: " <> err ^. P.msg)
139140
Right (plutusDataInstDefDoc, imps) -> do
140141
for_ imps Print.importValue
141142
return plutusDataInstDefDoc
142143

143-
printDeriveIsPlutusData' :: PC.ModuleName -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> Either P.InternalError (Doc ann, Set R.QValName)
144-
printDeriveIsPlutusData' mn iTyDefs mkInstanceDoc ty = do
144+
printDeriveIsPlutusData' :: PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> Either P.InternalError (Doc ann, Set R.QValName)
145+
printDeriveIsPlutusData' mn pkgs iTyDefs mkInstanceDoc ty = do
145146
let extraDeps = Set.singleton (R.qLibRef R.MkValueName "serde_json" "" "Value")
146147
toPlutusDataValE <- deriveToPlutusDataImpl mn iTyDefs ty
147-
(toPlutusDataImplDoc, impsA) <- LV.runPrint lvPlutusDataBuiltins (printInstance [R.qBuiltin R.MkTyName "Self"] iTyDefs toPlutusDataValE)
148+
(toPlutusDataImplDoc, impsA) <- LV.runPrint lvPlutusDataBuiltins (printInstance pkgs [R.qBuiltin R.MkTyName "Self"] iTyDefs toPlutusDataValE)
148149
fromPlutusDataValE <- deriveFromPlutusDataImpl mn iTyDefs ty
149-
(fromPlutusDataImplDoc, impsB) <- LV.runPrint lvPlutusDataBuiltins (printInstance [R.qLibRef R.MkTyName "plutus-ledger-api" "plutus_data" "PlutusData"] iTyDefs fromPlutusDataValE)
150+
(fromPlutusDataImplDoc, impsB) <- LV.runPrint lvPlutusDataBuiltins (printInstance pkgs [R.qLibRef R.MkTyName "plutus-ledger-api" "plutus_data" "PlutusData"] iTyDefs fromPlutusDataValE)
150151

151152
let instanceDoc =
152153
mkInstanceDoc
@@ -208,20 +209,20 @@ fromJsonTraitMethodReturns :: R.QTyName
208209
fromJsonTraitMethodReturns =
209210
R.qLibRef R.MkTyName "std" "result" "Result<Self, lbr_prelude::error::Error>" -- TODO(szg251): This is a hack
210211

211-
printDeriveJson :: MonadPrint m => PC.ModuleName -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
212-
printDeriveJson mn iTyDefs mkInstanceDoc ty = do
213-
case printDeriveJson' mn iTyDefs mkInstanceDoc ty of
212+
printDeriveJson :: MonadPrint m => PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> m (Doc ann)
213+
printDeriveJson mn pkgs iTyDefs mkInstanceDoc ty = do
214+
case printDeriveJson' mn pkgs iTyDefs mkInstanceDoc ty of
214215
Left err -> Print.throwInternalError' (mn ^. #sourceInfo) ("Deriving Prelude.Json LamVal implementation from a type failed with: " <> err ^. P.msg)
215216
Right (jsonInstDefDoc, imps) -> do
216217
for_ imps Print.importValue
217218
return jsonInstDefDoc
218219

219-
printDeriveJson' :: PC.ModuleName -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> Either P.InternalError (Doc ann, Set R.QValName)
220-
printDeriveJson' mn iTyDefs mkInstanceDoc ty = do
220+
printDeriveJson' :: PC.ModuleName -> R.PkgMap -> PC.TyDefs -> (Doc ann -> Doc ann) -> PC.Ty -> Either P.InternalError (Doc ann, Set R.QValName)
221+
printDeriveJson' mn pkgs iTyDefs mkInstanceDoc ty = do
221222
toJsonValE <- deriveToJsonImpl mn iTyDefs ty
222-
(toJsonImplDoc, impsA) <- LV.runPrint lvJsonBuiltins (printInstance [R.qBuiltin R.MkTyName "Self"] iTyDefs toJsonValE)
223+
(toJsonImplDoc, impsA) <- LV.runPrint lvJsonBuiltins (printInstance pkgs [R.qBuiltin R.MkTyName "Self"] iTyDefs toJsonValE)
223224
fromJsonValE <- deriveFromJsonImpl mn iTyDefs ty
224-
(fromJsonImplDoc, impsB) <- LV.runPrint lvJsonBuiltins (printInstance [] iTyDefs fromJsonValE)
225+
(fromJsonImplDoc, impsB) <- LV.runPrint lvJsonBuiltins (printInstance pkgs [] iTyDefs fromJsonValE)
225226

226227
let instanceDoc =
227228
mkInstanceDoc

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,31 @@ impl<A: SomeClass, B: SomeClass, C: SomeClass> SomeClass for SomeTy<A, B, C> {
2121
}
2222
```
2323
-}
24-
printInstanceDef :: R.QTraitName -> PC.Ty -> (Doc ann -> Doc ann)
25-
printInstanceDef rsQTraitName ty =
26-
let headDoc = R.printRsQTraitName rsQTraitName <+> "for" <+> printTyInner ty
24+
printInstanceDef :: R.PkgMap -> R.QTraitName -> PC.Ty -> (Doc ann -> Doc ann)
25+
printInstanceDef pkgs rsQTraitName ty =
26+
let headDoc = R.printRsQTraitName rsQTraitName <+> "for" <+> printTyInner pkgs ty
2727
freeVars = collectTyVars ty
2828
in case freeVars of
2929
[] -> \implDoc -> "impl" <+> headDoc <+> braces (line <> implDoc)
3030
_ -> \implDoc ->
31-
"impl" <> printInstanceContext rsQTraitName freeVars
31+
"impl" <> printInstanceContext pkgs rsQTraitName freeVars
3232
<+> headDoc
3333
<+> braces (hardline <> space <> space <> implDoc)
3434

35-
printInstanceContext :: R.QTraitName -> [PC.Ty] -> Doc ann
36-
printInstanceContext rsQTraitName = printInstanceContext' [rsQTraitName]
35+
printInstanceContext :: R.PkgMap -> R.QTraitName -> [PC.Ty] -> Doc ann
36+
printInstanceContext pkgs rsQTraitName = printInstanceContext' pkgs [rsQTraitName]
3737

3838
defaultTraitBounds :: [R.QTraitName]
3939
defaultTraitBounds = [R.qLibRef R.MkTraitName "std" "clone" "Clone"]
4040

41-
printInstanceContext' :: [R.QTraitName] -> [PC.Ty] -> Doc ann
42-
printInstanceContext' rsQTraitNames tys =
43-
align . group $ encloseSep langle rangle comma [printTraitBound (rsQTraitNames <> defaultTraitBounds) ty | ty <- tys]
41+
printInstanceContext' :: R.PkgMap -> [R.QTraitName] -> [PC.Ty] -> Doc ann
42+
printInstanceContext' pkgs rsQTraitNames tys =
43+
align . group $ encloseSep langle rangle comma [printTraitBound pkgs (rsQTraitNames <> defaultTraitBounds) ty | ty <- tys]
4444

45-
printTraitBound :: [R.QTraitName] -> PC.Ty -> Doc ann
46-
printTraitBound qcns ty =
45+
printTraitBound :: R.PkgMap -> [R.QTraitName] -> PC.Ty -> Doc ann
46+
printTraitBound pkgs qcns ty =
4747
let crefDocs = R.printRsQTraitName <$> qcns
48-
tyDoc = printTyInner ty
48+
tyDoc = printTyInner pkgs ty
4949
in tyDoc <> colon <+> encloseSep mempty mempty "+" crefDocs
5050

5151
collectTyVars :: PC.Ty -> [PC.Ty]

0 commit comments

Comments
 (0)