module HsModule(module HsModule,ModuleName(..)) where
import List(sort,nub)
import SrcLoc
import HsName(ModuleName(..))
import HsIdent(HsIdentI(..))
import HsConstants(mod_Prelude')
data HsModuleI m i ds
= HsModule { hsModSrcLoc :: SrcLoc,
hsModName :: m,
hsModExports :: Maybe [HsExportSpecI m i],
hsModImports :: [HsImportDeclI m i],
hsModDecls :: ds }
deriving (Eq, Show)
instance HasSrcLoc (HsModuleI m i ds) where srcLoc = hsModSrcLoc
data HsExportSpecI m i
= EntE (EntSpec i) -- only unqualified names allowed for i
| ModuleE m -- module M
deriving (Eq, Show)
data HsImportDeclI m i
= HsImportDecl SrcLoc m {-qualified-} Bool {-as-} (Maybe m)
(Maybe (ImpSpec i))
deriving (Eq, Show)
type ImpSpec i = ({-hiding-}Bool, [EntSpec i])
--hsImpFrom :: HsImportDecl -> ModuleName
hsImpFrom (HsImportDecl _ x _ _ _) = x
hsModImportsFrom m = sort . nub . map hsImpFrom . hsModImports $ m
type HsImportSpecI i = EntSpec i -- qualified names allowed for i
data EntSpec i
= Var i -- x (a variable identifier)
| Abs i -- T, C (or P-Logic assertion/predicate)
| AllSubs i -- T(..), C(..)
| ListSubs i [HsIdentI i] -- T(C_1, ..., C_n, f_1, ..., f_n)
-- C(m_1, ..., m_2)
deriving (Eq, Show)
exportVar = EntE . Var
--------------------------------------------------------------------------------
--Functions for making the implicit import of Prelude explicit:
optAddPrelude sn prel = if prel then addPrelude sn else id
addPrelude sn m@HsModule{hsModImports=is} = m{hsModImports=prelimps++is}
where
prelimps = prelqual:if sn mod_Prelude' `elem` map hsImpFrom is
then []
else [prelunqual]
prelqual = prel True
prelunqual = prel False
prel qual = HsImportDecl loc0 (sn mod_Prelude') qual Nothing Nothing