module HIndent.Ast.Declaration.Foreign.CallingConvention
  ( CallingConvention
  , mkCallingConvention
  ) where

import qualified GHC.Types.ForeignCall as GHC
import HIndent.Ast.NodeComments
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators
import HIndent.Pretty.NodeComments

data CallingConvention
  = CCall
  | CApi
  | StdCall
  | Prim
  | JavaScript

instance CommentExtraction CallingConvention where
  nodeComments :: CallingConvention -> NodeComments
nodeComments CallingConvention
_ = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty CallingConvention where
  pretty' :: CallingConvention -> Printer ()
pretty' CallingConvention
CCall = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"ccall"
  pretty' CallingConvention
CApi = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"capi"
  pretty' CallingConvention
StdCall = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"stdcall"
  pretty' CallingConvention
Prim = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"prim"
  pretty' CallingConvention
JavaScript = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"javascript"

mkCallingConvention :: GHC.CCallConv -> CallingConvention
mkCallingConvention :: CCallConv -> CallingConvention
mkCallingConvention CCallConv
GHC.CCallConv = CallingConvention
CCall
mkCallingConvention CCallConv
GHC.StdCallConv = CallingConvention
StdCall
mkCallingConvention CCallConv
GHC.CApiConv = CallingConvention
CApi
mkCallingConvention CCallConv
GHC.PrimCallConv = CallingConvention
Prim
mkCallingConvention CCallConv
GHC.JavaScriptCallConv = CallingConvention
JavaScript