HaRe-0.6: tools/base/Modules/AST4ModSys.hs
module AST4ModSys where
import qualified HsModule as Hs
import HsModuleMaps()
import HsIdent(getHSName)
import qualified Ents (Ent(Ent))
import DefinedNames(DefinedNames(definedNames))
--import TypedIds (NameSpace(..))
import Relations
import Names
import ModSysAST
import HasBaseName
import Products((><))
-- added by Huiqing Li
import UniqueNames
import PNT
import Maybe
import SourceNames
import SrcLoc1
import HsName hiding (ModuleName)
import HsIdent
import PosName
-------------------------
--toMod :: DefinedNames QName ds => Hs.HsModuleI QName ds -> Module
toMod (Hs.HsModule s m exp imps ds)
= Module {
modName = getBaseName m,
modExpList = map toExpListEntry `fmap` exp,
modImports = toImport `map` imps,
modDefines = listToRel (toEnt `map` defs)
}
where
defs = map (fmap getQualified >< fmap getQualified)
$ definedNames ds
toEnt (x,y) = (getHSName x,Ents.Ent (getBaseName m) x y)
-- exports
--toExpListEntry :: Hs.HsExportSpecI QName -> ExpListEntry
toExpListEntry x =
case x of
Hs.EntE i -> EntExp (toEnt getQualified i)
Hs.ModuleE m -> ModuleExp (getBaseName m)
-- imports
--toImport :: Hs.HsImportDeclI QName -> Import
toImport (Hs.HsImportDecl _ m qualified as spec)
= Import {
impSource = getBaseName m,
impQualified = qualified,
impAs = getBaseName (maybe m id as),
impHiding = hiding,
impList = xs
}
where
(hiding, xs) = cvt spec
cvt Nothing = (True, [])
cvt (Just (hiding,specs)) = (hiding, toImpListEntry `map` specs)
--toImpListEntry :: Hs.HsImportSpecI QName -> EntSpec Name
toImpListEntry = toEnt id . fmap f
where
f = getQualified -- or perhaps signal an error if something is qualified?
--toEnt :: Hs.EntSpec i -> EntSpec i
toEnt unq x =
case x of
Hs.Var i -> Ent i Nothing
Hs.Abs i -> Ent i Nothing
Hs.AllSubs i -> Ent i (Just AllSubs)
Hs.ListSubs i js -> Ent i (Just $ Subs (map (unq.getHSName) js))
------- Added by Huiqing Li -----------------
-- imports
toImport' :: Hs.HsImportDeclI ModName PNT -> Import
toImport' (Hs.HsImportDecl _ m qualified as spec)
= Import {
impSource = m,
impQualified = qualified,
impAs = maybe m id as,
impHiding = hiding,
impList = xs
}
where
(hiding, xs) = cvt spec
cvt Nothing = (True, [])
cvt (Just (hiding,specs)) = (hiding, toImpListEntry' `map` specs)
pNTtoName=hsNameToName.pNTtoHsName
pNTtoHsName::PNT->QName
pNTtoHsName (PNT pn@(PN i orig) _ _)
= let loc=(fromMaybe loc0 . optLoc') pn
in (SN i loc)
where
optLoc' (PN i o)
= case o of
G m n (N optp) -> optp
-- I m p -> Just p
S p -> Just p
D n (N optp) -> optp
_ -> Nothing
hsNameToName::QName ->Names.Name
hsNameToName (SN (Qual _ id) l) =(SN id l)
hsNameToName (SN (UnQual id) l) =(SN id l)
hsIdentToHsName (HsVar pnt) =pNTtoHsName pnt
hsIdentToHsName (HsCon pnt) =pNTtoHsName pnt
toImpListEntry' :: Hs.HsImportSpecI PNT -> EntSpec Name
toImpListEntry' = toEnt' pNTtoName. fmap f
where
f = getQualified -- or perhaps signal an error if something is qualified?
--toEnt :: Hs.EntSpec i -> EntSpec i
toEnt' unq x =
case x of
Hs.Var i -> Ent (pNTtoName i) Nothing
Hs.Abs i -> Ent (pNTtoName i) Nothing
Hs.AllSubs i -> Ent (pNTtoName i) (Just AllSubs)
Hs.ListSubs i js -> Ent (pNTtoName i) (Just $ Subs (map (hsNameToName.hsIdentToHsName) js))
toExpListEntry' :: Hs.HsExportSpecI (PosName.ModuleName) PNT ->ExpListEntry
toExpListEntry' x =
case x of
Hs.EntE i -> EntExp (toEnt getQualified (fmap pNTtoHsName i))
Hs.ModuleE (SN m _) -> ModuleExp m