{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Ormolu.Printer.Meat.Declaration.Foreign
( p_foreignDecl,
)
where
import Control.Monad
import GHC.Hs
import GHC.Types.ForeignCall
import GHC.Types.SrcLoc
import Ormolu.Printer.Combinators
import Ormolu.Printer.Meat.Common
import Ormolu.Printer.Meat.Declaration.Signature
p_foreignDecl :: ForeignDecl GhcPs -> R ()
p_foreignDecl :: ForeignDecl GhcPs -> R ()
p_foreignDecl = \case
fd :: ForeignDecl GhcPs
fd@ForeignImport {ForeignImport GhcPs
fd_fi :: forall pass. ForeignDecl pass -> ForeignImport pass
fd_fi :: ForeignImport GhcPs
fd_fi} -> do
ForeignImport GhcPs -> R ()
p_foreignImport ForeignImport GhcPs
fd_fi
ForeignDecl GhcPs -> R ()
p_foreignTypeSig ForeignDecl GhcPs
fd
fd :: ForeignDecl GhcPs
fd@ForeignExport {ForeignExport GhcPs
fd_fe :: forall pass. ForeignDecl pass -> ForeignExport pass
fd_fe :: ForeignExport GhcPs
fd_fe} -> do
ForeignExport GhcPs -> R ()
p_foreignExport ForeignExport GhcPs
fd_fe
ForeignDecl GhcPs -> R ()
p_foreignTypeSig ForeignDecl GhcPs
fd
p_foreignTypeSig :: ForeignDecl GhcPs -> R ()
p_foreignTypeSig :: ForeignDecl GhcPs -> R ()
p_foreignTypeSig ForeignDecl GhcPs
fd = do
R ()
breakpoint
R () -> R ()
inci
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SrcSpan] -> R () -> R ()
switchLayout
[ forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
getLocA (forall pass. ForeignDecl pass -> LIdP pass
fd_name ForeignDecl GhcPs
fd),
(forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
getLocA forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall pass. ForeignDecl pass -> LHsSigType pass
fd_sig_ty) ForeignDecl GhcPs
fd
]
forall a b. (a -> b) -> a -> b
$ do
LocatedN RdrName -> R ()
p_rdrName (forall pass. ForeignDecl pass -> LIdP pass
fd_name ForeignDecl GhcPs
fd)
LHsSigType GhcPs -> R ()
p_typeAscription (forall pass. ForeignDecl pass -> LHsSigType pass
fd_sig_ty ForeignDecl GhcPs
fd)
p_foreignImport :: ForeignImport GhcPs -> R ()
p_foreignImport :: ForeignImport GhcPs -> R ()
p_foreignImport (CImport XCImport GhcPs
sourceText XRec GhcPs CCallConv
cCallConv XRec GhcPs Safety
safety Maybe Header
_ CImportSpec
_) = do
Text -> R ()
txt Text
"foreign import"
R ()
space
forall l a. HasSrcSpan l => GenLocated l a -> (a -> R ()) -> R ()
located XRec GhcPs CCallConv
cCallConv forall a. Outputable a => a -> R ()
atom
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (SrcSpan -> Bool
isGoodSrcSpan forall a b. (a -> b) -> a -> b
$ forall l e. GenLocated l e -> l
getLoc XRec GhcPs Safety
safety) (R ()
space forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. Outputable a => a -> R ()
atom XRec GhcPs Safety
safety)
R ()
space
forall l a. HasSrcSpan l => GenLocated l a -> (a -> R ()) -> R ()
located XCImport GhcPs
sourceText SourceText -> R ()
p_sourceText
p_foreignExport :: ForeignExport GhcPs -> R ()
p_foreignExport :: ForeignExport GhcPs -> R ()
p_foreignExport (CExport XCExport GhcPs
sourceText (L SrcSpan
loc (CExportStatic SourceText
_ CLabelString
_ CCallConv
cCallConv))) = do
Text -> R ()
txt Text
"foreign export"
R ()
space
forall l a. HasSrcSpan l => GenLocated l a -> (a -> R ()) -> R ()
located (forall l e. l -> e -> GenLocated l e
L SrcSpan
loc CCallConv
cCallConv) forall a. Outputable a => a -> R ()
atom
R ()
space
forall l a. HasSrcSpan l => GenLocated l a -> (a -> R ()) -> R ()
located XCExport GhcPs
sourceText SourceText -> R ()
p_sourceText