on debug help sign in
61 lines 2.5 kB history raw
1module Development.IDE.Plugin.CodeAction.Rules
2 ( rulePackageExports
3 )
4where
6import Data.HashMap.Strict ( fromListWith )
7import Data.Text ( Text
8 , pack
9 )
10import Data.Traversable ( forM )
11import Development.IDE.Core.Rules
12import Development.IDE.GHC.Util
13import Development.IDE.Plugin.CodeAction.RuleTypes
14import Development.Shake
15import GHC ( DynFlags(pkgState) )
16import HscTypes ( IfaceExport
17 , hsc_dflags
18 , mi_exports
19 )
20import LoadIface
21import Maybes
22import Module ( Module(..)
23 , ModuleName
24 , moduleNameString
25 )
26import Packages ( explicitPackages
27 , exposedModules
28 , packageConfigId
29 )
30import TcRnMonad ( WhereFrom(ImportByUser)
31 , initIfaceLoad
32 )
34rulePackageExports :: Rules ()
35rulePackageExports = defineNoFile $ \(PackageExports session) -> do
36 let env = hscEnv session
37 pkgst = pkgState (hsc_dflags env)
38 depends = explicitPackages pkgst
39 targets =
40 [ (pkg, mn)
41 | d <- depends
42 , Just pkg <- [lookupPackageConfig d env]
43 , (mn, _) <- exposedModules pkg
44 ]
46 results <- forM targets $ \(pkg, mn) -> do
47 modIface <- liftIO $ initIfaceLoad env $ loadInterface
48 ""
49 (Module (packageConfigId pkg) mn)
50 (ImportByUser False)
51 case modIface of
52 Failed _err -> return mempty
53 Succeeded mi -> do
54 let avails = mi_exports mi
55 return $ concatMap (unpackAvail mn) avails
56 return $ fromListWith (++) $ concat results
58unpackAvail :: ModuleName -> IfaceExport -> [(Text, [(IdentInfo, Text)])]
59unpackAvail mod =
60 map (\id@IdentInfo {..} -> (name, [(id, pack $ moduleNameString mod)]))
61 . mkIdentInfos