% % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[HsImpExp]{Abstract syntax: imports, exports, interfaces} \begin{code} module HsImpExp where #include "HsVersions.h" import Module ( Module ) import Outputable import FastString import SrcLoc ( Located(..) ) import Char ( isAlpha ) \end{code} %************************************************************************ %* * \subsection{Import and export declaration lists} %* * %************************************************************************ One per \tr{import} declaration in a module. \begin{code} type LImportDecl name = Located (ImportDecl name) data ImportDecl name = ImportDecl (Located Module) -- module name Bool -- True <=> {-# SOURCE #-} import Bool -- True => qualified (Maybe Module) -- as Module (Maybe (Bool, [LIE name])) -- (True => hiding, names) \end{code} \begin{code} instance (Outputable name) => Outputable (ImportDecl name) where ppr (ImportDecl mod from qual as spec) = hang (hsep [ptext SLIT("import"), ppr_imp from, pp_qual qual, ppr mod, pp_as as]) 4 (pp_spec spec) where pp_qual False = empty pp_qual True = ptext SLIT("qualified") pp_as Nothing = empty pp_as (Just a) = ptext SLIT("as ") <+> ppr a ppr_imp True = ptext SLIT("{-# SOURCE #-}") ppr_imp False = empty pp_spec Nothing = empty pp_spec (Just (False, spec)) = parens (interpp'SP spec) pp_spec (Just (True, spec)) = ptext SLIT("hiding") <+> parens (interpp'SP spec) ideclName (ImportDecl mod_nm _ _ _ _) = mod_nm \end{code} %************************************************************************ %* * \subsection{Imported and exported entities} %* * %************************************************************************ \begin{code} type LIE name = Located (IE name) data IE name = IEVar name | IEThingAbs name -- Class/Type (can't tell) | IEThingAll name -- Class/Type plus all methods/constructors | IEThingWith name [name] -- Class/Type plus some methods/constructors | IEModuleContents Module -- (Export Only) \end{code} \begin{code} ieName :: IE name -> name ieName (IEVar n) = n ieName (IEThingAbs n) = n ieName (IEThingWith n _) = n ieName (IEThingAll n) = n ieNames :: IE a -> [a] ieNames (IEVar n ) = [n] ieNames (IEThingAbs n ) = [n] ieNames (IEThingAll n ) = [n] ieNames (IEThingWith n ns) = n:ns ieNames (IEModuleContents _ ) = [] \end{code} \begin{code} instance (Outputable name) => Outputable (IE name) where ppr (IEVar var) = pprHsVar var ppr (IEThingAbs thing) = ppr thing ppr (IEThingAll thing) = hcat [ppr thing, text "(..)"] ppr (IEThingWith thing withs) = ppr thing <> parens (fsep (punctuate comma (map pprHsVar withs))) ppr (IEModuleContents mod) = ptext SLIT("module") <+> ppr mod \end{code} \begin{code} pprHsVar :: Outputable name => name -> SDoc pprHsVar v | isOperator ppr_v = parens ppr_v | otherwise = ppr_v where ppr_v = ppr v isOperator :: SDoc -> Bool isOperator ppr_v = case showSDocUnqual ppr_v of ('(':s) -> False -- (), (,) etc ('[':s) -> False -- [] ('$':c:s) -> not (isAlpha c) -- Don't treat $d as an operator (':':c:s) -> not (isAlpha c) -- Don't treat :T as an operator ('_':s) -> False -- Not an operator (c:s) -> not (isAlpha c) -- Starts with non-alpha other -> False -- We use (showSDoc (ppr v)), rather than isSymOcc (getOccName v) simply so -- that we don't need NamedThing in the context of all these functions. -- Gruesome, but simple. \end{code}