@@ -58,7 +58,8 @@ import qualified GHC.Types.Var as GHC (ForAllTyFlag(..), Specificity(..))
5858#else
5959import qualified GHC.Types.Var as GHC (ArgFlag (.. ), Specificity (.. ))
6060#endif
61- import GHC.Unit.Types (unitFS )
61+ import qualified GHC.Unit.Types as GHC
62+ import qualified GHC.Types.Unique.Set as GHC (mkUniqSet , elementOfUniqSet )
6263#if !MIN_VERSION_ghc(9,6,0)
6364import qualified GHC.Unit.Module.Name as GHC (moduleNameFS )
6465#endif
@@ -71,6 +72,7 @@ import Glean.Impl.ConfigProvider ()
7172import qualified Glean.Schema.Hs.Types as Hs
7273import qualified Glean.Schema.Src.Types as Src
7374import Glean.Util.Range
75+ import HieIndexer.Options
7476
7577{- TODO
7678
@@ -96,6 +98,12 @@ import Glean.Util.Range
9698 Haddock's Interface type has all the ASTs for the declarations
9799 in addition to the Hie.
98100
101+ - imports
102+ - import refs contain only ModuleName, not Module. This means we can't
103+ resolve imports to the correct file for module names that occur in
104+ multiple packages.
105+ - modules in the export list should be refs
106+
99107- map Name to exportedness?
100108
101109- exclude generated names in a cleaner way
@@ -108,15 +116,31 @@ import Glean.Util.Range
108116 - Haddock docs for symbol
109117-}
110118
111- mkModule :: Glean. NewFact m => GHC. Module -> m Hs. Module
112- mkModule mod = do
119+ mkModule :: Glean. NewFact m => GHC. Module -> UnitName -> m Hs. Module
120+ mkModule mod unit = do
113121 modname <- Glean. makeFact @ Hs. ModuleName $
114122 fsToText (GHC. moduleNameFS (GHC. moduleName mod ))
115123 unitname <- Glean. makeFact @ Hs. UnitName $
116- fsToText (unitFS ( GHC. moduleUnit mod ))
124+ toUnitName unit $ GHC. moduleUnit mod
117125 Glean. makeFact @ Hs. Module $
118126 Hs. Module_key modname unitname
119127
128+ toUnitName :: UnitName -> GHC. Unit -> Text
129+ toUnitName unitName u = case unitName of
130+ UnitKey -> t
131+ UnitId
132+ | isWiredInUnit u -> t
133+ | (id , _) <- Text. breakOnEnd " -" t, not (Text. null id ) -> Text. init id
134+ | otherwise -> t
135+ -- TODO: this is not right for local libraries, which have names like
136+ -- aeson-pretty-0.8.9-inplace-aeson
137+ where t = fsToText $ GHC. unitFS u
138+
139+ isWiredInUnit :: GHC. Unit -> Bool
140+ isWiredInUnit = \ u -> GHC. toUnitId u `GHC.elementOfUniqSet` wiredInUnitIds
141+ where
142+ wiredInUnitIds = GHC. mkUniqSet GHC. wiredInUnitIds
143+
120144mkName :: Glean. NewFact m => GHC. Name -> Hs. Module -> Hs. NameSort -> m Hs. Name
121145mkName name mod sort = do
122146 let occ = nameOccName name
@@ -254,9 +278,10 @@ nat = Glean.toNat . fromIntegral
254278
255279indexTypes
256280 :: forall m . (MonadFail m , Monad m , Glean. NewFact m )
257- => A. Array TypeIndex HieTypeFlat
281+ => UnitName
282+ -> A. Array TypeIndex HieTypeFlat
258283 -> m (IntMap Hs. Type )
259- indexTypes typeArr = foldM go IntMap. empty (A. assocs typeArr)
284+ indexTypes unit typeArr = foldM go IntMap. empty (A. assocs typeArr)
260285 where
261286 go tymap (n,ty) = do
262287 fact <- mkTy ty
@@ -314,7 +339,7 @@ indexTypes typeArr = foldM go IntMap.empty (A.assocs typeArr)
314339 tcname <- case nameModule_maybe name of
315340 Nothing -> fail " HTyConApp: internal name"
316341 Just mod -> do
317- namemod <- mkModule mod
342+ namemod <- mkModule mod unit
318343 mkName name namemod (Hs. NameSort_external def)
319344 let sort = case GHC. ifaceTyConSort info of
320345 GHC. IfaceNormalTyCon -> Hs. TyConSort_normal def
@@ -347,25 +372,28 @@ indexTypes typeArr = foldM go IntMap.empty (A.assocs typeArr)
347372indexHieFile
348373 :: Glean. Writer
349374 -> NonEmpty Text
375+ -> Maybe Text
376+ -> UnitName
350377 -> FilePath
351378 -> HieFile
352379 -> IO ()
353- indexHieFile writer srcPaths path hie = do
380+ indexHieFile writer srcPaths srcPrefix unit path hie = do
354381 srcFile <- findSourceFile srcPaths (hie_module hie) (hie_hs_file hie)
355382 logInfo $ " Indexing: " <> path <> " (" <> srcFile <> " )"
356383 Glean. writeFacts writer $ do
357- modfact <- mkModule smod
384+ modfact <- mkModule smod unit
358385
359386 let offs = getLineOffsets (hie_hs_src hie)
360387 let hsFileFS = GHC. mkFastString $ hie_hs_file hie
361- filefact <- Glean. makeFact @ Src. File (Text. pack srcFile)
388+ let file = maybe id (\ p f -> (p <> " /" <> f)) srcPrefix (Text. pack srcFile)
389+ filefact <- Glean. makeFact @ Src. File file
362390 let fileLines = mkFileLines filefact offs
363391 Glean. makeFact_ @ Src. FileLines fileLines
364392
365393 Glean. makeFact_ @ Hs. ModuleSource $
366394 Hs. ModuleSource_key modfact filefact
367395
368- typeMap <- indexTypes (hie_types hie)
396+ typeMap <- indexTypes unit (hie_types hie)
369397
370398 let toByteRange = srcRangeToByteRange fileLines (hie_hs_src hie)
371399 toByteSpan sp
@@ -413,7 +441,7 @@ indexHieFile writer srcPaths path hie = do
413441 -- But it does happen, so let's not crash.
414442 return Nothing
415443 Just m -> do
416- mod <- if m == smod then return modfact else mkModule m
444+ mod <- if m == smod then return modfact else mkModule m unit
417445 Just <$> mkName name mod (Hs. NameSort_external def)
418446
419447 sigMap <- produceDeclInfo filefact toByteSpan getName declInfo
@@ -512,7 +540,7 @@ findSourceFile srcPaths mod src = do
512540 return src
513541 Just f -> return f
514542 where
515- pkg = fsToText (unitFS (GHC. moduleUnit mod ))
543+ pkg = fsToText (GHC. unitFS (GHC. moduleUnit mod ))
516544 isVer = Text. all (\ c -> isDigit c || c == ' .' )
517545 pkgNameAndVersion = case break isVer (Text. splitOn " -" pkg) of
518546 (before, after) -> Text. intercalate " -" (before <> take 1 after)
0 commit comments