summaryrefslogtreecommitdiff
path: root/compiler/rename/RnHsSyn.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rename/RnHsSyn.lhs')
-rw-r--r--compiler/rename/RnHsSyn.lhs31
1 files changed, 24 insertions, 7 deletions
diff --git a/compiler/rename/RnHsSyn.lhs b/compiler/rename/RnHsSyn.lhs
index 7b0591dd19..e2369bb776 100644
--- a/compiler/rename/RnHsSyn.lhs
+++ b/compiler/rename/RnHsSyn.lhs
@@ -16,6 +16,7 @@ module RnHsSyn(
charTyCon_name, listTyCon_name, parrTyCon_name, tupleTyCon_name,
extractHsTyVars, extractHsTyNames, extractHsTyNames_s,
extractFunDepNames, extractHsCtxtTyNames,
+ extractHsTyVarBndrNames, extractHsTyVarBndrNames_s,
-- Free variables
hsSigsFVs, hsSigFVs, conDeclFVs, bangTyFVs
@@ -30,6 +31,7 @@ import Name ( Name, getName, isTyVarName )
import NameSet
import BasicTypes ( TupleSort )
import SrcLoc
+import Panic ( panic )
\end{code}
%************************************************************************
@@ -56,6 +58,7 @@ extractFunDepNames :: FunDep Name -> NameSet
extractFunDepNames (ns1, ns2) = mkNameSet ns1 `unionNameSets` mkNameSet ns2
extractHsTyNames :: LHsType Name -> NameSet
+-- Also extract names in kinds.
extractHsTyNames ty
= getl ty
where
@@ -68,22 +71,24 @@ extractHsTyNames ty
get (HsFunTy ty1 ty2) = getl ty1 `unionNameSets` getl ty2
get (HsIParamTy _ ty) = getl ty
get (HsEqTy ty1 ty2) = getl ty1 `unionNameSets` getl ty2
- get (HsOpTy ty1 op ty2) = getl ty1 `unionNameSets` getl ty2 `unionNameSets` unitNameSet (unLoc op)
+ get (HsOpTy ty1 (_, op) ty2) = getl ty1 `unionNameSets` getl ty2 `unionNameSets` unitNameSet (unLoc op)
get (HsParTy ty) = getl ty
get (HsBangTy _ ty) = getl ty
get (HsRecTy flds) = extractHsTyNames_s (map cd_fld_type flds)
get (HsTyVar tv) = unitNameSet tv
get (HsSpliceTy _ fvs _) = fvs
get (HsQuasiQuoteTy {}) = emptyNameSet
- get (HsKindSig ty _) = getl ty
+ get (HsKindSig ty ki) = getl ty `unionNameSets` getl ki
get (HsForAllTy _ tvs
- ctxt ty) = (extractHsCtxtTyNames ctxt
- `unionNameSets` getl ty)
- `minusNameSet`
- mkNameSet (hsLTyVarNames tvs)
+ ctxt ty) = extractHsTyVarBndrNames_s tvs
+ (extractHsCtxtTyNames ctxt
+ `unionNameSets` getl ty)
get (HsDocTy ty _) = getl ty
get (HsCoreTy {}) = emptyNameSet -- This probably isn't quite right
-- but I don't think it matters
+ get (HsExplicitListTy _ tys) = extractHsTyNames_s tys
+ get (HsExplicitTupleTy _ tys) = extractHsTyNames_s tys
+ get (HsWrapTy {}) = panic "extractHsTyNames"
extractHsTyNames_s :: [LHsType Name] -> NameSet
extractHsTyNames_s tys = foldr (unionNameSets . extractHsTyNames) emptyNameSet tys
@@ -91,6 +96,18 @@ extractHsTyNames_s tys = foldr (unionNameSets . extractHsTyNames) emptyNameSet t
extractHsCtxtTyNames :: LHsContext Name -> NameSet
extractHsCtxtTyNames (L _ ctxt)
= foldr (unionNameSets . extractHsTyNames) emptyNameSet ctxt
+
+extractHsTyVarBndrNames :: LHsTyVarBndr Name -> NameSet
+extractHsTyVarBndrNames (L _ (UserTyVar _ _)) = emptyNameSet
+extractHsTyVarBndrNames (L _ (KindedTyVar _ ki _)) = extractHsTyNames ki
+
+extractHsTyVarBndrNames_s :: [LHsTyVarBndr Name] -> NameSet -> NameSet
+-- Update the name set 'body' by adding the names in the binders
+-- kinds and handling scoping.
+extractHsTyVarBndrNames_s [] body = body
+extractHsTyVarBndrNames_s (b:bs) body =
+ (extractHsTyVarBndrNames_s bs body `delFromNameSet` hsTyVarName (unLoc b))
+ `unionNameSets` extractHsTyVarBndrNames b
\end{code}
@@ -125,7 +142,7 @@ hsSigFVs _ = emptyFVs
conDeclFVs :: LConDecl Name -> FreeVars
conDeclFVs (L _ (ConDecl { con_qvars = tyvars, con_cxt = context,
con_details = details, con_res = res_ty}))
- = delFVs (map hsLTyVarName tyvars) $
+ = extractHsTyVarBndrNames_s tyvars $
extractHsCtxtTyNames context `plusFV`
conDetailsFVs details `plusFV`
conResTyFVs res_ty