module Importify.Resolution.Explicit
( collectUnusedSymbolsBy
, resolveModules
, symbolUsedIn
) where
import Universum
import Data.Data (Data)
import qualified Data.Map.Strict as M
import Language.Haskell.Exts (Module, ModuleName (..))
import Language.Haskell.Names (NameInfo (Export, GlobalSymbol, RecPatWildcard),
Scoped, Symbol (..), resolve,
symbolModule)
import Language.Haskell.Names.GlobalSymbolTable (Table)
import Importify.Syntax (anyAnnotation)
symbolUsedIn :: Symbol -> [Scoped l] -> Bool
symbolUsedIn symbol = anyAnnotation used
where
used :: NameInfo l -> Bool
used (GlobalSymbol global@(Constructor smodule _sname stype) _) =
symbol == global ||
(symbolName symbol == stype && symbolModule symbol == smodule)
used (GlobalSymbol global@(Selector smodule _sname stype _scons) _) =
symbol == global ||
(symbolName symbol == stype && symbolModule symbol == smodule)
used (GlobalSymbol global _) = symbol == global
used (Export symbols) = symbol `elem` symbols
used (RecPatWildcard symbols) = symbol `elem` symbols
used _ = False
collectUnusedSymbolsBy
:: (Symbol -> Bool)
-> Table
-> [Symbol]
collectUnusedSymbolsBy isUsed table = do
(_, importedSymbols) <- M.toList table
symbol <- importedSymbols
guard $ not $ isUsed symbol
pure symbol
resolveModules :: (Data l, Eq l) => [Module l] -> [(ModuleName (), [Symbol])]
resolveModules modules = M.toList $ resolve modules mempty