{-# LANGUAGE RecordWildCards #-}

module HIndent.Ast.Declaration.Rule.Binder
  ( RuleBinder
  , mkRuleBinder
  ) where

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

data RuleBinder = RuleBinder
  { RuleBinder -> WithComments PrefixName
name :: WithComments PrefixName
  , RuleBinder -> Maybe (WithComments (HsType GhcPs))
signature :: Maybe (WithComments (GHC.HsType GHC.GhcPs))
  }

instance CommentExtraction RuleBinder where
  nodeComments :: RuleBinder -> NodeComments
nodeComments RuleBinder {} = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty RuleBinder where
  pretty' :: RuleBinder -> Printer ()
pretty' RuleBinder {signature :: RuleBinder -> Maybe (WithComments (HsType GhcPs))
signature = Maybe (WithComments (HsType GhcPs))
Nothing, WithComments PrefixName
name :: RuleBinder -> WithComments PrefixName
name :: WithComments PrefixName
..} = WithComments PrefixName -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty WithComments PrefixName
name
  pretty' RuleBinder {signature :: RuleBinder -> Maybe (WithComments (HsType GhcPs))
signature = Just WithComments (HsType GhcPs)
sig, WithComments PrefixName
name :: RuleBinder -> WithComments PrefixName
name :: WithComments PrefixName
..} =
    Printer () -> Printer ()
forall a. Printer a -> Printer a
parens (Printer () -> Printer ()) -> Printer () -> Printer ()
forall a b. (a -> b) -> a -> b
$ [Printer ()] -> Printer ()
spaced [WithComments PrefixName -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty WithComments PrefixName
name, HasCallStack => String -> Printer ()
String -> Printer ()
string String
"::", WithComments (HsType GhcPs) -> Printer ()
forall a. Pretty a => a -> Printer ()
pretty WithComments (HsType GhcPs)
sig]

mkRuleBinder :: GHC.RuleBndr GHC.GhcPs -> RuleBinder
mkRuleBinder :: RuleBndr GhcPs -> RuleBinder
mkRuleBinder (GHC.RuleBndr XCRuleBndr GhcPs
_ LIdP GhcPs
n) = RuleBinder {Maybe (WithComments (HsType GhcPs))
WithComments PrefixName
forall {a}. Maybe a
name :: WithComments PrefixName
signature :: Maybe (WithComments (HsType GhcPs))
signature :: forall {a}. Maybe a
name :: WithComments PrefixName
..}
  where
    signature :: Maybe a
signature = Maybe a
forall {a}. Maybe a
Nothing
    name :: WithComments PrefixName
name = GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated (GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName)
-> GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall a b. (a -> b) -> a -> b
$ (RdrName -> PrefixName)
-> GenLocated SrcSpanAnnN RdrName
-> GenLocated SrcSpanAnnN PrefixName
forall a b.
(a -> b) -> GenLocated SrcSpanAnnN a -> GenLocated SrcSpanAnnN b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RdrName -> PrefixName
mkPrefixName LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
n
mkRuleBinder (GHC.RuleBndrSig XRuleBndrSig GhcPs
_ LIdP GhcPs
n GHC.HsPS {XHsPS GhcPs
LHsType GhcPs
hsps_ext :: XHsPS GhcPs
hsps_body :: LHsType GhcPs
hsps_body :: forall pass. HsPatSigType pass -> LHsType pass
hsps_ext :: forall pass. HsPatSigType pass -> XHsPS pass
..}) = RuleBinder {Maybe (WithComments (HsType GhcPs))
WithComments PrefixName
name :: WithComments PrefixName
signature :: Maybe (WithComments (HsType GhcPs))
signature :: Maybe (WithComments (HsType GhcPs))
name :: WithComments PrefixName
..}
  where
    signature :: Maybe (WithComments (HsType GhcPs))
signature = WithComments (HsType GhcPs) -> Maybe (WithComments (HsType GhcPs))
forall a. a -> Maybe a
Just (WithComments (HsType GhcPs)
 -> Maybe (WithComments (HsType GhcPs)))
-> WithComments (HsType GhcPs)
-> Maybe (WithComments (HsType GhcPs))
forall a b. (a -> b) -> a -> b
$ GenLocated SrcSpanAnnA (HsType GhcPs)
-> WithComments (HsType GhcPs)
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
hsps_body
    name :: WithComments PrefixName
name = GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall l a. CommentExtraction l => GenLocated l a -> WithComments a
fromGenLocated (GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName)
-> GenLocated SrcSpanAnnN PrefixName -> WithComments PrefixName
forall a b. (a -> b) -> a -> b
$ (RdrName -> PrefixName)
-> GenLocated SrcSpanAnnN RdrName
-> GenLocated SrcSpanAnnN PrefixName
forall a b.
(a -> b) -> GenLocated SrcSpanAnnN a -> GenLocated SrcSpanAnnN b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RdrName -> PrefixName
mkPrefixName LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
n