%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 19921998
%
HsImpExp: Abstract syntax: imports, exports, interfaces
\begin{code}
module HsImpExp where
import Module ( ModuleName )
import HsDoc ( HsDocString )
import Outputable
import FastString
import SrcLoc ( Located(..) )
\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 {
ideclName :: Located ModuleName,
ideclPkgQual :: Maybe FastString,
ideclSource :: Bool,
ideclQualified :: Bool,
ideclAs :: Maybe ModuleName,
ideclHiding :: Maybe (Bool, [LIE name])
}
\end{code}
\begin{code}
instance (Outputable name) => Outputable (ImportDecl name) where
ppr (ImportDecl mod pkg from qual as spec)
= hang (hsep [ptext (sLit "import"), ppr_imp from,
pp_qual qual, pp_pkg pkg, ppr mod, pp_as as])
4 (pp_spec spec)
where
pp_pkg Nothing = empty
pp_pkg (Just p) = doubleQuotes (ftext p)
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, ies)) = ppr_ies ies
pp_spec (Just (True, ies)) = ptext (sLit "hiding") <+> ppr_ies ies
ppr_ies [] = ptext (sLit "()")
ppr_ies ies = char '(' <+> interpp'SP ies <+> char ')'
\end{code}
%************************************************************************
%* *
\subsection{Imported and exported entities}
%* *
%************************************************************************
\begin{code}
type LIE name = Located (IE name)
data IE name
= IEVar name
| IEThingAbs name
| IEThingAll name
| IEThingWith name [name]
| IEModuleContents ModuleName
| IEGroup Int HsDocString
| IEDoc HsDocString
| IEDocNamed String
\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 _ ) = []
ieNames (IEGroup _ _ ) = []
ieNames (IEDoc _ ) = []
ieNames (IEDocNamed _ ) = []
\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
ppr (IEGroup n _) = text ("<IEGroup: " ++ (show n) ++ ">")
ppr (IEDoc doc) = ppr doc
ppr (IEDocNamed string) = text ("<IEDocNamed: " ++ string ++ ">")
\end{code}