{-# LANGUAGE CPP                 #-}
{-# LANGUAGE NamedFieldPuns      #-}
{-# LANGUAGE ScopedTypeVariables #-}

#if MIN_VERSION_GHC(8,10)
#define GHC_IMPORT(NAME) GHC.Hs.NAME
#else
#define GHC_IMPORT(NAME) Hs ## NAME
#endif


-- | Generate tags from @'HsModule' 'GhcPs'@ representation.
--
module GhcTags.Ghc
  ( GhcTag (..)
  , GhcTags
  , GhcTagKind (..)
  , getGhcTags
  , hsDeclsToGhcTags
  ) where


import           Data.Maybe    (mapMaybe)
import           Data.Maybe    (maybeToList)
#if MIN_VERSION_GHC(9,6)
import qualified Data.List.NonEmpty as NonEmpty
#endif
import           Data.Foldable (foldl', toList)
import           Data.ByteString (ByteString)

-- Ghc imports
import           GHC.Types.SourceText (SourceText (..))
#if   MIN_VERSION_GHC(9,8)
import qualified GHC.Data.FastString as FastString
#endif
import           GHC.Data.FastString (bytesFS)
import           GHC_IMPORT(Binds)
                              ( HsBindLR (..)
                              , PatSynBind (..)
                              , Sig (..)
                              )
import           GHC_IMPORT(Decls)
                              ( ForeignImport (..)
                              , ClsInstDecl (..)
                              , ConDecl (..)
                              , DataFamInstDecl (..)
                              , FamEqn (..)
                              , FamilyDecl (..)
                              , FamilyInfo (..)
                              , FamilyResultSig (..)
                              , ForeignDecl (..)
                              , LHsDecl
                              , HsConDeclH98Details
                              , HsDecl (..)
                              , HsDataDefn (..)
                              , InstDecl (..)
                              , TyClDecl (..)
                              , TyFamInstDecl (..)
                              )
import           GHC.Hs.Decls ( StandaloneKindSig (..) )
import           GHC_IMPORT(ImpExp)
                              ( IE (..)
                              , IEWildcard (..)
                              , ieWrappedName
                              )
import           GHC_IMPORT(Extension)
                              ( GhcPs
                              )

import           GHC.Hs.Type
                              ( ConDeclField (..)
                              , FieldOcc (..)
                              , HsConDetails (..)
                              , HsKind
                              , HsTyVarBndr (..)
                              , HsType (..)
                              , HsWildCardBndrs
                              , LConDeclField
                              , LFieldOcc
                              , LHsQTyVars (..)
                              , LHsSigType
                              , LHsType
                              )

import           GHC.Types.SrcLoc
                                ( GenLocated (..)
                                , Located
                                , SrcSpan (..)
                                , unLoc
                                )
import           GHC.Types.Name.Reader
                                ( RdrName (..)
                                , rdrNameOcc
                                )
import           GHC.Types.Name ( nameOccName
                                , occNameFS
                                )
import           GHC.Hs       ( HsConDeclGADTDetails (..)
                              , HsModule (..)
                              , HsSigType (..)
#if   MIN_VERSION_GHC(9,6)
                              , CImportSpec (..) 
#endif
                              )
#if   MIN_VERSION_GHC(9,6)
import           GHC.Types.ForeignCall (CCallTarget (..))
#endif
import           GHC.Parser.Annotation (SrcSpanAnn' (..))
import           GHC.Hs       ( GRHSs (..)
                              , HsLocalBinds
                              , HsLocalBindsLR (..)
                              , HsValBindsLR (..)
                              , Match (..)
                              , MatchGroup (..)
                              )
#if MIN_VERSION_GHC(9,6)
import           Language.Haskell.Syntax.Module.Name (moduleNameFS)
#else
import           GHC.Unit.Module.Name (moduleNameFS)
#endif

#if MIN_VERSION_GHC(9,6)
type GhcPsModule = HsModule GhcPs
type GhcPsHsTyVarBndr = HsTyVarBndr () GhcPs
#else
type GhcPsModule = HsModule
type GhcPsHsTyVarBndr = HsTyVarBndr () GhcPs
#endif


-- | Kind of the term.
--
data GhcTagKind
    = GtkModule
    | GtkTerm
    | GtkFunction
    | GtkTypeConstructor        (Maybe (HsKind GhcPs))

    -- | H98 data constructor
    | GtkDataConstructor               (ConDecl GhcPs)

    -- | GADT constructor with its type
    | GtkGADTConstructor               (ConDecl GhcPs)
    | GtkRecordField
    | GtkTypeSynonym                   (HsType GhcPs)
    | GtkTypeSignature                 (HsWildCardBndrs GhcPs (LHsSigType GhcPs))
    | GtkTypeKindSignature             (LHsSigType GhcPs)
    | GtkPatternSynonym
    | GtkTypeClass
    | GtkTypeClassMember               (HsType GhcPs)
    | GtkTypeClassInstance             (HsType GhcPs)
    | GtkTypeClassInstanceMember       (HsType GhcPs)
    | GtkTypeFamily             (Maybe ([GhcPsHsTyVarBndr], Either (HsKind GhcPs) GhcPsHsTyVarBndr))
    -- ghc-8.6.5 does not provide 'TyFamInstDecl' for associated type families
    | GtkTypeFamilyInstance     (Maybe (TyFamInstDecl GhcPs))
    | GtkDataTypeFamily         (Maybe ([GhcPsHsTyVarBndr], Either (HsKind GhcPs) GhcPsHsTyVarBndr))
    | GtkDataTypeFamilyInstance (Maybe (HsKind GhcPs))
    | GtkForeignImport
    | GtkForeignExport


-- | We can read names from using fields of type 'GHC.Hs.Extensions.IdP' (a type
-- family) which for @'Parsed@ resolved to 'RdrName'
--
data GhcTag = GhcTag {
    GhcTag -> SrcSpan
gtSrcSpan    :: !SrcSpan
    -- ^ term location
  , GhcTag -> ByteString
gtTag        :: !ByteString
    -- ^ utf8 encoded tag's name
  , GhcTag -> GhcTagKind
gtKind       :: !GhcTagKind
    -- ^ tag's kind
  , GhcTag -> Bool
gtIsExported :: !Bool
    -- ^ 'True' iff the term is exported
  , GhcTag -> Maybe String
gtFFI        :: !(Maybe String)
    -- ^ @ffi@ import
  }

type GhcTags = [GhcTag]


-- | Check if an identifier is exported.
--
isExported :: Maybe [IE GhcPs] -> Located RdrName -> Bool
isExported :: Maybe [IE GhcPs] -> Located RdrName -> Bool
isExported Maybe [IE GhcPs]
Nothing   Located RdrName
_name = Bool
True
isExported (Just [IE GhcPs]
ies) (L SrcSpan
_ RdrName
name) =
    (IE GhcPs -> Bool) -> [IE GhcPs] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\IE GhcPs
ie -> IE GhcPs -> Maybe RdrName
ieName IE GhcPs
ie Maybe RdrName -> Maybe RdrName -> Bool
forall a. Eq a => a -> a -> Bool
== RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just RdrName
name) [IE GhcPs]
ies
  where
    -- TODO: the GHC's one is partial, and I got a panic error.
    ieName :: IE GhcPs -> Maybe RdrName
    ieName :: IE GhcPs -> Maybe RdrName
ieName (IEVar XIEVar GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n))              = RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n
    ieName (IEThingAbs  XIEThingAbs GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n))        = RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n
    ieName (IEThingWith XIEThingWith GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n) IEWildcard
_ [LIEWrappedName GhcPs]
_)    = RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n
    ieName (IEThingAll  XIEThingAll GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n))        = RdrName -> Maybe RdrName
forall a. a -> Maybe a
Just (RdrName -> Maybe RdrName) -> RdrName -> Maybe RdrName
forall a b. (a -> b) -> a -> b
$ IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n
    ieName IE GhcPs
_ = Maybe RdrName
forall a. Maybe a
Nothing


-- | Check if a class member or a type constructors is exported.
--
isMemberExported :: Maybe [IE GhcPs]
                 -> Located RdrName -- member name / constructor name
                 -> Located RdrName -- type class name / type constructor name
                 -> Bool
isMemberExported :: Maybe [IE GhcPs] -> Located RdrName -> Located RdrName -> Bool
isMemberExported Maybe [IE GhcPs]
Nothing    Located RdrName
_memberName Located RdrName
_className = Bool
True
isMemberExported (Just [IE GhcPs]
ies) Located RdrName
memberName  Located RdrName
className  = (IE GhcPs -> Bool) -> [IE GhcPs] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any IE GhcPs -> Bool
go [IE GhcPs]
ies
  where
    go :: IE GhcPs -> Bool

    go :: IE GhcPs -> Bool
go (IEVar XIEVar GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n)) = IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n RdrName -> RdrName -> Bool
forall a. Eq a => a -> a -> Bool
== Located RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc Located RdrName
memberName

    go (IEThingAbs XIEThingAbs GhcPs
_ LIEWrappedName GhcPs
_)  = Bool
False

    go (IEThingAll XIEThingAll GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n)) = IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n RdrName -> RdrName -> Bool
