{-# LANGUAGE TypeFamilies #-}
module Development.IDE.Plugin.CodeAction.RuleTypes
(PackageExports(..), PackageExportsMap
,IdentInfo(..)
,mkIdentInfos
) where
import Avail (AvailInfo(..))
import Data.Hashable (Hashable)
import Control.DeepSeq (NFData)
import Data.Binary (Binary)
import Data.Text (pack, Text)
import Development.IDE.GHC.Util
import Development.Shake (RuleResult)
import Data.HashMap.Strict (HashMap)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import Name
import FieldLabel (flSelector)
type Identifier = Text
type ModuleName = Text
data IdentInfo = IdentInfo
{ name :: !Identifier
, rendered :: Text
, parent :: !(Maybe Text)
, isDatacon :: !Bool
}
deriving (Eq, Generic, Show)
instance NFData IdentInfo
mkIdentInfos :: AvailInfo -> [IdentInfo]
mkIdentInfos (Avail n) =
[IdentInfo (pack (prettyPrint n)) (pack (printName n)) Nothing (isDataConName n)]
mkIdentInfos (AvailTC parent (n:nn) flds)
| n == parent
= [ IdentInfo (pack (prettyPrint n)) (pack (printName n)) (Just $! parentP) True
| n <- nn ++ map flSelector flds
] ++
[ IdentInfo (pack (prettyPrint n)) (pack (printName n)) Nothing False]
where
parentP = pack $ prettyPrint parent
mkIdentInfos (AvailTC _ nn flds)
= [ IdentInfo (pack (prettyPrint n)) (pack (printName n)) Nothing True
| n <- nn ++ map flSelector flds
]
type instance RuleResult PackageExports = PackageExportsMap
type PackageExportsMap = HashMap Identifier [(IdentInfo,ModuleName)]
newtype PackageExports = PackageExports HscEnvEq
deriving (Eq, Show, Typeable, Generic)
instance Hashable PackageExports
instance NFData PackageExports
instance Binary PackageExports