packages feed

typelet-0.1.0.0: src/TypeLet/Plugin/NameResolution.hs

module TypeLet.Plugin.NameResolution (
    ResolvedNames(..)
  , resolveNames
  ) where

import TypeLet.Plugin.GhcTcPluginAPI

data ResolvedNames = ResolvedNames {
      clsEqual :: Class
    , clsLet   :: Class
    }

instance Outputable ResolvedNames where
  ppr ResolvedNames{..} = vcat [
        text "ResolvedNames {"
      , nest 2 $ vcat [
            text "clsEqual =" <+> ppr clsEqual
          , text "clsLet   =" <+> ppr clsLet
          ]
      , text "}"
      ]

resolveNames :: TcPluginM 'Init ResolvedNames
resolveNames = do
    m <- do r <- findImportedModule typeletMod (Just typeletPkg)
            case r of
              Found _ m  -> return m
              _otherwise -> panic $ "Could not find "
                                 ++ showSDocUnsafe (ppr typeletMod)

    -- Constraints handled by the plugin

    clsEqual <- tcLookupClass =<< lookupOrig m (mkTcOcc "Equal")
    clsLet   <- tcLookupClass =<< lookupOrig m (mkTcOcc "Let")

    return ResolvedNames{..}
  where
    typeletMod :: ModuleName
    typeletMod = mkModuleName "TypeLet.UserAPI"

    typeletPkg :: FastString
    typeletPkg = fsLit "typelet"