forall a. Eq a => a -> a -> Bool
== Located RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc Located RdrName
className

    go (IEThingWith XIEThingWith GhcPs
_ LIEWrappedName GhcPs
_ IEWildcard{} [LIEWrappedName GhcPs]
_)   = Bool
True

    go (IEThingWith XIEThingWith GhcPs
_ (L SrcSpanAnnA
_ IEWrappedName GhcPs
n) IEWildcard
NoIEWildcard [LIEWrappedName GhcPs]
ns) =
            IEWrappedName GhcPs -> IdP GhcPs
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName IEWrappedName GhcPs
n RdrName -> RdrName -> Bool
forall a. Eq a => a -> a -> Bool
== Located RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc Located RdrName
className
         Bool -> Bool -> Bool
&&  Bool
isInWrappedNames
      where
        -- the 'NameSpace' does not agree between things that are in the 'IE'
        -- list and passed member or type class names (constructor / type
        -- constructor names, respectively)
        isInWrappedNames :: Bool
isInWrappedNames = (GenLocated SrcSpanAnnA (IEWrappedName GhcPs) -> Bool)
-> [GenLocated SrcSpanAnnA (IEWrappedName GhcPs)] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ((FastString -> FastString -> Bool
forall a. Eq a => a -> a -> Bool
== OccName -> FastString
occNameFS (RdrName -> OccName
rdrNameOcc (Located RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc Located RdrName
memberName))) (FastString -> Bool)
-> (GenLocated SrcSpanAnnA (IEWrappedName GhcPs) -> FastString)
-> GenLocated SrcSpanAnnA (IEWrappedName GhcPs)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OccName -> FastString
occNameFS (OccName -> FastString)
-> (GenLocated SrcSpanAnnA (IEWrappedName GhcPs) -> OccName)
-> GenLocated SrcSpanAnnA (IEWrappedName GhcPs)
-> FastString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RdrName -> OccName
rdrNameOcc (RdrName -> OccName)
-> (GenLocated SrcSpanAnnA (IEWrappedName GhcPs) -> RdrName)
-> GenLocated SrcSpanAnnA (IEWrappedName GhcPs)
-> OccName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IEWrappedName GhcPs -> IdP GhcPs
IEWrappedName GhcPs -> RdrName
forall (p :: Pass). IEWrappedName (GhcPass p) -> IdP (GhcPass p)
ieWrappedName (IEWrappedName GhcPs -> RdrName)
-> (GenLocated SrcSpanAnnA (IEWrappedName GhcPs)
    -> IEWrappedName GhcPs)
-> GenLocated SrcSpanAnnA (IEWrappedName GhcPs)
-> RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (IEWrappedName GhcPs) -> IEWrappedName GhcPs
forall l e. GenLocated l e -> e
unLoc) [LIEWrappedName GhcPs]
[GenLocated SrcSpanAnnA (IEWrappedName GhcPs)]
ns

    go IE GhcPs
_ = Bool
False


-- | Create a 'GhcTag', effectively a smart constructor.
--
mkGhcTag :: Located RdrName
         -- ^ @RdrName ~ IdP GhcPs@ it *must* be a name of a top level identifier.
         -> GhcTagKind
         -- ^ tag's kind
         -> Bool
         -- ^ is term exported
         -> GhcTag
mkGhcTag :: Located RdrName -> GhcTagKind -> Bool -> GhcTag
mkGhcTag (L SrcSpan
gtSrcSpan RdrName
rdrName) GhcTagKind
gtKind Bool
gtIsExported =
    case RdrName
rdrName of
      Unqual OccName
occName ->
        GhcTag { gtTag :: ByteString
gtTag = FastString -> ByteString
bytesFS (OccName -> FastString
occNameFS OccName
occName)
               , SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan
               , GhcTagKind
gtKind :: GhcTagKind
gtKind :: GhcTagKind
gtKind
               , Bool
gtIsExported :: Bool
gtIsExported :: Bool
gtIsExported
               , gtFFI :: Maybe String
gtFFI = Maybe String
forall a. Maybe a
Nothing
               }

      Qual ModuleName
_ OccName
occName ->
        GhcTag { gtTag :: ByteString
gtTag = FastString -> ByteString
bytesFS (OccName -> FastString
occNameFS OccName
occName)
               , SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan
               , GhcTagKind
gtKind :: GhcTagKind
gtKind :: GhcTagKind
gtKind
               , Bool
gtIsExported :: Bool
gtIsExported :: Bool
gtIsExported
               , gtFFI :: Maybe String
gtFFI = Maybe String
forall a. Maybe a
Nothing
               }

      -- Orig is the only one we are interested in
      Orig Module
_ OccName
occName ->
        GhcTag { gtTag :: ByteString
gtTag = FastString -> ByteString
bytesFS (OccName -> FastString
occNameFS OccName
occName)
               , SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan
               , GhcTagKind
gtKind :: GhcTagKind
gtKind :: GhcTagKind
gtKind
               , Bool
gtIsExported :: Bool
gtIsExported :: Bool
gtIsExported
               , gtFFI :: Maybe String
gtFFI = Maybe String
forall a. Maybe a
Nothing
               }

      Exact Name
eName ->
        GhcTag { gtTag :: ByteString
gtTag = FastString -> ByteString
bytesFS (OccName -> FastString
occNameFS (Name -> OccName
nameOccName Name
eName))
               , SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan :: SrcSpan
gtSrcSpan
               , GhcTagKind
gtKind :: GhcTagKind
gtKind :: GhcTagKind
gtKind
               , Bool
gtIsExported :: Bool
gtIsExported :: Bool
gtIsExported
               , gtFFI :: Maybe String
gtFFI = Maybe String
forall a. Maybe a
Nothing
               }


-- | Generate tags for a module - simple walk over the syntax tree.
--
-- Supported identifiers:
--
--  * /module name/
--  * /top level terms/
--  * /local bindings/
--  * /data types/
--  * /record fields/
--  * /type synonyms/
--  * /type classes/
--  * /type class members/
--  * /type class instances/
--  * /type class instance members/
--  * /type families/
--  * /type family instances/
--  * /data type families/
--  * /data type families instances/
--  * /data type family instances constructors/
--
getGhcTags :: Located GhcPsModule
           -> GhcTags
getGhcTags :: Located GhcPsModule -> GhcTags
getGhcTags (L SrcSpan
_ HsModule { Maybe (XRec GhcPs ModuleName)
hsmodName :: Maybe (XRec GhcPs ModuleName)
hsmodName :: forall p. HsModule p -> Maybe (XRec p ModuleName)
hsmodName, [LHsDecl GhcPs]
hsmodDecls :: [LHsDecl GhcPs]
hsmodDecls :: forall p. HsModule p -> [LHsDecl p]
hsmodDecls, Maybe (XRec GhcPs [LIE GhcPs])
hsmodExports :: Maybe (XRec GhcPs [LIE GhcPs])
hsmodExports :: forall p. HsModule p -> Maybe (XRec p [LIE p])
hsmodExports }) =
       Maybe GhcTag -> GhcTags
