module HIndent.Ast.Declaration.Data.Deriving.Strategy
  ( DerivingStrategy
  , mkDerivingStrategy
  , isViaStrategy
  ) where

import HIndent.Ast.NodeComments
import qualified HIndent.GhcLibParserWrapper.GHC.Hs as GHC
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators
import HIndent.Pretty.NodeComments

data DerivingStrategy
  = Stock
  | Anyclass
  | Newtype
  | Via (GHC.LHsSigType GHC.GhcPs)

instance CommentExtraction DerivingStrategy where
  nodeComments :: DerivingStrategy -> NodeComments
nodeComments Stock {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments Anyclass {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments Newtype {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments Via {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty DerivingStrategy where
  pretty' :: DerivingStrategy -> Printer ()
pretty' DerivingStrategy
Stock = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"stock"
  pretty' DerivingStrategy
Anyclass = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"anyclass"
  pretty' DerivingStrategy
Newtype = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"newtype"
  pretty' (Via LHsSigType GhcPs
x) = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"via " Printer () -> Printer () -> Printer ()
forall a b. Printer a -> Printer b -> Printer b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> GenLocated SrcSpanAnnA (HsSigType GhcPs) -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty LHsSigType GhcPs
GenLocated SrcSpanAnnA (HsSigType GhcPs)
x

mkDerivingStrategy :: GHC.DerivStrategy GHC.GhcPs -> DerivingStrategy
mkDerivingStrategy :: DerivStrategy GhcPs -> DerivingStrategy
mkDerivingStrategy GHC.StockStrategy {} = DerivingStrategy
Stock
mkDerivingStrategy GHC.AnyclassStrategy {} = DerivingStrategy
Anyclass
mkDerivingStrategy GHC.NewtypeStrategy {} = DerivingStrategy
Newtype
mkDerivingStrategy (GHC.ViaStrategy (GHC.XViaStrategyPs [AddEpAnn]
_ LHsSigType GhcPs
x)) = LHsSigType GhcPs -> DerivingStrategy
Via LHsSigType GhcPs
x

isViaStrategy :: DerivingStrategy -> Bool
isViaStrategy :: DerivingStrategy -> Bool
isViaStrategy Via {} = Bool
True
isViaStrategy DerivingStrategy
_ = Bool
False