packages feed

htags-1.0.1: src/GenTags.hs

module GenTags
  ( modToTags
  ) where

import Language.Haskell.Syntax
import Tag
import ExCommand
import Data.Monoid
import Control.Applicative

--
-- HsModule Helpers
--

decls :: HsModule -> [HsDecl]
decls (HsModule _ _ _ _ a) = a

--
-- (HsModule -> Tag) Helpers
--

l :: SrcLoc -> HsName -> Tag
l loc = \n -> tag (nToStr n) (srcFilename loc) (ziffy loc)
  where
    ziffy :: SrcLoc -> ExCommand
    ziffy = exGotoLine . srcLine
    nToStr :: HsName -> String
    nToStr (HsIdent s) = s
    nToStr (HsSymbol s) = s

z :: SrcLoc -> [HsName] -> [Tag]
z = fmap . l

f :: SrcLoc -> HsName -> [Tag]
f = (fmap.fmap) pure l

--
-- (HsModule -> Tag)
--

modToTags :: HsModule -> [Tag]
modToTags = declsToTags . decls

declsToTags ::  [HsDecl] -> [Tag]
declsToTags = concatMap declToTags

declToTags :: HsDecl -> [Tag]
declToTags (HsTypeDecl    loc name _ _)            = f loc name
declToTags (HsDataDecl    loc _ name _ condecls _) = f loc name `mappend` concatMap cdToTags condecls
declToTags (HsNewTypeDecl loc _ name _ condecl _)  = f loc name `mappend` cdToTags condecl
declToTags (HsClassDecl   loc _ name _ decls)      = f loc name `mappend` declsToTags decls
declToTags (HsTypeSig     loc names _)             = z loc names
declToTags _                                       = mempty

cdToTags :: HsConDecl -> [Tag]
cdToTags (HsConDecl loc name _)    = f loc name
cdToTags (HsRecDecl loc name recs) = f loc name `mappend` z loc (concatMap fst recs)