forall a. Maybe a -> [a]
maybeToList (GenLocated SrcSpanAnnA ModuleName -> GhcTag
forall {a}. GenLocated (SrcSpanAnn' a) ModuleName -> GhcTag
mkModNameTag (GenLocated SrcSpanAnnA ModuleName -> GhcTag)
-> Maybe (GenLocated SrcSpanAnnA ModuleName) -> Maybe GhcTag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (XRec GhcPs ModuleName)
Maybe (GenLocated SrcSpanAnnA ModuleName)
hsmodName)
    GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++
       Maybe [IE GhcPs] -> [LHsDecl GhcPs] -> GhcTags
hsDeclsToGhcTags Maybe [IE GhcPs]
mies [LHsDecl GhcPs]
hsmodDecls
  where
    mies :: Maybe [IE GhcPs]
    mies :: Maybe [IE GhcPs]
mies = (GenLocated SrcSpanAnnA (IE GhcPs) -> IE GhcPs)
-> [GenLocated SrcSpanAnnA (IE GhcPs)] -> [IE GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map GenLocated SrcSpanAnnA (IE GhcPs) -> IE GhcPs
forall l e. GenLocated l e -> e
unLoc ([GenLocated SrcSpanAnnA (IE GhcPs)] -> [IE GhcPs])
-> (GenLocated SrcSpanAnnL [GenLocated SrcSpanAnnA (IE GhcPs)]
    -> [GenLocated SrcSpanAnnA (IE GhcPs)])
-> GenLocated SrcSpanAnnL [GenLocated SrcSpanAnnA (IE GhcPs)]
-> [IE GhcPs]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnL [GenLocated SrcSpanAnnA (IE GhcPs)]
-> [GenLocated SrcSpanAnnA (IE GhcPs)]
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnL [GenLocated SrcSpanAnnA (IE GhcPs)]
 -> [IE GhcPs])
-> Maybe
     (GenLocated SrcSpanAnnL [GenLocated SrcSpanAnnA (IE GhcPs)])
-> Maybe [IE GhcPs]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (XRec GhcPs [LIE GhcPs])
Maybe (GenLocated SrcSpanAnnL [GenLocated SrcSpanAnnA (IE GhcPs)])
hsmodExports

    mkModNameTag :: GenLocated (SrcSpanAnn' a) ModuleName -> GhcTag
mkModNameTag (L SrcSpanAnn' a
loc ModuleName
modName) =
      GhcTag { gtSrcSpan :: SrcSpan
gtSrcSpan = SrcSpanAnn' a -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' a
loc
             , gtTag :: ByteString
gtTag        = FastString -> ByteString
bytesFS (FastString -> ByteString) -> FastString -> ByteString
forall a b. (a -> b) -> a -> b
$ ModuleName -> FastString
moduleNameFS ModuleName
modName
             , gtKind :: GhcTagKind
gtKind       = GhcTagKind
GtkModule
             , gtIsExported :: Bool
gtIsExported = Bool
True
             , gtFFI :: Maybe String
gtFFI        = Maybe String
forall a. Maybe a
Nothing
             }


hsDeclsToGhcTags :: Maybe [IE GhcPs]
                 -> [LHsDecl GhcPs]
                 -> GhcTags
hsDeclsToGhcTags :: Maybe [IE GhcPs] -> [LHsDecl GhcPs] -> GhcTags
hsDeclsToGhcTags Maybe [IE GhcPs]
mies =
    GhcTags -> GhcTags
forall a. [a] -> [a]
reverse (GhcTags -> GhcTags)
-> ([GenLocated SrcSpanAnnA (HsDecl GhcPs)] -> GhcTags)
-> [GenLocated SrcSpanAnnA (HsDecl GhcPs)]
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GhcTags -> GenLocated SrcSpanAnnA (HsDecl GhcPs) -> GhcTags)
-> GhcTags -> [GenLocated SrcSpanAnnA (HsDecl GhcPs)] -> GhcTags
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' GhcTags -> LHsDecl GhcPs -> GhcTags
GhcTags -> GenLocated SrcSpanAnnA (HsDecl GhcPs) -> GhcTags
go []
  where
    fixLoc :: SrcSpan -> GhcTag -> GhcTag
    fixLoc :: SrcSpan -> GhcTag -> GhcTag
fixLoc SrcSpan
loc gt :: GhcTag
gt@GhcTag { gtSrcSpan :: GhcTag -> SrcSpan
gtSrcSpan = UnhelpfulSpan {} } = GhcTag
gt { gtSrcSpan = loc }
    fixLoc SrcSpan
_   GhcTag
gt                                         = GhcTag
gt

    -- like 'mkGhcTag' but checks if the identifier is exported
    mkGhcTag' :: SrcSpan
              -- ^ declaration's location; it is useful when the term does not
              -- contain useful information (e.g. code generated from template
              -- haskell splices).
              ->  Located RdrName
              --  ^ @RdrName ~ IdP GhcPs@ it *must* be a name of a top level
              --  identifier.
              -> GhcTagKind
              -- ^ tag's kind
              -> GhcTag
    mkGhcTag' :: SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
l Located RdrName
a GhcTagKind
k = SrcSpan -> GhcTag -> GhcTag
fixLoc SrcSpan
l (GhcTag -> GhcTag) -> GhcTag -> GhcTag
forall a b. (a -> b) -> a -> b
$ Located RdrName -> GhcTagKind -> Bool -> GhcTag
mkGhcTag Located RdrName
a GhcTagKind
k (Maybe [IE GhcPs] -> Located RdrName -> Bool
isExported Maybe [IE GhcPs]
mies Located RdrName
a)


    mkGhcTagForMember :: SrcSpan
                      -- ^ declaration's 'SrcSpan'
                      -> Located RdrName -- member name
                      -> Located RdrName -- class name
                      -> GhcTagKind
                      -> GhcTag
    mkGhcTagForMember :: SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc Located RdrName
memberName Located RdrName
className GhcTagKind
kind =
      SrcSpan -> GhcTag -> GhcTag
fixLoc SrcSpan
decLoc (GhcTag -> GhcTag) -> GhcTag -> GhcTag
forall a b. (a -> b) -> a -> b
$ Located RdrName -> GhcTagKind -> Bool -> GhcTag
mkGhcTag Located RdrName
memberName GhcTagKind
kind
                               (Maybe [IE GhcPs] -> Located RdrName -> Located RdrName -> Bool
isMemberExported Maybe [IE GhcPs]
mies Located RdrName
memberName Located RdrName
className)

    -- Main routine which traverse all top level declarations.
    --
    go :: GhcTags -> LHsDecl GhcPs -> GhcTags
    go :: GhcTags -> LHsDecl GhcPs -> GhcTags
go GhcTags
tags (L SrcSpanAnnA
decLoc' HsDecl GhcPs
hsDecl) = let decLoc :: SrcSpan
decLoc = SrcSpanAnnA -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locAnn SrcSpanAnnA
decLoc' in case HsDecl GhcPs
hsDecl of

      -- type or class declaration
      TyClD XTyClD GhcPs
_ TyClDecl GhcPs
tyClDecl ->
        case TyClDecl GhcPs
tyClDecl of

          -- type family declarations
          FamDecl { FamilyDecl GhcPs
tcdFam :: FamilyDecl GhcPs
tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
tcdFam } ->
            case SrcSpan
-> FamilyDecl GhcPs -> Maybe (Located RdrName) -> Maybe GhcTag
mkFamilyDeclTags SrcSpan
decLoc FamilyDecl GhcPs
tcdFam Maybe (Located RdrName)
forall a. Maybe a
Nothing of
              Just GhcTag
tag -> GhcTag
tag GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags
              Maybe GhcTag
Nothing  ->       GhcTags
tags

          -- type synonyms
          SynDecl { LIdP GhcPs
tcdLName :: LIdP GhcPs
tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdLName, tcdRhs :: forall pass. TyClDecl pass -> LHsType pass
tcdRhs = L SrcSpanAnnA
_ HsType GhcPs
hsType } ->
            SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
tcdLName) (HsType GhcPs -> GhcTagKind
GtkTypeSynonym HsType GhcPs
hsType) GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags

          -- data declaration:
          --   type,
          --   constructors,
          --   record fields
          --
          DataDecl { LIdP GhcPs
tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdLName :: LIdP GhcPs
tcdLName, HsDataDefn GhcPs
tcdDataDefn :: HsDataDefn GhcPs
tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
tcdDataDefn } ->
            case HsDataDefn GhcPs
tcdDataDefn of
              HsDataDefn { DataDefnCons (LConDecl GhcPs)
dd_cons :: DataDefnCons (LConDecl GhcPs)
dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
dd_cons, Maybe (LHsType GhcPs)
dd_kindSig :: Maybe (LHsType GhcPs)
dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_kindSig } ->
                     SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
tcdLName) (Maybe (HsType GhcPs) -> GhcTagKind
GtkTypeConstructor (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs)
-> Maybe (GenLocated SrcSpanAnnA (HsType GhcPs))
-> Maybe (HsType GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (LHsType GhcPs)
Maybe (GenLocated SrcSpanAnnA (HsType GhcPs))
dd_kindSig))
                   GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: (SrcSpan -> Located RdrName -> ConDecl GhcPs -> GhcTags
mkConsTags SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
tcdLName) (ConDecl GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (ConDecl GhcPs) -> ConDecl GhcPs)
-> GenLocated SrcSpanAnnA (ConDecl GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (ConDecl GhcPs) -> ConDecl GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (ConDecl GhcPs) -> GhcTags)
-> DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs)) -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
`concatMap` DataDefnCons (LConDecl GhcPs)
DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
dd_cons
                  GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags

          -- Type class declaration:
          --   type class name,
          --   type class members,
          --   default methods,
          --   default data type instance
          --
          ClassDecl { LIdP GhcPs
tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdLName :: LIdP GhcPs
tcdLName, [LSig GhcPs]
tcdSigs :: [LSig GhcPs]
tcdSigs :: forall pass. TyClDecl pass -> [LSig pass]
tcdSigs, LHsBinds GhcPs
tcdMeths :: LHsBinds GhcPs
tcdMeths :: forall pass. TyClDecl pass -> LHsBinds pass
tcdMeths, [LFamilyDecl GhcPs]
tcdATs :: [LFamilyDecl GhcPs]
tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
tcdATs, [LTyFamDefltDecl GhcPs]
tcdATDefs :: [LTyFamDefltDecl GhcPs]
tcdATDefs :: forall pass. TyClDecl pass -> [LTyFamDefltDecl pass]
tcdATDefs } ->
               -- class name
               SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
tcdLName) GhcTagKind
GtkTypeClass
               -- class methods
             GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: (SrcSpan -> Located RdrName -> Sig GhcPs -> GhcTags
mkClsMemberTags SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
tcdLName) (Sig GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (Sig GhcPs) -> Sig GhcPs)
-> GenLocated SrcSpanAnnA (Sig GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (Sig GhcPs) -> Sig GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (Sig GhcPs) -> GhcTags)
-> [GenLocated SrcSpanAnnA (Sig GhcPs)] -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
`concatMap` [LSig GhcPs]
[GenLocated SrcSpanAnnA (Sig GhcPs)]
tcdSigs
               -- default methods
            GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ (GhcTags
 -> GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs) -> GhcTags)
-> GhcTags
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs))
-> GhcTags
forall b a. (b -> a -> b) -> b -> Bag a -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\GhcTags
tags' GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
hsBind -> SrcSpan -> HsBindLR GhcPs GhcPs -> GhcTags
mkHsBindLRTags SrcSpan
decLoc (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> HsBindLR GhcPs GhcPs
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
hsBind) GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags')
                     []
                     LHsBinds GhcPs
