@@ -5,6 +5,10 @@ module Development.IDE.Types.Exports
55(
66 IdentInfo (.. ),
77 ExportsMap (.. ),
8+ rendered,
9+ moduleNameText,
10+ occNameText,
11+ isDatacon,
812 createExportsMap,
913 createExportsMapMg,
1014 createExportsMapTc,
@@ -24,6 +28,7 @@ import Data.HashSet (HashSet)
2428import qualified Data.HashSet as Set
2529import Data.List (foldl' , isSuffixOf )
2630import Data.Text (Text , pack )
31+ import Data.Text.Encoding (decodeUtf8 )
2732import Development.IDE.GHC.Compat
2833import Development.IDE.GHC.Orphans ()
2934import Development.IDE.GHC.Util
@@ -61,55 +66,63 @@ instance Monoid ExportsMap where
6166type IdentifierText = Text
6267type ModuleNameText = Text
6368
69+
70+ rendered :: IdentInfo -> IdentifierText
71+ rendered = occNameText . name
72+
73+ -- | Render an identifier as imported or exported style.
74+ -- TODO: pattern synonymoccNameText :: OccName -> Text
75+ occNameText :: OccName -> IdentifierText
76+ occNameText name
77+ | isTcOcc name && isSymOcc name = " type " <> renderOcc
78+ | otherwise = renderOcc
79+ where
80+ renderOcc = decodeUtf8 . bytesFS . occNameFS $ name
81+
82+ moduleNameText :: IdentInfo -> ModuleNameText
83+ moduleNameText = moduleNameText' . identModuleName
84+
85+ moduleNameText' :: ModuleName -> ModuleNameText
86+ moduleNameText' = decodeUtf8 . bytesFS . moduleNameFS
87+
6488data IdentInfo = IdentInfo
65- { name :: ! OccName
66- , rendered :: Text
67- , parent :: ! (Maybe Text )
68- , isDatacon :: ! Bool
69- , moduleNameText :: ! Text
89+ { name :: ! OccName
90+ , parent :: ! (Maybe OccName )
91+ , identModuleName :: ! ModuleName
7092 }
7193 deriving (Generic , Show )
7294 deriving anyclass Hashable
7395
96+ isDatacon :: IdentInfo -> Bool
97+ isDatacon = isDataOcc . name
98+
7499instance Eq IdentInfo where
75100 a == b = name a == name b
76101 && parent a == parent b
77- && isDatacon a == isDatacon b
78- && moduleNameText a == moduleNameText b
102+ && identModuleName a == identModuleName b
79103
80104instance NFData IdentInfo where
81105 rnf IdentInfo {.. } =
82106 -- deliberately skip the rendered field
83- rnf name `seq` rnf parent `seq` rnf isDatacon `seq` rnf moduleNameText
84-
85- -- | Render an identifier as imported or exported style.
86- -- TODO: pattern synonym
87- renderIEWrapped :: Name -> Text
88- renderIEWrapped n
89- | isTcOcc occ && isSymOcc occ = " type " <> pack (printName n)
90- | otherwise = pack $ printName n
91- where
92- occ = occName n
107+ rnf name `seq` rnf parent `seq` rnf identModuleName
93108
94- mkIdentInfos :: Text -> AvailInfo -> [IdentInfo ]
109+ mkIdentInfos :: ModuleName -> AvailInfo -> [IdentInfo ]
95110mkIdentInfos mod (AvailName n) =
96- [IdentInfo (nameOccName n) (renderIEWrapped n) Nothing (isDataConName n) mod ]
111+ [IdentInfo (nameOccName n) Nothing mod ]
97112mkIdentInfos mod (AvailFL fl) =
98- [IdentInfo (nameOccName n) (renderIEWrapped n) Nothing (isDataConName n) mod ]
113+ [IdentInfo (nameOccName n) Nothing mod ]
99114 where
100115 n = flSelector fl
101116mkIdentInfos mod (AvailTC parent (n: nn) flds)
102117 -- Following the GHC convention that parent == n if parent is exported
103118 | n == parent
104- = [ IdentInfo (nameOccName n) (renderIEWrapped n) ( Just $! parentP) (isDataConName n ) mod
119+ = [ IdentInfo (nameOccName n) (Just $! nameOccName parent ) mod
105120 | n <- nn ++ map flSelector flds
106121 ] ++
107- [ IdentInfo (nameOccName n) (renderIEWrapped n) Nothing (isDataConName n) mod ]
108- where
109- parentP = pack $ printName parent
122+ [ IdentInfo (nameOccName n) Nothing mod ]
110123
111124mkIdentInfos mod (AvailTC _ nn flds)
112- = [ IdentInfo (nameOccName n) (renderIEWrapped n) Nothing (isDataConName n) mod
125+ = [ IdentInfo (nameOccName n) Nothing mod
113126 | n <- nn ++ map flSelector flds
114127 ]
115128
@@ -160,25 +173,20 @@ createExportsMapHieDb withHieDb = do
160173 mods <- withHieDb getAllIndexedMods
161174 idents <- forM (filter (nonInternalModules . modInfoName . hieModInfo) mods) $ \ m -> do
162175 let mn = modInfoName $ hieModInfo m
163- mText = pack $ moduleNameString mn
164- fmap (wrap . unwrap mText) <$> withHieDb (\ hieDb -> getExportsForModule hieDb mn)
176+ fmap (wrap . unwrap mn) <$> withHieDb (\ hieDb -> getExportsForModule hieDb mn)
165177 let exportsMap = Map. fromListWith (<>) (concat idents)
166- return $ ExportsMap exportsMap $ buildModuleExportMap (concat idents)
178+ return $! ExportsMap exportsMap $ buildModuleExportMap (concat idents)
167179 where
168180 wrap identInfo = (rendered identInfo, Set. fromList [identInfo])
169181 -- unwrap :: ExportRow -> IdentInfo
170- unwrap m ExportRow {.. } = IdentInfo exportName n p exportIsDatacon m
171- where
172- n = pack (occNameString exportName)
173- p = pack . occNameString <$> exportParent
182+ unwrap m ExportRow {.. } = IdentInfo exportName exportParent m
174183
175184unpackAvail :: ModuleName -> IfaceExport -> [(Text , Text , [IdentInfo ])]
176185unpackAvail mn
177- | nonInternalModules mn = map f . mkIdentInfos mod
186+ | nonInternalModules mn = map f . mkIdentInfos mn
178187 | otherwise = const []
179188 where
180- ! mod = pack $ moduleNameString mn
181- f id @ IdentInfo {.. } = (printOutputable name, moduleNameText,[id ])
189+ f id @ IdentInfo {.. } = (printOutputable name, moduleNameText id ,[id ])
182190
183191
184192identInfoToKeyVal :: IdentInfo -> (ModuleNameText , IdentInfo )
@@ -198,9 +206,9 @@ buildModuleExportMapFrom modIfaces = do
198206
199207extractModuleExports :: ModIface -> (Text , HashSet IdentInfo )
200208extractModuleExports modIFace = do
201- let modName = pack $ moduleNameString $ moduleName $ mi_module modIFace
209+ let modName = moduleName $ mi_module modIFace
202210 let functionSet = Set. fromList $ concatMap (mkIdentInfos modName) $ mi_exports modIFace
203- (modName, functionSet)
211+ (moduleNameText' modName, functionSet)
204212
205213sortAndGroup :: [(ModuleNameText , IdentInfo )] -> Map. HashMap ModuleNameText (HashSet IdentInfo )
206214sortAndGroup assocs = Map. fromListWith (<>) [(k, Set. fromList [v]) | (k, v) <- assocs]
0 commit comments