{-# LANGUAGE NamedFieldPuns #-}

module GHC.Util.HsDecl (declName,bindName,isForD',isNewType',isDerivD',isClsDefSig')
where

import HsSyn
import OccName
import SrcLoc

isNewType' :: NewOrData -> Bool
isNewType' :: NewOrData -> Bool
isNewType' NewType = Bool
True
isNewType' DataType = Bool
False

isForD', isDerivD' :: LHsDecl GhcPs -> Bool
isForD' :: LHsDecl GhcPs -> Bool
isForD' (LL _ ForD{}) = Bool
True; isForD' _ = Bool
False
isDerivD' :: LHsDecl GhcPs -> Bool
isDerivD' (LL _ DerivD{}) = Bool
True; isDerivD' _ = Bool
False

-- | @declName x@ returns the \"new name\" that is created (for
-- example a function declaration) by @x@.  If @x@ isn't a declaration
-- that creates a new name (for example an instance declaration),
-- 'Nothing' is returned instead.  This is useful because we don't
-- want to tell users to rename binders that they aren't creating
-- right now and therefore usually cannot change.
declName :: LHsDecl GhcPs -> Maybe String
declName :: LHsDecl GhcPs -> Maybe String
declName (LL _ x :: SrcSpanLess (LHsDecl GhcPs)
x) = OccName -> String
occNameString (OccName -> String) -> (RdrName -> OccName) -> RdrName -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RdrName -> OccName
forall name. HasOccName name => name -> OccName
occName (RdrName -> String) -> Maybe RdrName -> Maybe String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> case SrcSpanLess (LHsDecl GhcPs)
x of
    TyClD _ FamDecl{tcdFam=FamilyDecl{fdLName}} -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
fdLName
    TyClD _ SynDecl{tcdLName} -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
tcdLName
    TyClD _ DataDecl{tcdLName} -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
tcdLName
    TyClD _ ClassDecl{tcdLName} -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
tcdLName
    ValD _ FunBind{fun_id}  -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
fun_id
    ValD _ VarBind{var_id}  -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just RdrName
IdP GhcPs
var_id
    ValD _ (PatSynBind _ PSB{psb_id}) -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
psb_id
    SigD _ (TypeSig _ (x:_) _) -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
x
    SigD _ (PatSynSig _ (x:_) _) -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
x
    SigD _ (ClassOpSig _ _ (x:_) _) -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
x
    ForD _ ForeignImport{fd_name} -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
fd_name
    ForD _ ForeignExport{fd_name} -> RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
fd_name
    _ -> Maybe RdrName
forall a. Maybe a
Nothing
declName _ = Maybe String
forall a. Maybe a
Nothing {- COMPLETE LL-}


bindName :: LHsBind GhcPs -> Maybe String
bindName :: LHsBind GhcPs -> Maybe String
bindName (LL _ FunBind{fun_id}) = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ OccName -> String
occNameString (OccName -> String) -> OccName -> String
forall a b. (a -> b) -> a -> b
$ RdrName -> OccName
forall name. HasOccName name => name -> OccName
occName (RdrName -> OccName) -> RdrName -> OccName
forall a b. (a -> b) -> a -> b
$ Located RdrName -> SrcSpanLess (Located RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located RdrName
Located (IdP GhcPs)
fun_id
bindName (LL _ VarBind{var_id}) = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ OccName -> String
occNameString (OccName -> String) -> OccName -> String
forall a b. (a -> b) -> a -> b
$ RdrName -> OccName
forall name. HasOccName name => name -> OccName
occName RdrName
IdP GhcPs
var_id
bindName _ = Maybe String
forall a. Maybe a
Nothing

isClsDefSig' :: Sig GhcPs -> Bool
isClsDefSig' :: Sig GhcPs -> Bool
isClsDefSig' (ClassOpSig _ True _ _) = Bool
True; isClsDefSig' _ = Bool
False