Bag (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs))
tcdMeths
            -- associated types
            GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ ((\FamilyDecl GhcPs
a -> SrcSpan
-> FamilyDecl GhcPs -> Maybe (Located RdrName) -> Maybe GhcTag
mkFamilyDeclTags SrcSpan
decLoc FamilyDecl GhcPs
a (Located RdrName -> Maybe (Located RdrName)
forall a. a -> Maybe a
Just (Located RdrName -> Maybe (Located RdrName))
-> Located RdrName -> Maybe (Located RdrName)
forall a b. (a -> b) -> a -> b
$ GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
tcdLName)) (FamilyDecl GhcPs -> Maybe GhcTag)
-> (GenLocated SrcSpanAnnA (FamilyDecl GhcPs) -> FamilyDecl GhcPs)
-> GenLocated SrcSpanAnnA (FamilyDecl GhcPs)
-> Maybe GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (FamilyDecl GhcPs) -> FamilyDecl GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (FamilyDecl GhcPs) -> Maybe GhcTag)
-> [GenLocated SrcSpanAnnA (FamilyDecl GhcPs)] -> GhcTags
forall a b. (a -> Maybe b) -> [a] -> [b]
`mapMaybe` [LFamilyDecl GhcPs]
[GenLocated SrcSpanAnnA (FamilyDecl GhcPs)]
tcdATs
            -- associated type defaults (data type families, type families
            -- (open or closed)
            GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ (GhcTags
 -> GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs) -> GhcTags)
-> GhcTags
-> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs)]
-> GhcTags
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl'
                (\GhcTags
tags' (L SrcSpanAnnA
_ decl' :: TyFamInstDecl GhcPs
decl'@(TyFamInstDecl { tfid_eqn :: forall pass. TyFamInstDecl pass -> TyFamInstEqn pass
tfid_eqn = TyFamInstEqn GhcPs
tyFamDeflEqn })) ->
                  let decl :: Maybe (TyFamInstDecl GhcPs)
decl = TyFamInstDecl GhcPs -> Maybe (TyFamInstDecl GhcPs)
forall a. a -> Maybe a
Just TyFamInstDecl GhcPs
decl' in
                    case TyFamInstEqn GhcPs
tyFamDeflEqn of
                      FamEqn { feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
feqn_rhs = L SrcSpanAnnA
_ HsType GhcPs
hsType } ->
                        case HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName HsType GhcPs
hsType of
                          -- TODO: add a `default` field
                          Just Located RdrName
a  -> SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc Located RdrName
a (Maybe (TyFamInstDecl GhcPs) -> GhcTagKind
GtkTypeFamilyInstance Maybe (TyFamInstDecl GhcPs)
decl) GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags'
                          Maybe (Located RdrName)
Nothing -> GhcTags
tags'
                )
                [] [LTyFamDefltDecl GhcPs]
[GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs)]
tcdATDefs
            GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags

      -- Instance declarations
      --  class instances
      --  type family instance
      --  data type family instances
      --
      InstD XInstD GhcPs
_ InstDecl GhcPs
instDecl ->
        case InstDecl GhcPs
instDecl of
          -- class instance declaration
          ClsInstD { ClsInstDecl GhcPs
cid_inst :: ClsInstDecl GhcPs
cid_inst :: forall pass. InstDecl pass -> ClsInstDecl pass
cid_inst } ->
            case ClsInstDecl GhcPs
cid_inst of

              ClsInstDecl { LHsSigType GhcPs
cid_poly_ty :: LHsSigType GhcPs
cid_poly_ty :: forall pass. ClsInstDecl pass -> LHsSigType pass
cid_poly_ty, [LTyFamDefltDecl GhcPs]
cid_tyfam_insts :: [LTyFamDefltDecl GhcPs]
cid_tyfam_insts :: forall pass. ClsInstDecl pass -> [LTyFamInstDecl pass]
cid_tyfam_insts, [LDataFamInstDecl GhcPs]
cid_datafam_insts :: [LDataFamInstDecl GhcPs]
cid_datafam_insts :: forall pass. ClsInstDecl pass -> [LDataFamInstDecl pass]
cid_datafam_insts, LHsBinds GhcPs
cid_binds :: LHsBinds GhcPs
cid_binds :: forall pass. ClsInstDecl pass -> LHsBinds pass
cid_binds, [LSig GhcPs]
cid_sigs :: [LSig GhcPs]
cid_sigs :: forall pass. ClsInstDecl pass -> [LSig pass]
cid_sigs } ->
                  case LHsSigType GhcPs
cid_poly_ty of

                    -- TODO: @hsbib_body :: LHsType GhcPs@
                    L SrcSpanAnnA
_ HsSig { sig_body :: forall pass. HsSigType pass -> LHsType pass
sig_body = LHsType GhcPs
body } ->
                      case SrcSpan -> LHsType GhcPs -> Maybe GhcTag
mkLHsTypeTag SrcSpan
decLoc LHsType GhcPs
body of
                        Maybe GhcTag
Nothing  ->       (GhcTag -> GhcTag) -> GhcTags -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
map (HsType GhcPs -> GhcTag -> GhcTag
fixTagKind (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
body)) (GhcTags
tyFamTags GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
dataFamTags GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
bindsTags GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
sigsTags) GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags
                        Just GhcTag
tag -> GhcTag
tag GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: (GhcTag -> GhcTag) -> GhcTags -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
map (HsType GhcPs -> GhcTag -> GhcTag
fixTagKind (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
body)) (GhcTags
tyFamTags GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
dataFamTags GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
bindsTags GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
sigsTags) GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags
                where
                  -- associated type and data type family instances
                  dataFamTags :: GhcTags
dataFamTags = (SrcSpan -> DataFamInstDecl GhcPs -> GhcTags
mkDataFamInstDeclTag SrcSpan
decLoc (DataFamInstDecl GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (DataFamInstDecl GhcPs)
    -> DataFamInstDecl GhcPs)
-> GenLocated SrcSpanAnnA (DataFamInstDecl GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (DataFamInstDecl GhcPs)
-> DataFamInstDecl GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (DataFamInstDecl GhcPs) -> GhcTags)
-> [GenLocated SrcSpanAnnA (DataFamInstDecl GhcPs)] -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
`concatMap` [LDataFamInstDecl GhcPs]
[GenLocated SrcSpanAnnA (DataFamInstDecl GhcPs)]
cid_datafam_insts
                  tyFamTags :: GhcTags
tyFamTags   = (SrcSpan -> TyFamInstDecl GhcPs -> Maybe GhcTag
mkTyFamInstDeclTag   SrcSpan
decLoc (TyFamInstDecl GhcPs -> Maybe GhcTag)
-> (GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs)
    -> TyFamInstDecl GhcPs)
-> GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs)
-> Maybe GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs) -> TyFamInstDecl GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs) -> Maybe GhcTag)
-> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs)] -> GhcTags
forall a b. (a -> Maybe b) -> [a] -> [b]
`mapMaybe`  [LTyFamDefltDecl GhcPs]
[GenLocated SrcSpanAnnA (TyFamInstDecl GhcPs)]
cid_tyfam_insts
                  bindsTags :: GhcTags
bindsTags   = (SrcSpan -> HsBindLR GhcPs GhcPs -> GhcTags
mkHsBindLRTags SrcSpan
decLoc (HsBindLR GhcPs GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
    -> HsBindLR GhcPs GhcPs)
-> GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> HsBindLR GhcPs GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs) -> GhcTags)
-> Bag (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)) -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
`concatMap` LHsBinds GhcPs
Bag (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs))
cid_binds
                  sigsTags :: GhcTags
sigsTags    = (SrcSpan -> Sig GhcPs -> GhcTags
mkSigTags SrcSpan
decLoc (Sig GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (Sig GhcPs) -> Sig GhcPs)
-> GenLocated SrcSpanAnnA (Sig GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (Sig GhcPs) -> Sig GhcPs
forall l e. GenLocated l e -> e
unLoc) (GenLocated SrcSpanAnnA (Sig GhcPs) -> GhcTags)
-> [GenLocated SrcSpanAnnA (Sig GhcPs)] -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
`concatMap` [LSig GhcPs]
[GenLocated SrcSpanAnnA (Sig GhcPs)]
cid_sigs

                  fixTagKind :: HsType GhcPs -> GhcTag -> GhcTag
fixTagKind HsType GhcPs
body GhcTag
a = GhcTag
a { gtKind = GtkTypeClassInstanceMember body }

          -- data family instance
          DataFamInstD { DataFamInstDecl GhcPs
dfid_inst :: DataFamInstDecl GhcPs
dfid_inst :: forall pass. InstDecl pass -> DataFamInstDecl pass
dfid_inst } ->
            SrcSpan -> DataFamInstDecl GhcPs -> GhcTags
mkDataFamInstDeclTag SrcSpan
decLoc DataFamInstDecl GhcPs
dfid_inst GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags

          -- type family instance
          TyFamInstD { TyFamInstDecl GhcPs
tfid_inst :: TyFamInstDecl GhcPs
tfid_inst :: forall pass. InstDecl pass -> TyFamInstDecl pass
tfid_inst } ->
            case SrcSpan -> TyFamInstDecl GhcPs -> Maybe GhcTag
mkTyFamInstDeclTag SrcSpan
decLoc TyFamInstDecl GhcPs
tfid_inst of
              Maybe GhcTag
Nothing  ->       GhcTags
tags
              Just GhcTag
tag -> GhcTag
tag GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags


      -- deriving declaration
      DerivD {} -> GhcTags
tags

      -- value declaration
      ValD XValD GhcPs
_ HsBindLR GhcPs GhcPs
hsBind  -> SrcSpan -> HsBindLR GhcPs GhcPs -> GhcTags
mkHsBindLRTags SrcSpan
decLoc HsBindLR GhcPs GhcPs
hsBind GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags

      -- signature declaration
      SigD XSigD GhcPs
_ Sig GhcPs
sig -> SrcSpan -> Sig GhcPs -> GhcTags
mkSigTags SrcSpan
decLoc Sig GhcPs
sig GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ GhcTags
tags

      -- standalone kind signatures
      KindSigD XKindSigD GhcPs
_ StandaloneKindSig GhcPs
stdKindSig ->
        case StandaloneKindSig GhcPs
stdKindSig of
          StandaloneKindSig XStandaloneKindSig GhcPs
_ LIdP GhcPs
ksName LHsSigType GhcPs
sigType ->
           SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
ksName)  (LHsSigType GhcPs -> GhcTagKind
GtkTypeKindSignature LHsSigType GhcPs
sigType) GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags

      -- default declaration
      DefD {} -> GhcTags
