import RnMonad
import RnExpr ( rnMatch, rnGRHSsAndBinds, rnPat, checkPrecMatch )
import RnEnv ( bindLocatedLocalsRn, lookupBndrRn, lookupOccRn, lookupGlobalOccRn,
- newLocalNames, isUnboundName, warnUnusedBinds
+ isUnboundName, warnUnusedBinds
)
import CmdLineOpts ( opt_SigsRequired )
import Digraph ( stronglyConnComp, SCC(..) )
ppr how_in_scope2])
shadowedNameWarn shadow
- = hcat [ptext SLIT("This binding for"),
+ = hsep [ptext SLIT("This binding for"),
quotes (ppr shadow),
ptext SLIT("shadows an existing binding")]
type RenamedHsDecl = HsDecl Unused Name RenamedPat
type RenamedSpecDataSig = SpecDataSig Name
type RenamedDefaultDecl = DefaultDecl Name
+type RenamedForeignDecl = ForeignDecl Name
type RenamedFixityDecl = FixityDecl Name
type RenamedGRHS = GRHS Unused Name RenamedPat
type RenamedGRHSsAndBinds = GRHSsAndBinds Unused Name RenamedPat
= new_name var src_loc `thenRn` \ var_name ->
returnRn (Avail var_name)
+getDeclBinders new_name (ForD _) = returnRn NotAvailable
getDeclBinders new_name (DefD _) = returnRn NotAvailable
getDeclBinders new_name (InstD _) = returnRn NotAvailable
)
import HsSyn ( HsModule(..), ImportDecl(..), HsDecl(..),
- IE(..), ieName,
+ IE(..), ieName,
+ ForeignDecl(..), ExtName(..),
FixityDecl(..),
collectTopBinders
)
= mapRn do_one (bagToList (collectTopBinders binds)) `thenRn` \ val_avails ->
returnRn (val_avails ++ avails)
+ -- foreign import declaration
+ getLocalDeclBinders avails (ForD (ForeignDecl nm (Just _) _ _ _ loc))
+ = do_one (nm,loc) `thenRn` \ for_avail ->
+ returnRn (for_avail : avails)
+
+ -- foreign export dynamic declaration
+ getLocalDeclBinders avails (ForD (ForeignDecl nm Nothing _ Dynamic _ loc))
+ = do_one (nm,loc) `thenRn` \ for_avail ->
+ returnRn (for_avail : avails)
+
getLocalDeclBinders avails decl
= getDeclBinders newLocalName decl `thenRn` \ avail ->
case avail of
import RnBinds ( rnTopBinds, rnMethodBinds, renameSigs )
import RnEnv ( bindTyVarsRn, lookupBndrRn, lookupOccRn, lookupImplicitOccRn, bindLocalsRn,
- newDfunName, checkDupOrQualNames, checkDupNames,
+ newDfunName, checkDupOrQualNames, checkDupNames, lookupGlobalOccRn,
newLocallyDefinedGlobalName, newImportedGlobalName, ifaceFlavour,
- listType_RDR, tupleType_RDR )
+ listType_RDR, tupleType_RDR, addImplicitOccRn
+ )
import RnMonad
import Name ( Name, OccName(..), occNameString, prefixOccName,
%*********************************************************
%* *
+\subsection{Foreign declarations}
+%* *
+%*********************************************************
+
+\begin{code}
+rnDecl (ForD (ForeignDecl name imp_exp ty ext_nm cconv src_loc))
+ = pushSrcLocRn src_loc $
+ lookupBndrRn name `thenRn` \ name' ->
+ (if is_export then
+ addImplicitOccRn name'
+ else
+ returnRn name') `thenRn_`
+ rnHsSigType fo_decl_msg ty `thenRn` \ ty' ->
+ returnRn (ForD (ForeignDecl name' imp_exp ty' ext_nm cconv src_loc))
+ where
+ fo_decl_msg = ptext SLIT("a foreign declaration")
+ is_export = not (maybeToBool imp_exp) && not (isDynamic ext_nm)
+
+\end{code}
+
+%*********************************************************
+%* *
\subsection{Support code for type/data declarations}
%* *
%*********************************************************