packages feed

hs-bindgen-1.0.0.0: src-internal/HsBindgen/Backend/HsModule/Pretty/CAPI.hs

-- We capitalize module names, but use camelCase/PascalCase in code:
--
-- - in types names:    CapiFoo, FooCapiBar
-- - in variable names: capiFoo, fooCapiBar
module HsBindgen.Backend.HsModule.Pretty.CAPI (
    prettyCapiWrappers
  )
where

import Text.SimplePrettyPrint (CtxDoc)
import Text.SimplePrettyPrint qualified as PP

import HsBindgen.Backend.Hs.CallConv
import HsBindgen.Imports
import HsBindgen.IR.C qualified as C
import HsBindgen.Language.Haskell qualified as Hs

-- | Pretty print the CAPI 'HsBindgen.Config.Internal.addCSource' code fragment.
prettyCapiWrappers ::
     [C.RootDirective C.HashIncludeArg]
  -> [CWrapper]
  -> CtxDoc
prettyCapiWrappers directives wrappers
    | null src  = PP.empty
    | otherwise = prettyCapiWrappers' src
  where
    src = getCWrappersSource directives wrappers

prettyCapiWrappers' :: String -> CtxDoc
prettyCapiWrappers' src = PP.vcat [
     PP.hcat [
         "$("
       , withCapiModule "addCSource"
       , " ("
       , withCapiModule "unlines"
       ]
  , PP.hcat [
        PP.nest 2 (PP.vlist "[" "]" linesDocs)
      , "))"
      ]
  ]
  where
    linesDocs :: [CtxDoc]
    linesDocs = map (fromString . show) (lines src)

    withCapiModule :: String -> CtxDoc
    withCapiModule x = PP.hcat [
        PP.string (Hs.moduleNameToString capiModule)
      , "."
      , PP.string x
      ]