tags

      -- foreign declaration
      ForD XForD GhcPs
_ ForeignDecl GhcPs
foreignDecl ->
        case ForeignDecl GhcPs
foreignDecl of
#if MIN_VERSION_GHC(9,6)
          ForeignImport { fd_fi :: forall pass. ForeignDecl pass -> ForeignImport pass
fd_fi = CImport XCImport GhcPs
_ XRec GhcPs CCallConv
_ XRec GhcPs Safety
_mheader Maybe Header
_ CLabel {} } -> GhcTags
tags
          ForeignImport { fd_fi :: forall pass. ForeignDecl pass -> ForeignImport pass
fd_fi = CImport XCImport GhcPs
_ XRec GhcPs CCallConv
_ XRec GhcPs Safety
_mheader Maybe Header
_ CImportSpec
CWrapper } -> GhcTags
tags
          ForeignImport { fd_fi :: forall pass. ForeignDecl pass -> ForeignImport pass
fd_fi = CImport XCImport GhcPs
_ XRec GhcPs CCallConv
_ XRec GhcPs Safety
_mheader Maybe Header
_ (CFunction CCallTarget
DynamicTarget) } -> GhcTags
tags
          ForeignImport { fd_fi :: forall pass. ForeignDecl pass -> ForeignImport pass
fd_fi = CImport XCImport GhcPs
_ XRec GhcPs CCallConv
_ XRec GhcPs Safety
_mheader Maybe Header
_ (CFunction ((StaticTarget SourceText
sourceText FastString
_ Maybe Unit
_ Bool
_))), LIdP GhcPs
fd_name :: LIdP GhcPs
fd_name :: forall pass. ForeignDecl pass -> LIdP pass
fd_name } ->
#else
          ForeignImport { fd_name, fd_fi = CImport _ _ _mheader _ (L _ sourceText) } ->
#endif
                case SourceText
sourceText of
                  SourceText
NoSourceText -> GhcTag
tag
                  -- TODO: add header information from '_mheader'
#if MIN_VERSION_GHC(9,8)
                  SourceText s -> tag { gtFFI = Just (FastString.unpackFS s) }
#else
                  SourceText String
s -> GhcTag
tag { gtFFI = Just s }
#endif
              GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags
            where
              tag :: GhcTag
tag = SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
fd_name) GhcTagKind
GtkForeignImport

          ForeignExport { LIdP GhcPs
fd_name :: forall pass. ForeignDecl pass -> LIdP pass
fd_name :: LIdP GhcPs
fd_name } ->
              SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
fd_name) GhcTagKind
GtkForeignExport
            GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
tags

      WarningD {}   -> GhcTags
tags
      AnnD {}       -> GhcTags
tags

      -- TODO: Rules are named it would be nice to get them too
      RuleD {}      -> GhcTags
tags
      SpliceD {}    -> GhcTags
tags
      DocD {}       -> GhcTags
tags
      RoleAnnotD {} -> GhcTags
tags

    -- generate tags of all constructors of a type
    --
    mkConsTags :: SrcSpan
               -> Located RdrName
               -- name of the type
               -> ConDecl GhcPs
               -- constructor declaration
               -> GhcTags

    mkConsTags :: SrcSpan -> Located RdrName -> ConDecl GhcPs -> GhcTags
mkConsTags SrcSpan
decLoc Located RdrName
tyName con :: ConDecl GhcPs
con@ConDeclGADT { NonEmpty (LIdP GhcPs)
con_names :: NonEmpty (LIdP GhcPs)
con_names :: forall pass. ConDecl pass -> NonEmpty (LIdP pass)
con_names, con_g_args :: forall pass. ConDecl pass -> HsConDeclGADTDetails pass
con_g_args = HsConDeclGADTDetails GhcPs
con_args } =
         ( (\Located RdrName
n -> SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc Located RdrName
n Located RdrName
tyName (ConDecl GhcPs -> GhcTagKind
GtkGADTConstructor ConDecl GhcPs
con))
         (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn )
         (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
con_names'
      GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ SrcSpan -> Located RdrName -> HsConDeclGADTDetails GhcPs -> GhcTags
mkHsConDeclGADTDetails SrcSpan
decLoc Located RdrName
tyName HsConDeclGADTDetails GhcPs
con_args
      where
#if MIN_VERSION_GHC(9,6)
        con_names' :: [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
con_names' = NonEmpty (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
forall a. NonEmpty a -> [a]
NonEmpty.toList NonEmpty (LIdP GhcPs)
NonEmpty (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName)
con_names
#else
        con_names' = con_names
#endif

    mkConsTags SrcSpan
decLoc Located RdrName
tyName con :: ConDecl GhcPs
con@ConDeclH98  { LIdP GhcPs
con_name :: LIdP GhcPs
con_name :: forall pass. ConDecl pass -> LIdP pass
con_name, HsConDeclH98Details GhcPs
con_args :: HsConDeclH98Details GhcPs
con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
con_args } =
        SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
con_name) Located RdrName
tyName
          (ConDecl GhcPs -> GhcTagKind
GtkDataConstructor ConDecl GhcPs
con)
      GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: SrcSpan -> Located RdrName -> HsConDeclH98Details GhcPs -> GhcTags
mkHsConDeclH98Details SrcSpan
decLoc Located RdrName
tyName HsConDeclH98Details GhcPs
con_args

    mkHsLocalBindsTags :: SrcSpan -> HsLocalBinds GhcPs -> [GhcTag]
    mkHsLocalBindsTags :: SrcSpan -> HsLocalBinds GhcPs -> GhcTags
mkHsLocalBindsTags SrcSpan
decLoc (HsValBinds XHsValBinds GhcPs GhcPs
_ (ValBinds XValBinds GhcPs GhcPs
_ LHsBinds GhcPs
hsBindsLR [LSig GhcPs]
sigs)) =
         -- where clause bindings
         (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs) -> GhcTags)
-> [GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)] -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (SrcSpan -> HsBindLR GhcPs GhcPs -> GhcTags
mkHsBindLRTags SrcSpan
decLoc (HsBindLR GhcPs GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
    -> HsBindLR GhcPs GhcPs)
-> GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> HsBindLR GhcPs GhcPs
forall l e. GenLocated l e -> e
unLoc) (Bag (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs))
-> [GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)]
forall a. Bag a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList LHsBinds GhcPs
Bag (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs))
hsBindsLR)
      GhcTags -> GhcTags -> GhcTags
forall a. [a] -> [a] -> [a]
++ (GenLocated SrcSpanAnnA (Sig GhcPs) -> GhcTags)
-> [GenLocated SrcSpanAnnA (Sig GhcPs)] -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (SrcSpan -> Sig GhcPs -> GhcTags
mkSigTags SrcSpan
decLoc (Sig GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (Sig GhcPs) -> Sig GhcPs)
-> GenLocated SrcSpanAnnA (Sig GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (Sig GhcPs) -> Sig GhcPs
forall l e. GenLocated l e -> e
unLoc) [LSig GhcPs]
[GenLocated SrcSpanAnnA (Sig GhcPs)]
sigs

    mkHsLocalBindsTags SrcSpan
_ HsLocalBinds GhcPs
_ = []

    mkHsConDeclH98Details :: SrcSpan
                          -> Located RdrName
                          -> HsConDeclH98Details GhcPs
                          -> GhcTags
    mkHsConDeclH98Details :: SrcSpan -> Located RdrName -> HsConDeclH98Details GhcPs -> GhcTags
mkHsConDeclH98Details SrcSpan
decLoc Located RdrName
tyName (RecCon (L SrcSpanAnnL
_ [GenLocated SrcSpanAnnA (ConDeclField GhcPs)]
fields)) =
        (GhcTags -> GenLocated SrcSpanAnnA (ConDeclField GhcPs) -> GhcTags)
-> GhcTags
-> [GenLocated SrcSpanAnnA (ConDeclField GhcPs)]
-> GhcTags
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' GhcTags -> LConDeclField GhcPs -> GhcTags
GhcTags -> GenLocated SrcSpanAnnA (ConDeclField GhcPs) -> GhcTags
f [] [GenLocated SrcSpanAnnA (ConDeclField GhcPs)]
fields
      where
        f :: GhcTags -> LConDeclField GhcPs -> GhcTags
        f :: GhcTags -> LConDeclField GhcPs -> GhcTags
f GhcTags
ts (L SrcSpanAnnA
_ ConDeclField { [LFieldOcc GhcPs]
cd_fld_names :: [LFieldOcc GhcPs]
cd_fld_names :: forall pass. ConDeclField pass -> [LFieldOcc pass]
cd_fld_names }) = (GhcTags
 -> GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs) -> GhcTags)
