import HsSyn
import HsCore
-import Class ( FunDep )
+import Class ( FunDep, DefMeth(..) )
import TysWiredIn ( tupleTyCon, listTyCon, charTyCon )
import Name ( Name, getName, isTyVarName )
import NameSet
tyClDeclFVs (TySynonym {tcdTyVars = tyvars, tcdSynRhs = ty})
= delFVs (map hsTyVarName tyvars) (extractHsTyNames ty)
-tyClDeclFVs (ClassDecl {tcdCtxt = context, tcdTyVars = tyvars, tcdFDs = fds, tcdSigs = sigs})
+tyClDeclFVs (ClassDecl {tcdCtxt = context, tcdTyVars = tyvars, tcdFDs = fds,
+ tcdSigs = sigs, tcdMeths = maybe_meths})
= delFVs (map hsTyVarName tyvars) $
extractHsCtxtTyNames context `plusFV`
plusFVs (map extractFunDepNames fds) `plusFV`
- hsSigsFVs sigs
+ hsSigsFVs sigs `plusFV`
+ dm_fvs
+ where
+ dm_fvs = case maybe_meths of
+ Nothing -> mkFVs [v | ClassOpSig _ (DefMeth v) _ _ <- sigs]
+ -- No method bindings, so this class decl comes from an interface file,
+ -- So we want to treat the default-method names as free (they should
+ -- be defined somewhere else). [In source code this is not so; the class
+ -- decl will bind whatever default-methods are necessary.]
+ Just _ -> emptyFVs -- Source code, so the default methods
+ -- are *bound* not *free*
----------------
hsSigsFVs sigs = plusFVs (map hsSigFVs sigs)
returnRn (ClassOpSig op_name dm_stuff' new_ty locn)
rnClassBinds :: RdrNameTyClDecl -> RenamedTyClDecl -> RnMS (RenamedTyClDecl, FreeVars)
-rnClassBinds (ClassDecl {tcdMeths = Nothing})
- rn_cls_decl@(ClassDecl {tcdSigs = sigs})
- -- No method bindings, so this class decl comes from an interface file,
- -- However we want to treat the default-method names as free (they should
- -- be defined somewhere else). [In source code this is not so; the class
- -- decl will bind whatever default-methods are necessary.]
- = returnRn (rn_cls_decl, mkFVs [v | ClassOpSig _ (DefMeth v) _ _ <- sigs])
-
rnClassBinds (ClassDecl {tcdMeths = Just mbinds}) -- Get mbinds from here
rn_cls_decl@(ClassDecl {tcdTyVars = tyvars, tcdLoc = src_loc}) -- Everything else is here
-- There are some default-method bindings (abeit possibly empty) so