Some source transformations need to refer to entities defined in the Prelude or other standard library modules.
module PFE_StdNames where
import List(intersect)
import TypedIds(NameSpace(..),namespace)
import HsConstants(mod_Prelude,mod_Ix)
import PFE0(allModules)
import PFE2(getExports)
import TiNames(topName)
import ScopeModule(origName)
import HasBaseName(getBaseName)
import HsIdent(HsIdentI(..))
import SourceNames(fakeSN)
import Relations(applyRel)
import WorkModule(Ent(..))
import PrettyPrint(pp,(<+>),(<>))
import MUtils(( # ))
stdValue stdName m n = stdName ValueNames (m,n)
prelValue stdName = stdValue stdName mod_Prelude
getPrelValue n = getStdValue mod_Prelude n
getStdValue m n =
do stdName <- getStdNames
stdValue stdName m n
getStdNames =
--pfe4 $
do allms <- allModules
stdNames . prune # getExports (Just (stdms `intersect` allms))
where
prune = filter ((`elem` stdms).fst)
stdms = [mod_Prelude,mod_Ix]
stdNames es ns (m,n) = maybe merr (find n . snd) (lookup m es)
where
merr = fail $ pp $ "Standard library module not avaialble:"<+>m
find n exprel =
case filter ((==ns).namespace) $ applyRel exprel (fakeSN n) of
[e] -> return (ent2pnt e)
[] -> fail $ pp $ "Standard entity not avaialble:"<+>m<>"."<>n
_ -> fail $ pp $ "Standard entity is ambiguous:"<+>m<>"."<>n
ent2pnt (Ent m (HsCon i) t) = HsCon (topName Nothing m (bn i) (origt m t))
ent2pnt (Ent m (HsVar i) t) = HsVar (topName Nothing m (bn i) (origt m t))
bn i = getBaseName i
origt m = fmap (osub m)
osub m n = origName n m n