-> GhcTags
-> [GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs)]
-> GhcTags
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' GhcTags -> LFieldOcc GhcPs -> GhcTags
GhcTags -> GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs) -> GhcTags
g GhcTags
ts [LFieldOcc GhcPs]
[GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs)]
cd_fld_names

        g :: GhcTags -> LFieldOcc GhcPs -> GhcTags
        g :: GhcTags -> LFieldOcc GhcPs -> GhcTags
g GhcTags
ts (L SrcAnn NoEpAnns
_ fo :: FieldOcc GhcPs
fo@FieldOcc {}) =
            SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
 -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> Located RdrName
forall a b. (a -> b) -> a -> b
$ FieldOcc GhcPs -> XRec GhcPs RdrName
forall pass. FieldOcc pass -> XRec pass RdrName
foLabel FieldOcc GhcPs
fo) Located RdrName
tyName GhcTagKind
GtkRecordField
          GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
ts

    mkHsConDeclH98Details SrcSpan
_ Located RdrName
_ HsConDeclH98Details GhcPs
_ = []

    mkHsConDeclGADTDetails :: SrcSpan
                           -> Located RdrName
                           -> HsConDeclGADTDetails GhcPs
                           -> GhcTags
    mkHsConDeclGADTDetails :: SrcSpan -> Located RdrName -> HsConDeclGADTDetails GhcPs -> GhcTags
mkHsConDeclGADTDetails SrcSpan
decLoc Located RdrName
tyName (RecConGADT (L SrcSpanAnnL
_ [GenLocated SrcSpanAnnA (ConDeclField GhcPs)]
fields) LHsUniToken "->" "\8594" GhcPs
_) =
        (GhcTags -> GenLocated SrcSpanAnnA (ConDeclField GhcPs) -> GhcTags)
-> GhcTags
-> [GenLocated SrcSpanAnnA (ConDeclField GhcPs)]
-> GhcTags
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' GhcTags -> LConDeclField GhcPs -> GhcTags
GhcTags -> GenLocated SrcSpanAnnA (ConDeclField GhcPs) -> GhcTags
f [] [GenLocated SrcSpanAnnA (ConDeclField GhcPs)]
fields
      where
        f :: GhcTags -> LConDeclField GhcPs -> GhcTags
        f :: GhcTags -> LConDeclField GhcPs -> GhcTags
f GhcTags
ts (L SrcSpanAnnA
_ ConDeclField { [LFieldOcc GhcPs]
cd_fld_names :: forall pass. ConDeclField pass -> [LFieldOcc pass]
cd_fld_names :: [LFieldOcc GhcPs]
cd_fld_names }) = (GhcTags
 -> GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs) -> GhcTags)
-> GhcTags
-> [GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs)]
-> GhcTags
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' GhcTags -> LFieldOcc GhcPs -> GhcTags
GhcTags -> GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs) -> GhcTags
g GhcTags
ts [LFieldOcc GhcPs]
[GenLocated (SrcAnn NoEpAnns) (FieldOcc GhcPs)]
cd_fld_names

        g :: GhcTags -> LFieldOcc GhcPs -> GhcTags
        g :: GhcTags -> LFieldOcc GhcPs -> GhcTags
g GhcTags
ts (L SrcAnn NoEpAnns
_ FieldOcc GhcPs
fo) =
            SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
 -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> Located RdrName
forall a b. (a -> b) -> a -> b
$ FieldOcc GhcPs -> XRec GhcPs RdrName
forall pass. FieldOcc pass -> XRec pass RdrName
foLabel FieldOcc GhcPs
fo) Located RdrName
tyName GhcTagKind
GtkRecordField
          GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: GhcTags
ts
    mkHsConDeclGADTDetails SrcSpan
_ Located RdrName
_ HsConDeclGADTDetails GhcPs
_ = []


    mkHsBindLRTags :: SrcSpan
                   -- ^ declaration's 'SrcSpan'
                   -> HsBindLR GhcPs GhcPs
                   -> GhcTags
    mkHsBindLRTags :: SrcSpan -> HsBindLR GhcPs GhcPs -> GhcTags
mkHsBindLRTags SrcSpan
decLoc HsBindLR GhcPs GhcPs
hsBind =
      case HsBindLR GhcPs GhcPs
hsBind of
        FunBind { LIdP GhcPs
fun_id :: LIdP GhcPs
fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id, MatchGroup GhcPs (LHsExpr GhcPs)
fun_matches :: MatchGroup GhcPs (LHsExpr GhcPs)
fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches } ->
          let binds :: [HsLocalBinds GhcPs]
binds = (GenLocated
   SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
 -> HsLocalBinds GhcPs)
-> [GenLocated
      SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
-> [HsLocalBinds GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map (GRHSs GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
-> HsLocalBinds GhcPs
forall p body. GRHSs p body -> HsLocalBinds p
grhssLocalBinds (GRHSs GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
 -> HsLocalBinds GhcPs)
-> (GenLocated
      SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
    -> GRHSs GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
-> GenLocated
     SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
-> HsLocalBinds GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
-> GRHSs GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
forall p body. Match p body -> GRHSs p body
m_grhss (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
 -> GRHSs GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
-> (GenLocated
      SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
    -> Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
-> GenLocated
     SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
-> GRHSs GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated
  SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))
-> Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
forall l e. GenLocated l e -> e
unLoc)
                    ([GenLocated
    SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
 -> [HsLocalBinds GhcPs])
-> (MatchGroup GhcPs (LHsExpr GhcPs)
    -> [GenLocated
          SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))])
-> MatchGroup GhcPs (LHsExpr GhcPs)
-> [HsLocalBinds GhcPs]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated
  SrcSpanAnnL
  [GenLocated
     SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
-> [GenLocated
      SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
forall l e. GenLocated l e -> e
unLoc
                    (GenLocated
   SrcSpanAnnL
   [GenLocated
      SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
 -> [GenLocated
       SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))])
-> (MatchGroup GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
    -> GenLocated
         SrcSpanAnnL
         [GenLocated
            SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))])
-> MatchGroup GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
-> [GenLocated
      SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MatchGroup GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
-> XRec
     GhcPs [LMatch GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))]
MatchGroup GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs))
-> GenLocated
     SrcSpanAnnL
     [GenLocated
        SrcSpanAnnA (Match GhcPs (GenLocated SrcSpanAnnA (HsExpr GhcPs)))]
forall p body. MatchGroup p body -> XRec p [LMatch p body]
mg_alts
                    (MatchGroup GhcPs (LHsExpr GhcPs) -> [HsLocalBinds GhcPs])
-> MatchGroup GhcPs (LHsExpr GhcPs) -> [HsLocalBinds GhcPs]
forall a b. (a -> b) -> a -> b
$ MatchGroup GhcPs (LHsExpr GhcPs)
fun_matches
          in   SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
fun_id) GhcTagKind
GtkFunction
             GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: (HsLocalBinds GhcPs -> GhcTags) -> [HsLocalBinds GhcPs] -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap
                 (SrcSpan -> HsLocalBinds GhcPs -> GhcTags
mkHsLocalBindsTags SrcSpan
decLoc)
                 [HsLocalBinds GhcPs]
binds

        -- TODO
        -- This is useful to generating tags for
        -- ````
        -- Just x = lhs
        -- ```
        PatBind {} -> []

        VarBind { IdP GhcPs
var_id :: IdP GhcPs
var_id :: forall idL idR. HsBindLR idL idR -> IdP idL
var_id, var_rhs :: forall idL idR. HsBindLR idL idR -> LHsExpr idR
var_rhs = L SrcSpanAnnA
srcSpan HsExpr GhcPs
_ } ->
          [SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated SrcSpanAnnA RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn (GenLocated SrcSpanAnnA RdrName -> Located RdrName)
-> GenLocated SrcSpanAnnA RdrName -> Located RdrName
forall a b. (a -> b) -> a -> b
$ SrcSpanAnnA -> RdrName -> GenLocated SrcSpanAnnA RdrName
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
srcSpan IdP GhcPs
RdrName
var_id) GhcTagKind
GtkTerm]

        PatSynBind XPatSynBind GhcPs GhcPs
_ PSB { LIdP GhcPs
psb_id :: LIdP GhcPs
psb_id :: forall idL idR. PatSynBind idL idR -> LIdP idL
psb_id } -> [SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
psb_id) GhcTagKind
GtkPatternSynonym]


    mkClsMemberTags :: SrcSpan -> Located RdrName -> Sig GhcPs -> GhcTags
    mkClsMemberTags :: SrcSpan -> Located RdrName -> Sig GhcPs -> GhcTags
mkClsMemberTags SrcSpan
decLoc Located RdrName
clsName (TypeSig   XTypeSig GhcPs
_ [LIdP GhcPs]
lhs LHsSigWcType GhcPs
hsSigWcType) =
      ( (\Located RdrName
n -> SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc Located RdrName
n Located RdrName
clsName (LHsSigWcType GhcPs -> GhcTagKind
GtkTypeSignature LHsSigWcType GhcPs
hsSigWcType))
      (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn )
      (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [LIdP GhcPs]
[GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
lhs
    mkClsMemberTags SrcSpan
decLoc Located RdrName
clsName (PatSynSig XPatSynSig GhcPs
_ [LIdP GhcPs]
lhs LHsSigType GhcPs
_) =
      ( (\Located RdrName
n -> SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc Located RdrName
n Located RdrName
clsName GhcTagKind
GtkPatternSynonym)
      (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn )
      (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [LIdP GhcPs]
[GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
lhs
    mkClsMemberTags SrcSpan
decLoc Located RdrName
clsName (ClassOpSig XClassOpSig GhcPs
_ Bool
_ [LIdP GhcPs]
lhs (L SrcSpanAnnA
_ HsSigType GhcPs
hsType)) =
      ( (\Located RdrName
n -> SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc Located RdrName
n Located RdrName
clsName
                                (HsType GhcPs -> GhcTagKind
GtkTypeClassMember (HsType GhcPs -> GhcTagKind) -> HsType GhcPs -> GhcTagKind
forall a b. (a -> b) -> a -> b
$ HsSigType GhcPs -> HsType GhcPs
hsSigTypeToHsType HsSigType GhcPs
hsType))
      (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn )
     (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [LIdP GhcPs]
[GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
lhs
    mkClsMemberTags SrcSpan
_ Located RdrName
_ Sig GhcPs
_ = []


    mkSigTags :: SrcSpan -> Sig GhcPs -> GhcTags
    mkSigTags :: SrcSpan -> Sig GhcPs -> GhcTags
mkSigTags SrcSpan
decLoc (TypeSig   XTypeSig GhcPs
_ [LIdP GhcPs]
lhs LHsSigWcType GhcPs
hsSigWcType)
                                       = ( (Located RdrName -> GhcTagKind -> GhcTag)
-> GhcTagKind -> Located RdrName -> GhcTag
forall a b c. (a -> b -> c) -> b -> a -> c
flip (SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc)
                                                (LHsSigWcType GhcPs -> GhcTagKind
GtkTypeSignature LHsSigWcType GhcPs
hsSigWcType)
                                         (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn )
                                         (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [LIdP GhcPs]
[GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
lhs
    mkSigTags SrcSpan
decLoc (PatSynSig XPatSynSig GhcPs
_ [LIdP GhcPs]
lhs LHsSigType GhcPs
_)
                                       = ( (Located RdrName -> GhcTagKind -> GhcTag)
-> GhcTagKind -> Located RdrName -> GhcTag
forall a b c. (a -> b -> c) -> b -> a -> c
flip (SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc) GhcTagKind
GtkPatternSynonym
                                         (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn )
                                         (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [LIdP GhcPs]
[GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
lhs
    mkSigTags SrcSpan
decLoc (ClassOpSig XClassOpSig GhcPs
_ Bool
_ [LIdP GhcPs]
lhs (L SrcSpanAnnA
_ HsSigType GhcPs
hsType))
                                       = ( (Located RdrName -> GhcTagKind -> GhcTag)
-> GhcTagKind -> Located RdrName -> GhcTag
forall a b c. (a -> b -> c) -> b -> a -> c
flip (SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc)
                                                ( HsType GhcPs -> GhcTagKind
GtkTypeClassMember
                                                (HsType GhcPs -> GhcTagKind) -> HsType GhcPs -> GhcTagKind
forall a b. (a -> b) -> a -> b
$ HsSigType GhcPs -> HsType GhcPs
hsSigTypeToHsType HsSigType GhcPs
hsType )
                                         (Located RdrName -> GhcTag)
-> (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
    -> Located RdrName)
-> GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
-> GhcTag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn
                                         )
                                         (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> GhcTag)
-> [GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName] -> GhcTags
forall a b. (a -> b) -> [a] -> [b]
`map` [LIdP GhcPs]
[GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName]
lhs
#if !MIN_VERSION_GHC(9,6)
    mkSigTags _ IdSig {}               = []
#endif
    -- TODO: generate theses with additional info (fixity)
    mkSigTags SrcSpan
_ FixSig {}              = []
    mkSigTags SrcSpan
_ InlineSig {}           = []
    -- SPECIALISE pragmas
    mkSigTags SrcSpan
_ SpecSig {}             = []
    mkSigTags SrcSpan
_ SpecInstSig {}         = []
    -- MINIMAL pragma
    mkSigTags SrcSpan
_ MinimalSig {}          = []
    -- SSC pragma
    mkSigTags SrcSpan
_ SCCFunSig {}           = []
    -- COMPLETE pragma
    mkSigTags SrcSpan
_ CompleteMatchSig {}    = []


    mkFamilyDeclTags :: SrcSpan
                     -> FamilyDecl GhcPs
                     -- ^ declaration's 'SrcSpan'
                     -> Maybe (Located RdrName)
                     -- if this type family is associate, pass the name of the
                     -- associated class
                     -> Maybe GhcTag
    mkFamilyDeclTags :: SrcSpan
-> FamilyDecl GhcPs -> Maybe (Located RdrName) -> Maybe GhcTag
mkFamilyDeclTags SrcSpan
decLoc FamilyDecl { LIdP GhcPs
fdLName :: LIdP GhcPs
fdLName :: forall pass. FamilyDecl pass -> LIdP pass
fdLName, FamilyInfo GhcPs
fdInfo :: FamilyInfo GhcPs
fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
fdInfo, LHsQTyVars GhcPs
fdTyVars :: LHsQTyVars GhcPs
fdTyVars :: forall pass. FamilyDecl pass -> LHsQTyVars pass
fdTyVars, fdResultSig :: forall pass. FamilyDecl pass -> LFamilyResultSig pass
fdResultSig = L SrcAnn NoEpAnns
_ FamilyResultSig GhcPs
familyResultSig } Maybe (Located RdrName)
assocClsName =
      case Maybe (Located RdrName)
assocClsName of
        Maybe (Located RdrName)
Nothing      -> GhcTag -> Maybe GhcTag
forall a. a -> Maybe a
Just (GhcTag -> Maybe GhcTag) -> GhcTag -> Maybe GhcTag
forall a b. (a -> b) -> a -> b
$ SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
fdLName) GhcTagKind
tk
        Just Located RdrName
clsName -> GhcTag -> Maybe GhcTag
forall a. a -> Maybe a
Just (GhcTag -> Maybe GhcTag) -> GhcTag -> Maybe GhcTag
forall a b. (a -> b) -> a -> b
$ SrcSpan
-> Located RdrName -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTagForMember SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
fdLName) Located RdrName
clsName GhcTagKind
tk
      where

        mb_fdvars :: Maybe [GhcPsHsTyVarBndr]
        mb_fdvars :: Maybe [GhcPsHsTyVarBndr]
mb_fdvars = case LHsQTyVars GhcPs
fdTyVars of
#if MIN_VERSION_GHC(9,8)
          HsQTvs {} -> Nothing
#else
          HsQTvs { [LHsTyVarBndr () GhcPs]
hsq_explicit :: [LHsTyVarBndr () GhcPs]
hsq_explicit :: forall pass. LHsQTyVars pass -> [LHsTyVarBndr () pass]
hsq_explicit } -> [GhcPsHsTyVarBndr] -> Maybe [GhcPsHsTyVarBndr]
forall a. a -> Maybe a
Just ([GhcPsHsTyVarBndr] -> Maybe [GhcPsHsTyVarBndr])
-> [GhcPsHsTyVarBndr] -> Maybe [GhcPsHsTyVarBndr]
forall a b. (a -> b) -> a -> b
$ GenLocated SrcSpanAnnA GhcPsHsTyVarBndr -> GhcPsHsTyVarBndr
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnA GhcPsHsTyVarBndr -> GhcPsHsTyVarBndr)
-> [GenLocated SrcSpanAnnA GhcPsHsTyVarBndr] -> [GhcPsHsTyVarBndr]
forall a b. (a -> b) -> [a] -> [b]
`map` [LHsTyVarBndr () GhcPs]
[GenLocated SrcSpanAnnA GhcPsHsTyVarBndr]
hsq_explicit
#endif
        mb_resultsig :: Maybe (Either (HsKind GhcPs) GhcPsHsTyVarBndr)
        mb_resultsig :: Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
mb_resultsig = FamilyResultSig GhcPs
-> Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
famResultKindSignature FamilyResultSig GhcPs
familyResultSig

        mb_typesig :: Maybe ([GhcPsHsTyVarBndr], Either (HsKind GhcPs) GhcPsHsTyVarBndr)
        mb_typesig :: Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
mb_typesig = (,) ([GhcPsHsTyVarBndr]
 -> Either (HsType GhcPs) GhcPsHsTyVarBndr
 -> ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr))
-> Maybe [GhcPsHsTyVarBndr]
-> Maybe
     (Either (HsType GhcPs) GhcPsHsTyVarBndr
      -> ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe [GhcPsHsTyVarBndr]
mb_fdvars Maybe
  (Either (HsType GhcPs) GhcPsHsTyVarBndr
   -> ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr))
-> Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
-> Maybe
     ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
mb_resultsig

        tk :: GhcTagKind
tk = case FamilyInfo GhcPs
fdInfo of
              FamilyInfo GhcPs
DataFamily           -> Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
-> GhcTagKind
GtkDataTypeFamily Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
mb_typesig
              FamilyInfo GhcPs
OpenTypeFamily       -> Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
-> GhcTagKind
GtkTypeFamily     Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
mb_typesig
              ClosedTypeFamily {}  -> Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
-> GhcTagKind
GtkTypeFamily     Maybe ([GhcPsHsTyVarBndr], Either (HsType GhcPs) GhcPsHsTyVarBndr)
mb_typesig


    -- used to generate tag of an instance declaration
    mkLHsTypeTag :: SrcSpan
                 -- declaration's 'SrcSpan'
                 -> LHsType GhcPs
                 -> Maybe GhcTag
    mkLHsTypeTag :: SrcSpan -> LHsType GhcPs -> Maybe GhcTag
mkLHsTypeTag SrcSpan
decLoc (L SrcSpanAnnA
_ HsType GhcPs
hsType) =
      (\Located RdrName
a -> SrcSpan -> GhcTag -> GhcTag
fixLoc SrcSpan
decLoc (GhcTag -> GhcTag) -> GhcTag -> GhcTag
forall a b. (a -> b) -> a -> b
$ Located RdrName -> GhcTagKind -> Bool -> GhcTag
mkGhcTag Located RdrName
a (HsType GhcPs -> GhcTagKind
GtkTypeClassInstance HsType GhcPs
hsType) Bool
True)
      (Located RdrName -> GhcTag)
-> Maybe (Located RdrName) -> Maybe GhcTag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName HsType GhcPs
hsType


    hsTypeTagName :: HsType GhcPs -> Maybe (Located RdrName)
    hsTypeTagName :: HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName HsType GhcPs
hsType =
      case HsType GhcPs
hsType of
        HsForAllTy {LHsType GhcPs
hst_body :: LHsType GhcPs
hst_body :: forall pass. HsType pass -> LHsType pass
hst_body} -> HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
hst_body)

        HsQualTy {LHsType GhcPs
hst_body :: forall pass. HsType pass -> LHsType pass
hst_body :: LHsType GhcPs
hst_body}   -> HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
hst_body)

        HsTyVar XTyVar GhcPs
_ PromotionFlag
_ LIdP GhcPs
a         -> Located RdrName -> Maybe (Located RdrName)
forall a. a -> Maybe a
Just (Located RdrName -> Maybe (Located RdrName))
-> Located RdrName -> Maybe (Located RdrName)
forall a b. (a -> b) -> a -> b
$ GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
a

        HsAppTy XAppTy GhcPs
_ LHsType GhcPs
a LHsType GhcPs
_         -> HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
a)
        HsOpTy XOpTy GhcPs
_ PromotionFlag
_ LHsType GhcPs
_ LIdP GhcPs
a LHsType GhcPs
_      -> Located RdrName -> Maybe (Located RdrName)
forall a. a -> Maybe a
Just (Located RdrName -> Maybe (Located RdrName))
-> Located RdrName -> Maybe (Located RdrName)
forall a b. (a -> b) -> a -> b
$ GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
a
        HsKindSig XKindSig GhcPs
_ LHsType GhcPs
a LHsType GhcPs
_       -> HsType GhcPs -> Maybe (Located RdrName)
hsTypeTagName (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
a)

        HsType GhcPs
_                     -> Maybe (Located RdrName)
forall a. Maybe a
Nothing


    -- data family instance declaration
    --
    mkDataFamInstDeclTag :: SrcSpan -> DataFamInstDecl GhcPs -> GhcTags
    mkDataFamInstDeclTag :: SrcSpan -> DataFamInstDecl GhcPs -> GhcTags
mkDataFamInstDeclTag SrcSpan
decLoc DataFamInstDecl { FamEqn GhcPs (HsDataDefn GhcPs)
dfid_eqn :: FamEqn GhcPs (HsDataDefn GhcPs)
dfid_eqn :: forall pass. DataFamInstDecl pass -> FamEqn pass (HsDataDefn pass)
dfid_eqn } =
      case FamEqn GhcPs (HsDataDefn GhcPs)
dfid_eqn of

        FamEqn { LIdP GhcPs
feqn_tycon :: LIdP GhcPs
feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
feqn_tycon, HsDataDefn GhcPs
feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
feqn_rhs :: HsDataDefn GhcPs
feqn_rhs } ->
          case HsDataDefn GhcPs
feqn_rhs of
            HsDataDefn { DataDefnCons (LConDecl GhcPs)
dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
dd_cons :: DataDefnCons (LConDecl GhcPs)
dd_cons, Maybe (LHsType GhcPs)
dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_kindSig :: Maybe (LHsType GhcPs)
dd_kindSig } ->
                SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
feqn_tycon)
                          (Maybe (HsType GhcPs) -> GhcTagKind
GtkDataTypeFamilyInstance
                            (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs)
-> Maybe (GenLocated SrcSpanAnnA (HsType GhcPs))
-> Maybe (HsType GhcPs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (LHsType GhcPs)
Maybe (GenLocated SrcSpanAnnA (HsType GhcPs))
dd_kindSig))
              GhcTag -> GhcTags -> GhcTags
forall a. a -> [a] -> [a]
: (SrcSpan -> Located RdrName -> ConDecl GhcPs -> GhcTags
mkConsTags SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
feqn_tycon) (ConDecl GhcPs -> GhcTags)
-> (GenLocated SrcSpanAnnA (ConDecl GhcPs) -> ConDecl GhcPs)
-> GenLocated SrcSpanAnnA (ConDecl GhcPs)
-> GhcTags
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (ConDecl GhcPs) -> ConDecl GhcPs
forall l e. GenLocated l e -> e
unLoc)
                (GenLocated SrcSpanAnnA (ConDecl GhcPs) -> GhcTags)
-> DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs)) -> GhcTags
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
`concatMap` DataDefnCons (LConDecl GhcPs)
DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
dd_cons


    -- type family instance declaration
    --
    mkTyFamInstDeclTag :: SrcSpan -> TyFamInstDecl GhcPs -> Maybe GhcTag
    mkTyFamInstDeclTag :: SrcSpan -> TyFamInstDecl GhcPs -> Maybe GhcTag
mkTyFamInstDeclTag SrcSpan
decLoc decl :: TyFamInstDecl GhcPs
decl@TyFamInstDecl { TyFamInstEqn GhcPs
tfid_eqn :: forall pass. TyFamInstDecl pass -> TyFamInstEqn pass
tfid_eqn :: TyFamInstEqn GhcPs
tfid_eqn } =
      case TyFamInstEqn GhcPs
tfid_eqn of

        -- TODO: should we check @feqn_rhs :: LHsType GhcPs@ as well?
        FamEqn { LIdP GhcPs
feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
feqn_tycon :: LIdP GhcPs
feqn_tycon } ->
          GhcTag -> Maybe GhcTag
forall a. a -> Maybe a
Just (GhcTag -> Maybe GhcTag) -> GhcTag -> Maybe GhcTag
forall a b. (a -> b) -> a -> b
$ SrcSpan -> Located RdrName -> GhcTagKind -> GhcTag
mkGhcTag' SrcSpan
decLoc (GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName -> Located RdrName
forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn LIdP GhcPs
GenLocated (SrcSpanAnn' (EpAnn NameAnn)) RdrName
feqn_tycon) (Maybe (TyFamInstDecl GhcPs) -> GhcTagKind
GtkTypeFamilyInstance (TyFamInstDecl GhcPs -> Maybe (TyFamInstDecl GhcPs)
forall a. a -> Maybe a
Just TyFamInstDecl GhcPs
decl))

unSpanAnn :: GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn :: forall x. GenLocated (SrcSpanAnn' x) RdrName -> Located RdrName
unSpanAnn (L SrcSpanAnn' x
s RdrName
a) = SrcSpan -> RdrName -> Located RdrName
forall l e. l -> e -> GenLocated l e
L (SrcSpanAnn' x -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' x
s) RdrName
a

locAnn :: SrcSpanAnn' a -> SrcSpan
locAnn :: forall a. SrcSpanAnn' a -> SrcSpan
locAnn = SrcSpanAnn' a -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA

hsSigTypeToHsType :: HsSigType GhcPs -> HsType GhcPs
hsSigTypeToHsType :: HsSigType GhcPs -> HsType GhcPs
hsSigTypeToHsType = GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs)
-> (HsSigType GhcPs -> GenLocated SrcSpanAnnA (HsType GhcPs))
-> HsSigType GhcPs
-> HsType GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsSigType GhcPs -> LHsType GhcPs
HsSigType GhcPs -> GenLocated SrcSpanAnnA (HsType GhcPs)
forall pass. HsSigType pass -> LHsType pass
sig_body

--
--
--

famResultKindSignature :: FamilyResultSig GhcPs
                       -> Maybe (Either (HsKind GhcPs) GhcPsHsTyVarBndr)
famResultKindSignature :: FamilyResultSig GhcPs
-> Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
famResultKindSignature (NoSig XNoSig GhcPs
_)           = Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
forall a. Maybe a
Nothing
famResultKindSignature (KindSig XCKindSig GhcPs
_ LHsType GhcPs
ki)      = Either (HsType GhcPs) GhcPsHsTyVarBndr
-> Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
forall a. a -> Maybe a
Just (HsType GhcPs -> Either (HsType GhcPs) GhcPsHsTyVarBndr
forall a b. a -> Either a b
Left (GenLocated SrcSpanAnnA (HsType GhcPs) -> HsType GhcPs
forall l e. GenLocated l e -> e
unLoc LHsType GhcPs
GenLocated SrcSpanAnnA (HsType GhcPs)
ki))
famResultKindSignature (TyVarSig XTyVarSig GhcPs
_ LHsTyVarBndr () GhcPs
bndr)   = Either (HsType GhcPs) GhcPsHsTyVarBndr
-> Maybe (Either (HsType GhcPs) GhcPsHsTyVarBndr)
forall a. a -> Maybe a
Just (GhcPsHsTyVarBndr -> Either (HsType GhcPs) GhcPsHsTyVarBndr
forall a b. b -> Either a b
Right (GenLocated SrcSpanAnnA GhcPsHsTyVarBndr -> GhcPsHsTyVarBndr
forall l e. GenLocated l e -> e
unLoc LHsTyVarBndr () GhcPs
GenLocated SrcSpanAnnA GhcPsHsTyVarBndr
bndr))