{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module GHC.Rename.Module (
rnSrcDecls, addTcgDUs, findSplice, rnWarningTxt, rnLWarningTxt
) where
import GHC.Prelude hiding ( head )
import {-# SOURCE #-} GHC.Rename.Expr( rnLExpr )
import {-# SOURCE #-} GHC.Rename.Splice ( rnSpliceDecl, rnTopSpliceDecls )
import GHC.Hs
import GHC.Types.FieldLabel
import GHC.Types.Name.Reader
import GHC.Rename.HsType
import GHC.Rename.Bind
import GHC.Rename.Doc
import GHC.Rename.Env
import GHC.Rename.Utils ( mapFvRn, bindLocalNames
, checkDupRdrNames, bindLocalNamesFV
, checkShadowedRdrNames, warnUnusedTypePatterns
, newLocalBndrsRn
, noNestedForallsContextsErr
, addNoNestedForallsContextsErr, checkInferredVars )
import GHC.Rename.Unbound ( mkUnboundName, notInScopeErr, WhereLooking(WL_Global) )
import GHC.Rename.Names
import GHC.Tc.Errors.Types
import GHC.Tc.Gen.Annotation ( annCtxt )
import GHC.Tc.Utils.Monad
import GHC.Tc.Types.Origin ( TypedThing(..) )
import GHC.Types.ForeignCall ( CCallTarget(..) )
import GHC.Unit
import GHC.Unit.Module.Warnings
import GHC.Builtin.Names( applicativeClassName, pureAName, thenAName
, monadClassName, returnMName, thenMName
, semigroupClassName, sappendName
, monoidClassName, mappendName
)
import GHC.Types.Name
import GHC.Types.Name.Set
import GHC.Types.Name.Env
import GHC.Utils.Outputable
import GHC.Types.Basic (Arity)
import GHC.Types.Basic ( TypeOrKind(..) )
import GHC.Data.FastString
import GHC.Types.SrcLoc as SrcLoc
import GHC.Driver.DynFlags
import GHC.Utils.Misc ( lengthExceeds, partitionWith )
import GHC.Utils.Panic
import GHC.Driver.Env ( HscEnv(..), hsc_home_unit)
import GHC.Data.List.SetOps ( findDupsEq, removeDupsOn, equivClasses )
import GHC.Data.Graph.Directed ( SCC, flattenSCC, flattenSCCs, Node(..)
, stronglyConnCompFromEdgedVerticesUniq )
import GHC.Types.GREInfo (ConLikeInfo (..), ConInfo, mkConInfo, conInfoFields)
import GHC.Types.Unique.Set
import GHC.Data.OrdList
import qualified GHC.LanguageExtensions as LangExt
import GHC.Core.DataCon ( isSrcStrict )
import Control.Monad
import Control.Arrow ( first )
import Data.Foldable ( toList, for_ )
import Data.List ( mapAccumL )
import Data.List.NonEmpty ( NonEmpty(..), head, nonEmpty )
import Data.Maybe ( isNothing, fromMaybe, mapMaybe, maybeToList )
import qualified Data.Set as Set ( difference, fromList, toList, null )
rnSrcDecls :: HsGroup GhcPs -> RnM (TcGblEnv, HsGroup GhcRn)
rnSrcDecls :: HsGroup GhcPs -> RnM (TcGblEnv, HsGroup GhcRn)
rnSrcDecls group :: HsGroup GhcPs
group@(HsGroup { hs_valds :: forall p. HsGroup p -> HsValBinds p
hs_valds = HsValBinds GhcPs
val_decls,
hs_splcds :: forall p. HsGroup p -> [LSpliceDecl p]
hs_splcds = [LSpliceDecl GhcPs]
splice_decls,
hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
tycl_decls,
hs_derivds :: forall p. HsGroup p -> [LDerivDecl p]
hs_derivds = [LDerivDecl GhcPs]
deriv_decls,
hs_fixds :: forall p. HsGroup p -> [LFixitySig p]
hs_fixds = [LFixitySig GhcPs]
fix_decls,
hs_warnds :: forall p. HsGroup p -> [LWarnDecls p]
hs_warnds = [LWarnDecls GhcPs]
warn_decls,
hs_annds :: forall p. HsGroup p -> [LAnnDecl p]
hs_annds = [LAnnDecl GhcPs]
ann_decls,
hs_fords :: forall p. HsGroup p -> [LForeignDecl p]
hs_fords = [LForeignDecl GhcPs]
foreign_decls,
hs_defds :: forall p. HsGroup p -> [LDefaultDecl p]
hs_defds = [LDefaultDecl GhcPs]
default_decls,
hs_ruleds :: forall p. HsGroup p -> [LRuleDecls p]
hs_ruleds = [LRuleDecls GhcPs]
rule_decls,
hs_docs :: forall p. HsGroup p -> [LDocDecl p]
hs_docs = [LDocDecl GhcPs]
docs })
= do {
local_fix_env <- [LFixitySig GhcPs] -> RnM MiniFixityEnv
makeMiniFixityEnv ([LFixitySig GhcPs] -> RnM MiniFixityEnv)
-> [LFixitySig GhcPs] -> RnM MiniFixityEnv
forall a b. (a -> b) -> a -> b
$ HsGroup GhcPs -> [LFixitySig GhcPs]
forall (p :: Pass). HsGroup (GhcPass p) -> [LFixitySig (GhcPass p)]
hsGroupTopLevelFixitySigs HsGroup GhcPs
group ;
(tc_envs, tc_bndrs) <- getLocalNonValBinders local_fix_env group ;
restoreEnvs tc_envs $ do {
failIfErrsM ;
dup_fields_ok <- xopt_DuplicateRecordFields <$> getDynFlags ;
has_sel <- xopt_FieldSelectors <$> getDynFlags ;
extendPatSynEnv dup_fields_ok has_sel val_decls local_fix_env $ \[Name]
pat_syn_bndrs -> do {
is_boot <- TcRn Bool
tcIsHsBootOrSig ;
new_lhs <- if is_boot
then rnTopBindsLHSBoot local_fix_env val_decls
else rnTopBindsLHS local_fix_env val_decls ;
let { id_bndrs = CollectFlag GhcRn -> HsValBindsLR GhcRn GhcPs -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass).
CollectPass (GhcPass idL) =>
CollectFlag (GhcPass idL)
-> HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
collectHsIdBinders CollectFlag GhcRn
forall p. CollectFlag p
CollNoDictBinders HsValBindsLR GhcRn GhcPs
new_lhs } ;
traceRn "rnSrcDecls" (ppr id_bndrs) ;
tc_envs <- extendGlobalRdrEnvRn (map (mkLocalVanillaGRE NoParent) id_bndrs) local_fix_env ;
restoreEnvs tc_envs $ do {
traceRn "Start rnTyClDecls" (ppr tycl_decls) ;
(rn_tycl_decls, src_fvs1) <- rnTyClDecls tycl_decls ;
traceRn "Start rnmono" empty ;
let { val_bndr_set = [Name] -> FreeVars
mkNameSet [IdP GhcRn]
[Name]
id_bndrs FreeVars -> FreeVars -> FreeVars
`unionNameSet` [Name] -> FreeVars
mkNameSet [Name]
pat_syn_bndrs } ;
(rn_val_decls@(XValBindsLR (NValBinds _ sigs')), bind_dus) <- if is_boot
then rnTopBindsBoot tc_bndrs new_lhs
else rnValBindsRHS (TopSigCtxt val_bndr_set) new_lhs ;
traceRn "finish rnmono" (ppr rn_val_decls) ;
let { all_bndrs = FreeVars
tc_bndrs FreeVars -> FreeVars -> FreeVars
`unionNameSet` FreeVars
val_bndr_set } ;
traceRn "rnSrcDecls fixity" $
vcat [ text "all_bndrs:" <+> ppr all_bndrs ] ;
rn_fix_decls <- mapM (mapM (rnSrcFixityDecl (TopSigCtxt all_bndrs)))
fix_decls ;
rn_decl_warns <- rnSrcWarnDecls all_bndrs warn_decls ;
(rn_rule_decls, src_fvs2) <- setXOptM LangExt.ScopedTypeVariables $
rnList rnHsRuleDecls rule_decls ;
(rn_foreign_decls, src_fvs3) <- rnList rnHsForeignDecl foreign_decls ;
(rn_ann_decls, src_fvs4) <- rnList rnAnnDecl ann_decls ;
(rn_default_decls, src_fvs5) <- rnList rnDefaultDecl default_decls ;
(rn_deriv_decls, src_fvs6) <- rnList rnSrcDerivDecl deriv_decls ;
(rn_splice_decls, src_fvs7) <- rnList rnSpliceDecl splice_decls ;
rn_docs <- traverse rnLDocDecl docs ;
last_tcg_env0 <- getGblEnv ;
let { last_tcg_env =
TcGblEnv
last_tcg_env0
{ tcg_complete_matches = tcg_complete_matches last_tcg_env0 ++ localCompletePragmas sigs' }
} ;
let {rn_group = HsGroup { hs_ext :: XCHsGroup GhcRn
hs_ext = XCHsGroup GhcRn
NoExtField
noExtField,
hs_valds :: HsValBinds GhcRn
hs_valds = HsValBinds GhcRn
rn_val_decls,
hs_splcds :: [LSpliceDecl GhcRn]
hs_splcds = [LSpliceDecl GhcRn]
[LocatedA (SpliceDecl GhcRn)]
rn_splice_decls,
hs_tyclds :: [TyClGroup GhcRn]
hs_tyclds = [TyClGroup GhcRn]
rn_tycl_decls,
hs_derivds :: [LDerivDecl GhcRn]
hs_derivds = [LDerivDecl GhcRn]
[LocatedA (DerivDecl GhcRn)]
rn_deriv_decls,
hs_fixds :: [LFixitySig GhcRn]
hs_fixds = [LFixitySig GhcRn]
[GenLocated SrcSpanAnnA (FixitySig GhcRn)]
rn_fix_decls,
hs_warnds :: [LWarnDecls GhcRn]
hs_warnds = [],
hs_fords :: [LForeignDecl GhcRn]
hs_fords = [LForeignDecl GhcRn]
[LocatedA (ForeignDecl GhcRn)]
rn_foreign_decls,
hs_annds :: [LAnnDecl GhcRn]
hs_annds = [LAnnDecl GhcRn]
[LocatedA (AnnDecl GhcRn)]
rn_ann_decls,
hs_defds :: [LDefaultDecl GhcRn]
hs_defds = [LDefaultDecl GhcRn]
[LocatedA (DefaultDecl GhcRn)]
rn_default_decls,
hs_ruleds :: [LRuleDecls GhcRn]
hs_ruleds = [LRuleDecls GhcRn]
[LocatedA (RuleDecls GhcRn)]
rn_rule_decls,
hs_docs :: [LDocDecl GhcRn]
hs_docs = [LDocDecl GhcRn]
[GenLocated SrcSpanAnnA (DocDecl GhcRn)]
rn_docs } ;
tcf_bndrs = [TyClGroup GhcRn] -> [LForeignDecl GhcRn] -> [Name]
hsTyClForeignBinders [TyClGroup GhcRn]
rn_tycl_decls [LForeignDecl GhcRn]
[LocatedA (ForeignDecl GhcRn)]
rn_foreign_decls ;
other_def = (FreeVars -> Maybe FreeVars
forall a. a -> Maybe a
Just ([Name] -> FreeVars
mkNameSet [Name]
tcf_bndrs), FreeVars
emptyNameSet) ;
other_fvs = [FreeVars] -> FreeVars
plusFVs [FreeVars
src_fvs1, FreeVars
src_fvs2, FreeVars
src_fvs3, FreeVars
src_fvs4,
FreeVars
src_fvs5, FreeVars
src_fvs6, FreeVars
src_fvs7] ;
src_dus = (Maybe FreeVars, FreeVars) -> DefUses
forall a. a -> OrdList a
unitOL (Maybe FreeVars, FreeVars)
other_def DefUses -> DefUses -> DefUses
`plusDU` DefUses
bind_dus DefUses -> DefUses -> DefUses
`plusDU` FreeVars -> DefUses
usesOnly FreeVars
other_fvs ;
final_tcg_env = let tcg_env' :: TcGblEnv
tcg_env' = (TcGblEnv
last_tcg_env TcGblEnv -> DefUses -> TcGblEnv
`addTcgDUs` DefUses
src_dus)
in
TcGblEnv
tcg_env' { tcg_warns = insertWarnDecls (tcg_warns tcg_env') rn_decl_warns };
} ;
traceRn "finish rnSrc" (ppr rn_group) ;
traceRn "finish Dus" (ppr src_dus ) ;
return (final_tcg_env, rn_group)
}}}}
addTcgDUs :: TcGblEnv -> DefUses -> TcGblEnv
addTcgDUs :: TcGblEnv -> DefUses -> TcGblEnv
addTcgDUs TcGblEnv
tcg_env DefUses
dus = TcGblEnv
tcg_env { tcg_dus = tcg_dus tcg_env `plusDU` dus }
rnList :: (a -> RnM (b, FreeVars)) -> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
rnList :: forall a b.
(a -> RnM (b, FreeVars))
-> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
rnList a -> RnM (b, FreeVars)
f [LocatedA a]
xs = (LocatedA a -> RnM (LocatedA b, FreeVars))
-> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
forall (f :: * -> *) a b.
Traversable f =>
(a -> RnM (b, FreeVars)) -> f a -> RnM (f b, FreeVars)
mapFvRn ((a -> RnM (b, FreeVars))
-> LocatedA a -> RnM (LocatedA b, FreeVars)
forall a b c ann.
(a -> TcM (b, c))
-> GenLocated (EpAnn ann) a -> TcM (GenLocated (EpAnn ann) b, c)
wrapLocFstMA a -> RnM (b, FreeVars)
f) [LocatedA a]
xs
rnSrcWarnDecls :: NameSet -> [LWarnDecls GhcPs] -> RnM (DeclWarnOccNames GhcRn)
rnSrcWarnDecls :: FreeVars -> [LWarnDecls GhcPs] -> RnM (DeclWarnOccNames GhcRn)
rnSrcWarnDecls FreeVars
_ []
= DeclWarnOccNames GhcRn -> RnM (DeclWarnOccNames GhcRn)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return []
rnSrcWarnDecls FreeVars
bndr_set [LWarnDecls GhcPs]
decls'
= do {
; (NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
-> TcRn ())
-> [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\ NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
dups -> let ((L SrcSpanAnnN
loc RdrName
rdr) :| (GenLocated SrcSpanAnnN RdrName
lrdr':FreeKiTyVars
_)) = ((NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
-> GenLocated SrcSpanAnnN RdrName)
-> NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
-> NonEmpty (GenLocated SrcSpanAnnN RdrName)
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
-> GenLocated SrcSpanAnnN RdrName
forall a b. (a, b) -> b
snd NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
dups
in SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (SrcSpanAnnN -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnN
loc) (GenLocated SrcSpanAnnN RdrName -> RdrName -> TcRnMessage
TcRnDuplicateWarningDecls GenLocated SrcSpanAnnN RdrName
lrdr' RdrName
rdr))
[NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
warn_rdr_dups
; pairs_s <- (GenLocated SrcSpanAnnA (WarnDecl GhcPs)
-> RnM (DeclWarnOccNames GhcRn))
-> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
-> IOEnv (Env TcGblEnv TcLclEnv) [DeclWarnOccNames GhcRn]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((WarnDecl GhcPs -> RnM (DeclWarnOccNames GhcRn))
-> GenLocated SrcSpanAnnA (WarnDecl GhcPs)
-> RnM (DeclWarnOccNames GhcRn)
forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
addLocM WarnDecl GhcPs -> RnM (DeclWarnOccNames GhcRn)
rn_deprec) [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
decls
; return $ concat pairs_s }
where
decls :: [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
decls = (GenLocated SrcSpanAnnA (WarnDecls GhcPs)
-> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)])
-> [GenLocated SrcSpanAnnA (WarnDecls GhcPs)]
-> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (WarnDecls GhcPs -> [LWarnDecl GhcPs]
WarnDecls GhcPs -> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
forall pass. WarnDecls pass -> [LWarnDecl pass]
wd_warnings (WarnDecls GhcPs -> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)])
-> (GenLocated SrcSpanAnnA (WarnDecls GhcPs) -> WarnDecls GhcPs)
-> GenLocated SrcSpanAnnA (WarnDecls GhcPs)
-> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (WarnDecls GhcPs) -> WarnDecls GhcPs
forall l e. GenLocated l e -> e
unLoc) [LWarnDecls GhcPs]
[GenLocated SrcSpanAnnA (WarnDecls GhcPs)]
decls'
sig_ctxt :: HsSigCtxt
sig_ctxt = FreeVars -> HsSigCtxt
TopSigCtxt FreeVars
bndr_set
rn_deprec :: WarnDecl GhcPs -> RnM (DeclWarnOccNames GhcRn)
rn_deprec w :: WarnDecl GhcPs
w@(Warning (NamespaceSpecifier
ns_spec, (EpToken "[", EpToken "]")
_) [LIdP GhcPs]
rdr_names WarningTxt GhcPs
txt)
= do { names <- (GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)])
-> FreeKiTyVars -> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)]
forall (m :: * -> *) (f :: * -> *) a b.
(Monad m, Traversable f) =>
(a -> m [b]) -> f a -> m [b]
concatMapM (HsSigCtxt
-> SDoc
-> NamespaceSpecifier
-> RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)]
lookupLocalTcNames HsSigCtxt
sig_ctxt SDoc
what NamespaceSpecifier
ns_spec (RdrName -> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)])
-> (GenLocated SrcSpanAnnN RdrName -> RdrName)
-> GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnN RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc)
[LIdP GhcPs]
FreeKiTyVars
rdr_names
; unlessXOptM LangExt.ExplicitNamespaces $
when (ns_spec /= NoNamespaceSpecifier) $
addErr (TcRnNamespacedWarningPragmaWithoutFlag w)
; txt' <- rnWarningTxt txt
; return [(nameOccName nm, txt') | (_, nm) <- names] }
what :: SDoc
what = String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"deprecation"
warn_rdr_dups :: [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
warn_rdr_dups = [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
-> [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
find_dup_warning_names
([(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
-> [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)])
-> [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
-> [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
forall a b. (a -> b) -> a -> b
$ (GenLocated SrcSpanAnnA (WarnDecl GhcPs)
-> [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)])
-> [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
-> [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(L SrcSpanAnnA
_ (Warning (NamespaceSpecifier
ns_spec, (EpToken "[", EpToken "]")
_) [LIdP GhcPs]
ns WarningTxt GhcPs
_)) -> (NamespaceSpecifier
ns_spec,) (GenLocated SrcSpanAnnN RdrName
-> (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName))
-> FreeKiTyVars
-> [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [LIdP GhcPs]
FreeKiTyVars
ns) [GenLocated SrcSpanAnnA (WarnDecl GhcPs)]
decls
find_dup_warning_names :: [(NamespaceSpecifier, LocatedN RdrName)] -> [NonEmpty (NamespaceSpecifier, LocatedN RdrName)]
find_dup_warning_names :: [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
-> [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
find_dup_warning_names = ((NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)
-> (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName) -> Bool)
-> [(NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
-> [NonEmpty (NamespaceSpecifier, GenLocated SrcSpanAnnN RdrName)]
forall a. (a -> a -> Bool) -> [a] -> [NonEmpty a]
findDupsEq (\ (NamespaceSpecifier
spec1, GenLocated SrcSpanAnnN RdrName
x) -> \ (NamespaceSpecifier
spec2, GenLocated SrcSpanAnnN RdrName
y) ->
NamespaceSpecifier -> NamespaceSpecifier -> Bool
overlappingNamespaceSpecifiers NamespaceSpecifier
spec1 NamespaceSpecifier
spec2 Bool -> Bool -> Bool
&&
RdrName -> OccName
rdrNameOcc (GenLocated SrcSpanAnnN RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnN RdrName
x) OccName -> OccName -> Bool
forall a. Eq a => a -> a -> Bool
== RdrName -> OccName
rdrNameOcc (GenLocated SrcSpanAnnN RdrName -> RdrName
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnN RdrName
y))
rnWarningTxt :: WarningTxt GhcPs -> RnM (WarningTxt GhcRn)
rnWarningTxt :: WarningTxt GhcPs -> RnM (WarningTxt GhcRn)
rnWarningTxt (WarningTxt Maybe (LocatedE InWarningCategory)
mb_cat SourceText
st [LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)]
wst) = do
Maybe (LocatedE InWarningCategory)
-> (LocatedE InWarningCategory -> TcRn ()) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ Maybe (LocatedE InWarningCategory)
mb_cat ((LocatedE InWarningCategory -> TcRn ()) -> TcRn ())
-> (LocatedE InWarningCategory -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(L EpaLocation
_ (InWarningCategory EpToken "in"
_ SourceText
_ (L EpaLocation
loc WarningCategory
cat))) ->
Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (WarningCategory -> Bool
validWarningCategory WarningCategory
cat) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (EpaLocation -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA EpaLocation
loc) (WarningCategory -> TcRnMessage
TcRnInvalidWarningCategory WarningCategory
cat)
wst' <- (LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated
EpaLocation (WithHsDocIdentifiers StringLiteral GhcRn)))
-> [LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[GenLocated EpaLocation (WithHsDocIdentifiers StringLiteral GhcRn)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((WithHsDocIdentifiers StringLiteral GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (WithHsDocIdentifiers StringLiteral GhcRn))
-> LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated EpaLocation (WithHsDocIdentifiers StringLiteral GhcRn))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> GenLocated EpaLocation a -> f (GenLocated EpaLocation b)
traverse WithHsDocIdentifiers StringLiteral GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (WithHsDocIdentifiers StringLiteral GhcRn)
forall a.
WithHsDocIdentifiers a GhcPs -> RnM (WithHsDocIdentifiers a GhcRn)
rnHsDoc) [LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)]
wst
pure (WarningTxt mb_cat st wst')
rnWarningTxt (DeprecatedTxt SourceText
st [LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)]
wst) = do
wst' <- (LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated
EpaLocation (WithHsDocIdentifiers StringLiteral GhcRn)))
-> [LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[GenLocated EpaLocation (WithHsDocIdentifiers StringLiteral GhcRn)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((WithHsDocIdentifiers StringLiteral GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (WithHsDocIdentifiers StringLiteral GhcRn))
-> LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated EpaLocation (WithHsDocIdentifiers StringLiteral GhcRn))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> GenLocated EpaLocation a -> f (GenLocated EpaLocation b)
traverse WithHsDocIdentifiers StringLiteral GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (WithHsDocIdentifiers StringLiteral GhcRn)
forall a.
WithHsDocIdentifiers a GhcPs -> RnM (WithHsDocIdentifiers a GhcRn)
rnHsDoc) [LocatedE (WithHsDocIdentifiers StringLiteral GhcPs)]
wst
pure (DeprecatedTxt st wst')
rnLWarningTxt :: LWarningTxt GhcPs -> RnM (LWarningTxt GhcRn)
rnLWarningTxt :: LWarningTxt GhcPs -> RnM (LWarningTxt GhcRn)
rnLWarningTxt (L SrcSpanAnnP
loc WarningTxt GhcPs
warn) = SrcSpanAnnP
-> WarningTxt GhcRn -> GenLocated SrcSpanAnnP (WarningTxt GhcRn)
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnP
loc (WarningTxt GhcRn -> GenLocated SrcSpanAnnP (WarningTxt GhcRn))
-> RnM (WarningTxt GhcRn)
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnP (WarningTxt GhcRn))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> WarningTxt GhcPs -> RnM (WarningTxt GhcRn)
rnWarningTxt WarningTxt GhcPs
warn
rnAnnDecl :: AnnDecl GhcPs -> RnM (AnnDecl GhcRn, FreeVars)
rnAnnDecl :: AnnDecl GhcPs -> RnM (AnnDecl GhcRn, FreeVars)
rnAnnDecl ann :: AnnDecl GhcPs
ann@(HsAnnotation (AnnPragma
_, SourceText
s) AnnProvenance GhcPs
provenance XRec GhcPs (HsExpr GhcPs)
expr)
= SDoc
-> RnM (AnnDecl GhcRn, FreeVars) -> RnM (AnnDecl GhcRn, FreeVars)
forall a. SDoc -> TcM a -> TcM a
addErrCtxt (AnnDecl GhcPs -> SDoc
forall (p :: Pass).
OutputableBndrId p =>
AnnDecl (GhcPass p) -> SDoc
annCtxt AnnDecl GhcPs
ann) (RnM (AnnDecl GhcRn, FreeVars) -> RnM (AnnDecl GhcRn, FreeVars))
-> RnM (AnnDecl GhcRn, FreeVars) -> RnM (AnnDecl GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$
do { (provenance', provenance_fvs) <- AnnProvenance GhcPs -> RnM (AnnProvenance GhcRn, FreeVars)
rnAnnProvenance AnnProvenance GhcPs
provenance
; (expr', expr_fvs) <- setStage (Splice Untyped) $
rnLExpr expr
; return (HsAnnotation (noAnn, s) provenance' expr',
provenance_fvs `plusFV` expr_fvs) }
rnAnnProvenance :: AnnProvenance GhcPs
-> RnM (AnnProvenance GhcRn, FreeVars)
rnAnnProvenance :: AnnProvenance GhcPs -> RnM (AnnProvenance GhcRn, FreeVars)
rnAnnProvenance AnnProvenance GhcPs
provenance = do
provenance' <- case AnnProvenance GhcPs
provenance of
ValueAnnProvenance LIdP GhcPs
n -> LIdP GhcRn -> AnnProvenance GhcRn
GenLocated SrcSpanAnnN Name -> AnnProvenance GhcRn
forall pass. LIdP pass -> AnnProvenance pass
ValueAnnProvenance
(GenLocated SrcSpanAnnN Name -> AnnProvenance GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
-> IOEnv (Env TcGblEnv TcLclEnv) (AnnProvenance GhcRn)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopBndrRnN LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
n
TypeAnnProvenance LIdP GhcPs
n -> LIdP GhcRn -> AnnProvenance GhcRn
GenLocated SrcSpanAnnN Name -> AnnProvenance GhcRn
forall pass. LIdP pass -> AnnProvenance pass
TypeAnnProvenance
(GenLocated SrcSpanAnnN Name -> AnnProvenance GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
-> IOEnv (Env TcGblEnv TcLclEnv) (AnnProvenance GhcRn)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopConstructorRnN LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
n
AnnProvenance GhcPs
ModuleAnnProvenance -> AnnProvenance GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (AnnProvenance GhcRn)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return AnnProvenance GhcRn
forall pass. AnnProvenance pass
ModuleAnnProvenance
return (provenance', maybe emptyFVs unitFV (annProvenanceName_maybe provenance'))
rnDefaultDecl :: DefaultDecl GhcPs -> RnM (DefaultDecl GhcRn, FreeVars)
rnDefaultDecl :: DefaultDecl GhcPs -> RnM (DefaultDecl GhcRn, FreeVars)
rnDefaultDecl (DefaultDecl XCDefaultDecl GhcPs
_ Maybe (LIdP GhcPs)
mb_cls [LHsType GhcPs]
tys)
= do {
; mb_cls' <- (GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name))
-> Maybe (GenLocated SrcSpanAnnN RdrName)
-> IOEnv
(Env TcGblEnv TcLclEnv) (Maybe (GenLocated SrcSpanAnnN Name))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse ((RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b)
-> GenLocated SrcSpanAnnN a -> f (GenLocated SrcSpanAnnN b)
traverse RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
lookupOccRn) Maybe (LIdP GhcPs)
Maybe (GenLocated SrcSpanAnnN RdrName)
mb_cls
; (tys', ty_fvs) <- rnLHsTypes doc_str tys
; return (DefaultDecl noExtField mb_cls' tys', ty_fvs) }
where
doc_str :: HsDocContext
doc_str = HsDocContext
DefaultDeclCtx
rnHsForeignDecl :: ForeignDecl GhcPs -> RnM (ForeignDecl GhcRn, FreeVars)
rnHsForeignDecl :: ForeignDecl GhcPs -> RnM (ForeignDecl GhcRn, FreeVars)
rnHsForeignDecl (ForeignImport { fd_name :: forall pass. ForeignDecl pass -> LIdP pass
fd_name = LIdP GhcPs
name, fd_sig_ty :: forall pass. ForeignDecl pass -> LHsSigType pass
fd_sig_ty = LHsSigType GhcPs
ty, fd_fi :: forall pass. ForeignDecl pass -> ForeignImport pass
fd_fi = ForeignImport GhcPs
spec })
= do { topEnv :: HscEnv <- TcRnIf TcGblEnv TcLclEnv HscEnv
forall gbl lcl. TcRnIf gbl lcl HscEnv
getTopEnv
; name' <- lookupLocatedTopBndrRnN name
; (ty', fvs) <- rnHsSigType (ForeignDeclCtx name) TypeLevel ty
; let home_unit = HscEnv -> HomeUnit
hsc_home_unit HscEnv
topEnv
spec' = Unit -> ForeignImport GhcPs -> ForeignImport GhcRn
patchForeignImport (HomeUnit -> Unit
homeUnitAsUnit HomeUnit
home_unit) ForeignImport GhcPs
spec
; return (ForeignImport { fd_i_ext = noExtField
, fd_name = name', fd_sig_ty = ty'
, fd_fi = spec' }, fvs) }
rnHsForeignDecl (ForeignExport { fd_name :: forall pass. ForeignDecl pass -> LIdP pass
fd_name = LIdP GhcPs
name, fd_sig_ty :: forall pass. ForeignDecl pass -> LHsSigType pass
fd_sig_ty = LHsSigType GhcPs
ty, fd_fe :: forall pass. ForeignDecl pass -> ForeignExport pass
fd_fe = ForeignExport GhcPs
spec })
= do { name' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
forall ann.
GenLocated (EpAnn ann) RdrName
-> TcRn (GenLocated (EpAnn ann) Name)
lookupLocatedOccRn LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
name
; (ty', fvs) <- rnHsSigType (ForeignDeclCtx name) TypeLevel ty
; return (ForeignExport { fd_e_ext = noExtField
, fd_name = name', fd_sig_ty = ty'
, fd_fe = (\(CExport XCExport GhcPs
x XRec GhcPs CExportSpec
c) -> XCExport GhcRn -> XRec GhcRn CExportSpec -> ForeignExport GhcRn
forall pass.
XCExport pass -> XRec pass CExportSpec -> ForeignExport pass
CExport XCExport GhcPs
XCExport GhcRn
x XRec GhcPs CExportSpec
XRec GhcRn CExportSpec
c) spec }
, fvs `addOneFV` unLoc name') }
patchForeignImport :: Unit -> (ForeignImport GhcPs) -> (ForeignImport GhcRn)
patchForeignImport :: Unit -> ForeignImport GhcPs -> ForeignImport GhcRn
patchForeignImport Unit
unit (CImport XCImport GhcPs
ext XRec GhcPs CCallConv
cconv XRec GhcPs Safety
safety Maybe Header
fs CImportSpec
spec)
= XCImport GhcRn
-> XRec GhcRn CCallConv
-> XRec GhcRn Safety
-> Maybe Header
-> CImportSpec
-> ForeignImport GhcRn
forall pass.
XCImport pass
-> XRec pass CCallConv
-> XRec pass Safety
-> Maybe Header
-> CImportSpec
-> ForeignImport pass
CImport XCImport GhcPs
XCImport GhcRn
ext XRec GhcPs CCallConv
XRec GhcRn CCallConv
cconv XRec GhcPs Safety
XRec GhcRn Safety
safety Maybe Header
fs (Unit -> CImportSpec -> CImportSpec
patchCImportSpec Unit
unit CImportSpec
spec)
patchCImportSpec :: Unit -> CImportSpec -> CImportSpec
patchCImportSpec :: Unit -> CImportSpec -> CImportSpec
patchCImportSpec Unit
unit CImportSpec
spec
= case CImportSpec
spec of
CFunction CCallTarget
callTarget -> CCallTarget -> CImportSpec
CFunction (CCallTarget -> CImportSpec) -> CCallTarget -> CImportSpec
forall a b. (a -> b) -> a -> b
$ Unit -> CCallTarget -> CCallTarget
patchCCallTarget Unit
unit CCallTarget
callTarget
CImportSpec
_ -> CImportSpec
spec
patchCCallTarget :: Unit -> CCallTarget -> CCallTarget
patchCCallTarget :: Unit -> CCallTarget -> CCallTarget
patchCCallTarget Unit
unit CCallTarget
callTarget =
case CCallTarget
callTarget of
StaticTarget SourceText
src CLabelString
label Maybe Unit
Nothing Bool
isFun
-> SourceText -> CLabelString -> Maybe Unit -> Bool -> CCallTarget
StaticTarget SourceText
src CLabelString
label (Unit -> Maybe Unit
forall a. a -> Maybe a
Just Unit
unit) Bool
isFun
CCallTarget
_ -> CCallTarget
callTarget
rnSrcInstDecl :: InstDecl GhcPs -> RnM (InstDecl GhcRn, FreeVars)
rnSrcInstDecl :: InstDecl GhcPs -> RnM (InstDecl GhcRn, FreeVars)
rnSrcInstDecl (TyFamInstD { tfid_inst :: forall pass. InstDecl pass -> TyFamInstDecl pass
tfid_inst = TyFamInstDecl GhcPs
tfi })
= do { (tfi', fvs) <- AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, FreeVars)
rnTyFamInstDecl (ClosedTyFamInfo -> AssocTyFamInfo
NonAssocTyFamEqn ClosedTyFamInfo
NotClosedTyFam) TyFamInstDecl GhcPs
tfi
; return (TyFamInstD { tfid_ext = noExtField, tfid_inst = tfi' }, fvs) }
rnSrcInstDecl (DataFamInstD { dfid_inst :: forall pass. InstDecl pass -> DataFamInstDecl pass
dfid_inst = DataFamInstDecl GhcPs
dfi })
= do { (dfi', fvs) <- AssocTyFamInfo
-> DataFamInstDecl GhcPs -> RnM (DataFamInstDecl GhcRn, FreeVars)
rnDataFamInstDecl (ClosedTyFamInfo -> AssocTyFamInfo
NonAssocTyFamEqn ClosedTyFamInfo
NotClosedTyFam) DataFamInstDecl GhcPs
dfi
; return (DataFamInstD { dfid_ext = noExtField, dfid_inst = dfi' }, fvs) }
rnSrcInstDecl (ClsInstD { cid_inst :: forall pass. InstDecl pass -> ClsInstDecl pass
cid_inst = ClsInstDecl GhcPs
cid })
= do { String -> SDoc -> TcRn ()
traceRn String
"rnSrcIstDecl {" (ClsInstDecl GhcPs -> SDoc
forall a. Outputable a => a -> SDoc
ppr ClsInstDecl GhcPs
cid)
; (cid', fvs) <- ClsInstDecl GhcPs -> RnM (ClsInstDecl GhcRn, FreeVars)
rnClsInstDecl ClsInstDecl GhcPs
cid
; traceRn "rnSrcIstDecl end }" empty
; return (ClsInstD { cid_d_ext = noExtField, cid_inst = cid' }, fvs) }
checkCanonicalInstances :: Name -> LHsSigType GhcRn -> LHsBinds GhcRn -> RnM ()
checkCanonicalInstances :: Name -> LHsSigType GhcRn -> LHsBinds GhcRn -> TcRn ()
checkCanonicalInstances Name
cls LHsSigType GhcRn
poly_ty LHsBinds GhcRn
mbinds = do
WarningFlag -> TcRn () -> TcRn ()
forall gbl lcl.
WarningFlag -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
whenWOptM WarningFlag
Opt_WarnNonCanonicalMonadInstances
(TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TcRn ()
checkCanonicalMonadInstances
WarningFlag -> TcRn () -> TcRn ()
forall gbl lcl.
WarningFlag -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
whenWOptM WarningFlag
Opt_WarnNonCanonicalMonoidInstances
(TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TcRn ()
checkCanonicalMonoidInstances
where
checkCanonicalMonadInstances :: TcRn ()
checkCanonicalMonadInstances
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
applicativeClassName =
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ LHsBinds GhcRn
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
mbinds ((GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ())
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(L SrcSpanAnnA
loc HsBindLR GhcRn GhcRn
mbind) -> SrcSpanAnnA -> TcRn () -> TcRn ()
forall ann a. EpAnn ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
case HsBindLR GhcRn GhcRn
mbind of
FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
_ Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
mg }
| Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
pureAName, MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
mg Maybe Name -> Maybe Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name -> Maybe Name
forall a. a -> Maybe a
Just Name
returnMName
-> NonCanonical_Monad -> TcRn ()
addWarnNonCanonicalMonad NonCanonical_Monad
NonCanonical_Pure
| Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
thenAName, MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
mg Maybe Name -> Maybe Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name -> Maybe Name
forall a. a -> Maybe a
Just Name
thenMName
-> NonCanonical_Monad -> TcRn ()
addWarnNonCanonicalMonad NonCanonical_Monad
NonCanonical_ThenA
HsBindLR GhcRn GhcRn
_ -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
monadClassName =
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ LHsBinds GhcRn
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
mbinds ((GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ())
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(L SrcSpanAnnA
loc HsBindLR GhcRn GhcRn
mbind) -> SrcSpanAnnA -> TcRn () -> TcRn ()
forall ann a. EpAnn ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
case HsBindLR GhcRn GhcRn
mbind of
FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
_ Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
mg }
| Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
returnMName, MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
mg Maybe Name -> Maybe Name -> Bool
forall a. Eq a => a -> a -> Bool
/= Name -> Maybe Name
forall a. a -> Maybe a
Just Name
pureAName
-> NonCanonical_Monad -> TcRn ()
addWarnNonCanonicalMonad NonCanonical_Monad
NonCanonical_Return
| Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
thenMName, MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
mg Maybe Name -> Maybe Name -> Bool
forall a. Eq a => a -> a -> Bool
/= Name -> Maybe Name
forall a. a -> Maybe a
Just Name
thenAName
-> NonCanonical_Monad -> TcRn ()
addWarnNonCanonicalMonad NonCanonical_Monad
NonCanonical_ThenM
HsBindLR GhcRn GhcRn
_ -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
checkCanonicalMonoidInstances :: TcRn ()
checkCanonicalMonoidInstances
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
semigroupClassName =
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ LHsBinds GhcRn
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
mbinds ((GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ())
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(L SrcSpanAnnA
loc HsBindLR GhcRn GhcRn
mbind) -> SrcSpanAnnA -> TcRn () -> TcRn ()
forall ann a. EpAnn ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
case HsBindLR GhcRn GhcRn
mbind of
FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
_ Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
mg }
| Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
sappendName, MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
mg Maybe Name -> Maybe Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name -> Maybe Name
forall a. a -> Maybe a
Just Name
mappendName
-> NonCanonical_Monoid -> TcRn ()
addWarnNonCanonicalMonoid NonCanonical_Monoid
NonCanonical_Sappend
HsBindLR GhcRn GhcRn
_ -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
monoidClassName =
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ LHsBinds GhcRn
[GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn)]
mbinds ((GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ())
-> (GenLocated SrcSpanAnnA (HsBindLR GhcRn GhcRn) -> TcRn ())
-> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(L SrcSpanAnnA
loc HsBindLR GhcRn GhcRn
mbind) -> SrcSpanAnnA -> TcRn () -> TcRn ()
forall ann a. EpAnn ann -> TcRn a -> TcRn a
setSrcSpanA SrcSpanAnnA
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
case HsBindLR GhcRn GhcRn
mbind of
FunBind { fun_id :: forall idL idR. HsBindLR idL idR -> LIdP idL
fun_id = L SrcSpanAnnN
_ Name
name
, fun_matches :: forall idL idR. HsBindLR idL idR -> MatchGroup idR (LHsExpr idR)
fun_matches = MatchGroup GhcRn (LHsExpr GhcRn)
mg }
| Name
name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
mappendName, MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
mg Maybe Name -> Maybe Name -> Bool
forall a. Eq a => a -> a -> Bool
/= Name -> Maybe Name
forall a. a -> Maybe a
Just Name
sappendName
-> NonCanonical_Monoid -> TcRn ()
addWarnNonCanonicalMonoid NonCanonical_Monoid
NonCanonical_Mappend
HsBindLR GhcRn GhcRn
_ -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
isAliasMG :: MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG :: MatchGroup GhcRn (LHsExpr GhcRn) -> Maybe Name
isAliasMG MG {mg_alts :: forall p body. MatchGroup p body -> XRec p [LMatch p body]
mg_alts = (L SrcSpanAnnLW
_ [L SrcSpanAnnA
_ (Match { m_pats :: forall p body. Match p body -> XRec p [LPat p]
m_pats = L EpaLocation
_ []
, m_grhss :: forall p body. Match p body -> GRHSs p body
m_grhss = GRHSs GhcRn (GenLocated SrcSpanAnnA (HsExpr GhcRn))
grhss })])}
| GRHSs XCGRHSs GhcRn (GenLocated SrcSpanAnnA (HsExpr GhcRn))
_ [L EpAnnCO
_ (GRHS XCGRHS GhcRn (GenLocated SrcSpanAnnA (HsExpr GhcRn))
_ [] GenLocated SrcSpanAnnA (HsExpr GhcRn)
body)] HsLocalBinds GhcRn
lbinds <- GRHSs GhcRn (GenLocated SrcSpanAnnA (HsExpr GhcRn))
grhss
, EmptyLocalBinds XEmptyLocalBinds GhcRn GhcRn
_ <- HsLocalBinds GhcRn
lbinds
, HsVar XVar GhcRn
_ LIdP GhcRn
lrhsName <- GenLocated SrcSpanAnnA (HsExpr GhcRn) -> HsExpr GhcRn
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnA (HsExpr GhcRn)
body = Name -> Maybe Name
forall a. a -> Maybe a
Just (GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc LIdP GhcRn
GenLocated SrcSpanAnnN Name
lrhsName)
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
_ = Maybe Name
forall a. Maybe a
Nothing
addWarnNonCanonicalMonoid :: NonCanonical_Monoid -> TcRn ()
addWarnNonCanonicalMonoid NonCanonical_Monoid
reason =
NonCanonicalDefinition -> TcRn ()
addWarnNonCanonicalDefinition (NonCanonical_Monoid -> NonCanonicalDefinition
NonCanonicalMonoid NonCanonical_Monoid
reason)
addWarnNonCanonicalMonad :: NonCanonical_Monad -> TcRn ()
addWarnNonCanonicalMonad NonCanonical_Monad
reason =
NonCanonicalDefinition -> TcRn ()
addWarnNonCanonicalDefinition (NonCanonical_Monad -> NonCanonicalDefinition
NonCanonicalMonad NonCanonical_Monad
reason)
addWarnNonCanonicalDefinition :: NonCanonicalDefinition -> TcRn ()
addWarnNonCanonicalDefinition NonCanonicalDefinition
reason =
TcRnMessage -> TcRn ()
addDiagnostic (NonCanonicalDefinition -> LHsSigType GhcRn -> TcRnMessage
TcRnNonCanonicalDefinition NonCanonicalDefinition
reason LHsSigType GhcRn
poly_ty)
rnClsInstDecl :: ClsInstDecl GhcPs -> RnM (ClsInstDecl GhcRn, FreeVars)
rnClsInstDecl :: ClsInstDecl GhcPs -> RnM (ClsInstDecl GhcRn, FreeVars)
rnClsInstDecl (ClsInstDecl { cid_ext :: forall pass. ClsInstDecl pass -> XCClsInstDecl pass
cid_ext = (Maybe (GenLocated SrcSpanAnnP (WarningTxt GhcPs))
inst_warn_ps, AnnClsInstDecl
_, AnnSortKey DeclTag
_)
, cid_poly_ty :: forall pass. ClsInstDecl pass -> LHsSigType pass
cid_poly_ty = LHsSigType GhcPs
inst_ty, cid_binds :: forall pass. ClsInstDecl pass -> LHsBinds pass
cid_binds = LHsBinds GhcPs
mbinds
, cid_sigs :: forall pass. ClsInstDecl pass -> [LSig pass]
cid_sigs = [LSig GhcPs]
uprags, cid_tyfam_insts :: forall pass. ClsInstDecl pass -> [LTyFamInstDecl pass]
cid_tyfam_insts = [LTyFamInstDecl GhcPs]
ats
, cid_overlap_mode :: forall pass. ClsInstDecl pass -> Maybe (XRec pass OverlapMode)
cid_overlap_mode = Maybe (XRec GhcPs OverlapMode)
oflag
, cid_datafam_insts :: forall pass. ClsInstDecl pass -> [LDataFamInstDecl pass]
cid_datafam_insts = [LDataFamInstDecl GhcPs]
adts })
= do { HsDocContext -> LHsSigType GhcPs -> TcRn ()
checkInferredVars HsDocContext
ctxt LHsSigType GhcPs
inst_ty
; (inst_ty', inst_fvs) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, FreeVars)
rnHsSigType HsDocContext
ctxt TypeOrKind
TypeLevel LHsSigType GhcPs
inst_ty
; let (ktv_names, _, head_ty') = splitLHsInstDeclTy inst_ty'
mb_nested_msg = NestedForallsContextsIn
-> LHsType GhcRn -> Maybe (SrcSpan, TcRnMessage)
noNestedForallsContextsErr
NestedForallsContextsIn
NFC_InstanceHead LHsType GhcRn
head_ty'
eith_cls = case LHsType GhcRn -> Maybe (LocatedN (IdP GhcRn))
forall (p :: Pass).
(Anno (IdGhcP p) ~ SrcSpanAnnN) =>
LHsType (GhcPass p) -> Maybe (LocatedN (IdP (GhcPass p)))
hsTyGetAppHead_maybe LHsType GhcRn
head_ty' of
Just (L SrcSpanAnnN
_ IdP GhcRn
cls) -> Name -> Either (SrcSpan, TcRnMessage) Name
forall a b. b -> Either a b
Right IdP GhcRn
Name
cls
Maybe (LocatedN (IdP GhcRn))
Nothing ->
(SrcSpan, TcRnMessage) -> Either (SrcSpan, TcRnMessage) Name
forall a b. a -> Either a b
Left
( GenLocated SrcSpanAnnA (HsType GhcRn) -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA LHsType GhcRn
GenLocated SrcSpanAnnA (HsType GhcRn)
head_ty'
, IllegalInstanceReason -> TcRnMessage
TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
-> IllegalInstanceReason -> TcRnMessage
forall a b. (a -> b) -> a -> b
$
TypedThing -> IllegalClassInstanceReason -> IllegalInstanceReason
IllegalClassInstance (HsType GhcRn -> TypedThing
HsTypeRnThing (HsType GhcRn -> TypedThing) -> HsType GhcRn -> TypedThing
forall a b. (a -> b) -> a -> b
$ GenLocated SrcSpanAnnA (HsType GhcRn) -> HsType GhcRn
forall l e. GenLocated l e -> e
unLoc LHsType GhcRn
GenLocated SrcSpanAnnA (HsType GhcRn)
head_ty') (IllegalClassInstanceReason -> IllegalInstanceReason)
-> IllegalClassInstanceReason -> IllegalInstanceReason
forall a b. (a -> b) -> a -> b
$
IllegalInstanceHeadReason -> IllegalClassInstanceReason
IllegalInstanceHead (IllegalInstanceHeadReason -> IllegalClassInstanceReason)
-> IllegalInstanceHeadReason -> IllegalClassInstanceReason
forall a b. (a -> b) -> a -> b
$ Maybe TyCon -> IllegalInstanceHeadReason
InstHeadNonClass Maybe TyCon
forall a. Maybe a
Nothing
)
; cls <- case (mb_nested_msg, eith_cls) of
(Maybe (SrcSpan, TcRnMessage)
Nothing, Right Name
cls) -> Name -> IOEnv (Env TcGblEnv TcLclEnv) Name
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Name
cls
(Just (SrcSpan, TcRnMessage)
err1, Either (SrcSpan, TcRnMessage) Name
_) -> (SrcSpan, TcRnMessage) -> IOEnv (Env TcGblEnv TcLclEnv) Name
bail_out (SrcSpan, TcRnMessage)
err1
(Maybe (SrcSpan, TcRnMessage)
_, Left (SrcSpan, TcRnMessage)
err2) -> (SrcSpan, TcRnMessage) -> IOEnv (Env TcGblEnv TcLclEnv) Name
bail_out (SrcSpan, TcRnMessage)
err2
; (mbinds', uprags', meth_fvs) <- rnMethodBinds False cls ktv_names mbinds uprags
; checkCanonicalInstances cls inst_ty' mbinds'
; traceRn "rnSrcInstDecl" (ppr inst_ty' $$ ppr ktv_names)
; ((ats', adts'), more_fvs)
<- bindLocalNamesFV ktv_names $
do { (ats', at_fvs) <- rnATInstDecls rnTyFamInstDecl cls ktv_names ats
; (adts', adt_fvs) <- rnATInstDecls rnDataFamInstDecl cls ktv_names adts
; return ( (ats', adts'), at_fvs `plusFV` adt_fvs) }
; let all_fvs = FreeVars
meth_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
more_fvs
FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
inst_fvs
; inst_warn_rn <- mapM rnLWarningTxt inst_warn_ps
; return (ClsInstDecl { cid_ext = inst_warn_rn
, cid_poly_ty = inst_ty', cid_binds = mbinds'
, cid_sigs = uprags', cid_tyfam_insts = ats'
, cid_overlap_mode = oflag
, cid_datafam_insts = adts' },
all_fvs) }
where
ctxt :: HsDocContext
ctxt = SDoc -> HsDocContext
GenericCtx (SDoc -> HsDocContext) -> SDoc -> HsDocContext
forall a b. (a -> b) -> a -> b
$ String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"an instance declaration"
bail_out :: (SrcSpan, TcRnMessage) -> IOEnv (Env TcGblEnv TcLclEnv) Name
bail_out (SrcSpan
l, TcRnMessage
err_msg) = do
SrcSpan -> TcRnMessage -> TcRn ()
addErrAt SrcSpan
l (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ HsDocContext -> TcRnMessage -> TcRnMessage
TcRnWithHsDocContext HsDocContext
ctxt TcRnMessage
err_msg
Name -> IOEnv (Env TcGblEnv TcLclEnv) Name
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Name -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> Name -> IOEnv (Env TcGblEnv TcLclEnv) Name
forall a b. (a -> b) -> a -> b
$ OccName -> Name
mkUnboundName (CLabelString -> OccName
mkTcOccFS (String -> CLabelString
fsLit String
"<class>"))
rnFamEqn :: HsDocContext
-> AssocTyFamInfo
-> FamEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', FreeVars))
-> RnM (FamEqn GhcRn rhs', FreeVars)
rnFamEqn :: forall rhs rhs'.
HsDocContext
-> AssocTyFamInfo
-> FamEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', FreeVars))
-> RnM (FamEqn GhcRn rhs', FreeVars)
rnFamEqn HsDocContext
doc AssocTyFamInfo
atfi
(FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
feqn_tycon = LIdP GhcPs
tycon
, feqn_bndrs :: forall pass rhs. FamEqn pass rhs -> HsOuterFamEqnTyVarBndrs pass
feqn_bndrs = HsOuterFamEqnTyVarBndrs GhcPs
outer_bndrs
, feqn_pats :: forall pass rhs. FamEqn pass rhs -> HsFamEqnPats pass
feqn_pats = HsFamEqnPats GhcPs
pats
, feqn_fixity :: forall pass rhs. FamEqn pass rhs -> LexicalFixity
feqn_fixity = LexicalFixity
fixity
, feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
feqn_rhs = rhs
payload }) HsDocContext -> rhs -> RnM (rhs', FreeVars)
rn_payload
= do { tycon' <- Maybe Name
-> GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupFamInstName Maybe Name
mb_cls LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
; all_imp_vars <- filterInScopeM $ pat_kity_vars
; bindHsOuterTyVarBndrs doc mb_cls all_imp_vars outer_bndrs $ \HsOuterTyVarBndrs () GhcRn
rn_outer_bndrs ->
do { (pats', pat_fvs) <- HsDocContext
-> HsFamEqnPats GhcPs -> RnM ([LHsTypeArg GhcRn], FreeVars)
rnLHsTypeArgs (GenLocated SrcSpanAnnN RdrName -> HsDocContext
FamPatCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon) HsFamEqnPats GhcPs
pats
; (payload', rhs_fvs) <- rn_payload doc payload
; let
rn_outer_bndrs' = (XHsOuterImplicit GhcRn -> XHsOuterImplicit GhcRn)
-> HsOuterTyVarBndrs () GhcRn -> HsOuterTyVarBndrs () GhcRn
forall pass flag.
(XHsOuterImplicit pass -> XHsOuterImplicit pass)
-> HsOuterTyVarBndrs flag pass -> HsOuterTyVarBndrs flag pass
mapHsOuterImplicit ((Name -> Name) -> [Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (Name -> SrcSpan -> Name
`setNameLoc` SrcSpan
lhs_loc))
HsOuterTyVarBndrs () GhcRn
rn_outer_bndrs
groups :: [NonEmpty (LocatedN RdrName)]
groups = (GenLocated SrcSpanAnnN RdrName
-> GenLocated SrcSpanAnnN RdrName -> Ordering)
-> FreeKiTyVars -> [NonEmpty (GenLocated SrcSpanAnnN RdrName)]
forall a. (a -> a -> Ordering) -> [a] -> [NonEmpty a]
equivClasses GenLocated SrcSpanAnnN RdrName
-> GenLocated SrcSpanAnnN RdrName -> Ordering
forall a l. Ord a => GenLocated l a -> GenLocated l a -> Ordering
cmpLocated FreeKiTyVars
pat_kity_vars
; nms_dups <- mapM (lookupOccRn . unLoc) $
[ tv | (tv :| (_:_)) <- groups ]
; let nms_used = FreeVars -> [Name] -> FreeVars
extendNameSetList FreeVars
rhs_fvs ([Name] -> FreeVars) -> [Name] -> FreeVars
forall a b. (a -> b) -> a -> b
$
[Name]
nms_dups [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
inst_head_tvs
all_nms = HsOuterTyVarBndrs () GhcRn -> [Name]
forall flag. HsOuterTyVarBndrs flag GhcRn -> [Name]
hsOuterTyVarNames HsOuterTyVarBndrs () GhcRn
rn_outer_bndrs'
; warnUnusedTypePatterns all_nms nms_used
; let improperly_scoped Name
cls_tkv =
Name
cls_tkv Name -> FreeVars -> Bool
`elemNameSet` FreeVars
rhs_fvs
Bool -> Bool -> Bool
&& Bool -> Bool
not (Name
cls_tkv Name -> FreeVars -> Bool
`elemNameSet` FreeVars
pat_fvs)
bad_tvs = (Name -> Bool) -> [Name] -> [Name]
forall a. (a -> Bool) -> [a] -> [a]
filter Name -> Bool
improperly_scoped [Name]
inst_head_tvs
; for_ (nonEmpty bad_tvs) $ \ NonEmpty Name
ne_bad_tvs ->
TcRnMessage -> TcRn ()
addErr (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$
IllegalInstanceReason -> TcRnMessage
TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
-> IllegalInstanceReason -> TcRnMessage
forall a b. (a -> b) -> a -> b
$ IllegalFamilyInstanceReason -> IllegalInstanceReason
IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
-> IllegalFamilyInstanceReason -> IllegalInstanceReason
forall a b. (a -> b) -> a -> b
$
Maybe (TyCon, [Type], TyVarSet)
-> NonEmpty Name -> IllegalFamilyInstanceReason
FamInstRHSOutOfScopeTyVars Maybe (TyCon, [Type], TyVarSet)
forall a. Maybe a
Nothing NonEmpty Name
ne_bad_tvs
; let eqn_fvs = FreeVars
rhs_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
pat_fvs
all_fvs = case AssocTyFamInfo
atfi of
NonAssocTyFamEqn ClosedTyFamInfo
ClosedTyFam
-> FreeVars
eqn_fvs
AssocTyFamInfo
_ -> FreeVars
eqn_fvs FreeVars -> Name -> FreeVars
`addOneFV` GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnN Name
tycon'
; return (FamEqn { feqn_ext = noAnn
, feqn_tycon = tycon'
, feqn_bndrs = rn_outer_bndrs'
, feqn_pats = pats'
, feqn_fixity = fixity
, feqn_rhs = payload' },
all_fvs) } }
where
mb_cls :: Maybe Name
mb_cls = case AssocTyFamInfo
atfi of
NonAssocTyFamEqn ClosedTyFamInfo
_ -> Maybe Name
forall a. Maybe a
Nothing
AssocTyFamDeflt Name
cls -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
cls
AssocTyFamInst Name
cls [Name]
_ -> Name -> Maybe Name
forall a. a -> Maybe a
Just Name
cls
inst_head_tvs :: [Name]
inst_head_tvs = case AssocTyFamInfo
atfi of
NonAssocTyFamEqn ClosedTyFamInfo
_ -> []
AssocTyFamDeflt Name
_ -> []
AssocTyFamInst Name
_ [Name]
inst_head_tvs -> [Name]
inst_head_tvs
pat_kity_vars :: FreeKiTyVars
pat_kity_vars = HsFamEqnPats GhcPs -> FreeKiTyVars
extractHsTyArgRdrKiTyVars HsFamEqnPats GhcPs
pats
lhs_loc :: SrcSpan
lhs_loc = case (HsArg
GhcPs
(GenLocated SrcSpanAnnA (HsType GhcPs))
(GenLocated SrcSpanAnnA (HsType GhcPs))
-> SrcSpan)
-> [HsArg
GhcPs
(GenLocated SrcSpanAnnA (HsType GhcPs))
(GenLocated SrcSpanAnnA (HsType GhcPs))]
-> [SrcSpan]
forall a b. (a -> b) -> [a] -> [b]
map LHsTypeArg GhcPs -> SrcSpan
HsArg
GhcPs
(GenLocated SrcSpanAnnA (HsType GhcPs))
(GenLocated SrcSpanAnnA (HsType GhcPs))
-> SrcSpan
lhsTypeArgSrcSpan HsFamEqnPats GhcPs
[HsArg
GhcPs
(GenLocated SrcSpanAnnA (HsType GhcPs))
(GenLocated SrcSpanAnnA (HsType GhcPs))]
pats of
[] -> String -> SrcSpan
forall a. HasCallStack => String -> a
panic String
"rnFamEqn.lhs_loc"
[SrcSpan
loc] -> SrcSpan
loc
(SrcSpan
loc:[SrcSpan]
locs) -> SrcSpan
loc SrcSpan -> SrcSpan -> SrcSpan
`combineSrcSpans` [SrcSpan] -> SrcSpan
forall a. HasCallStack => [a] -> a
last [SrcSpan]
locs
rnTyFamInstDecl :: AssocTyFamInfo
-> TyFamInstDecl GhcPs
-> RnM (TyFamInstDecl GhcRn, FreeVars)
rnTyFamInstDecl :: AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, FreeVars)
rnTyFamInstDecl AssocTyFamInfo
atfi (TyFamInstDecl { tfid_xtn :: forall pass. TyFamInstDecl pass -> XCTyFamInstDecl pass
tfid_xtn = XCTyFamInstDecl GhcPs
x, tfid_eqn :: forall pass. TyFamInstDecl pass -> TyFamInstEqn pass
tfid_eqn = TyFamInstEqn GhcPs
eqn })
= do { (eqn', fvs) <- AssocTyFamInfo
-> TyFamInstEqn GhcPs -> RnM (TyFamInstEqn GhcRn, FreeVars)
rnTyFamInstEqn AssocTyFamInfo
atfi TyFamInstEqn GhcPs
eqn
; return (TyFamInstDecl { tfid_xtn = x, tfid_eqn = eqn' }, fvs) }
data AssocTyFamInfo
= NonAssocTyFamEqn
ClosedTyFamInfo
| AssocTyFamDeflt
Name
| AssocTyFamInst
Name
[Name]
data ClosedTyFamInfo
= NotClosedTyFam
| ClosedTyFam
rnTyFamInstEqn :: AssocTyFamInfo
-> TyFamInstEqn GhcPs
-> RnM (TyFamInstEqn GhcRn, FreeVars)
rnTyFamInstEqn :: AssocTyFamInfo
-> TyFamInstEqn GhcPs -> RnM (TyFamInstEqn GhcRn, FreeVars)
rnTyFamInstEqn AssocTyFamInfo
atfi eqn :: TyFamInstEqn GhcPs
eqn@(FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
feqn_tycon = LIdP GhcPs
tycon })
= HsDocContext
-> AssocTyFamInfo
-> FamEqn GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))
-> (HsDocContext
-> GenLocated SrcSpanAnnA (HsType GhcPs)
-> RnM (GenLocated SrcSpanAnnA (HsType GhcRn), FreeVars))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars)
forall rhs rhs'.
HsDocContext
-> AssocTyFamInfo
-> FamEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', FreeVars))
-> RnM (FamEqn GhcRn rhs', FreeVars)
rnFamEqn (GenLocated SrcSpanAnnN RdrName -> HsDocContext
TySynCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon) AssocTyFamInfo
atfi TyFamInstEqn GhcPs
FamEqn GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))
eqn HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
HsDocContext
-> GenLocated SrcSpanAnnA (HsType GhcPs)
-> RnM (GenLocated SrcSpanAnnA (HsType GhcRn), FreeVars)
rnTySyn
rnTyFamDefltDecl :: Name
-> TyFamDefltDecl GhcPs
-> RnM (TyFamDefltDecl GhcRn, FreeVars)
rnTyFamDefltDecl :: Name -> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, FreeVars)
rnTyFamDefltDecl Name
cls = AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, FreeVars)
rnTyFamInstDecl (Name -> AssocTyFamInfo
AssocTyFamDeflt Name
cls)
rnDataFamInstDecl :: AssocTyFamInfo
-> DataFamInstDecl GhcPs
-> RnM (DataFamInstDecl GhcRn, FreeVars)
rnDataFamInstDecl :: AssocTyFamInfo
-> DataFamInstDecl GhcPs -> RnM (DataFamInstDecl GhcRn, FreeVars)
rnDataFamInstDecl AssocTyFamInfo
atfi (DataFamInstDecl { dfid_eqn :: forall pass. DataFamInstDecl pass -> FamEqn pass (HsDataDefn pass)
dfid_eqn =
eqn :: FamEqn GhcPs (HsDataDefn GhcPs)
eqn@(FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
feqn_tycon = LIdP GhcPs
tycon })})
= do { (eqn', fvs) <-
HsDocContext
-> AssocTyFamInfo
-> FamEqn GhcPs (HsDataDefn GhcPs)
-> (HsDocContext
-> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, FreeVars))
-> RnM (FamEqn GhcRn (HsDataDefn GhcRn), FreeVars)
forall rhs rhs'.
HsDocContext
-> AssocTyFamInfo
-> FamEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', FreeVars))
-> RnM (FamEqn GhcRn rhs', FreeVars)
rnFamEqn (GenLocated SrcSpanAnnN RdrName -> HsDocContext
TyDataCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon) AssocTyFamInfo
atfi FamEqn GhcPs (HsDataDefn GhcPs)
eqn HsDocContext
-> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, FreeVars)
rnDataDefn
; return (DataFamInstDecl { dfid_eqn = eqn' }, fvs) }
rnATDecls :: Name
-> [Name]
-> [LFamilyDecl GhcPs]
-> RnM ([LFamilyDecl GhcRn], FreeVars)
rnATDecls :: Name
-> [Name]
-> [LFamilyDecl GhcPs]
-> RnM ([LFamilyDecl GhcRn], FreeVars)
rnATDecls Name
cls [Name]
cls_tvs [LFamilyDecl GhcPs]
at_decls
= (FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, FreeVars))
-> [LocatedA (FamilyDecl GhcPs)]
-> RnM ([LocatedA (FamilyDecl GhcRn)], FreeVars)
forall a b.
(a -> RnM (b, FreeVars))
-> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
rnList (Maybe (Name, [Name])
-> FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, FreeVars)
rnFamDecl ((Name, [Name]) -> Maybe (Name, [Name])
forall a. a -> Maybe a
Just (Name
cls, [Name]
cls_tvs))) [LFamilyDecl GhcPs]
[LocatedA (FamilyDecl GhcPs)]
at_decls
rnATInstDecls :: (AssocTyFamInfo ->
decl GhcPs ->
RnM (decl GhcRn, FreeVars))
-> Name
-> [Name]
-> [LocatedA (decl GhcPs)]
-> RnM ([LocatedA (decl GhcRn)], FreeVars)
rnATInstDecls :: forall (decl :: * -> *).
(AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, FreeVars))
-> Name
-> [Name]
-> [LocatedA (decl GhcPs)]
-> RnM ([LocatedA (decl GhcRn)], FreeVars)
rnATInstDecls AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, FreeVars)
rnFun Name
cls [Name]
tv_ns [LocatedA (decl GhcPs)]
at_insts
= (decl GhcPs -> RnM (decl GhcRn, FreeVars))
-> [LocatedA (decl GhcPs)]
-> RnM ([LocatedA (decl GhcRn)], FreeVars)
forall a b.
(a -> RnM (b, FreeVars))
-> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
rnList (AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, FreeVars)
rnFun (Name -> [Name] -> AssocTyFamInfo
AssocTyFamInst Name
cls [Name]
tv_ns)) [LocatedA (decl GhcPs)]
at_insts
rnSrcDerivDecl :: DerivDecl GhcPs -> RnM (DerivDecl GhcRn, FreeVars)
rnSrcDerivDecl :: DerivDecl GhcPs -> RnM (DerivDecl GhcRn, FreeVars)
rnSrcDerivDecl (DerivDecl (Maybe (GenLocated SrcSpanAnnP (WarningTxt GhcPs))
inst_warn_ps, AnnDerivDecl
ann) LHsSigWcType GhcPs
ty Maybe (LDerivStrategy GhcPs)
mds Maybe (XRec GhcPs OverlapMode)
overlap)
= do { standalone_deriv_ok <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.StandaloneDeriving
; unless standalone_deriv_ok (addErr TcRnUnexpectedStandaloneDerivingDecl)
; checkInferredVars ctxt nowc_ty
; (mds', ty', fvs) <- rnLDerivStrategy ctxt mds $ rnHsSigWcType ctxt ty
; addNoNestedForallsContextsErr ctxt
NFC_StandaloneDerivedInstanceHead
(getLHsInstDeclHead $ dropWildCards ty')
; inst_warn_rn <- mapM rnLWarningTxt inst_warn_ps
; return (DerivDecl (inst_warn_rn, ann) ty' mds' overlap, fvs) }
where
ctxt :: HsDocContext
ctxt = HsDocContext
DerivDeclCtx
nowc_ty :: LHsSigType GhcPs
nowc_ty = LHsSigWcType GhcPs -> LHsSigType GhcPs
forall (p :: Pass).
LHsSigWcType (GhcPass p) -> LHsSigType (GhcPass p)
dropWildCards LHsSigWcType GhcPs
ty
rnHsRuleDecls :: RuleDecls GhcPs -> RnM (RuleDecls GhcRn, FreeVars)
rnHsRuleDecls :: RuleDecls GhcPs -> RnM (RuleDecls GhcRn, FreeVars)
rnHsRuleDecls (HsRules { rds_ext :: forall pass. RuleDecls pass -> XCRuleDecls pass
rds_ext = ((EpaLocation, EpToken "#-}")
_, SourceText
src)
, rds_rules :: forall pass. RuleDecls pass -> [LRuleDecl pass]
rds_rules = [LRuleDecl GhcPs]
rules })
= do { (rn_rules,fvs) <- (RuleDecl GhcPs -> RnM (RuleDecl GhcRn, FreeVars))
-> [LocatedA (RuleDecl GhcPs)]
-> RnM ([LocatedA (RuleDecl GhcRn)], FreeVars)
forall a b.
(a -> RnM (b, FreeVars))
-> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
rnList RuleDecl GhcPs -> RnM (RuleDecl GhcRn, FreeVars)
rnHsRuleDecl [LRuleDecl GhcPs]
[LocatedA (RuleDecl GhcPs)]
rules
; return (HsRules { rds_ext = src
, rds_rules = rn_rules }, fvs) }
rnHsRuleDecl :: RuleDecl GhcPs -> RnM (RuleDecl GhcRn, FreeVars)
rnHsRuleDecl :: RuleDecl GhcPs -> RnM (RuleDecl GhcRn, FreeVars)
rnHsRuleDecl (HsRule { rd_ext :: forall pass. RuleDecl pass -> XHsRule pass
rd_ext = (HsRuleAnn
_, SourceText
st)
, rd_name :: forall pass. RuleDecl pass -> XRec pass CLabelString
rd_name = XRec GhcPs CLabelString
rule_name
, rd_act :: forall pass. RuleDecl pass -> Activation
rd_act = Activation
act
, rd_tyvs :: forall pass.
RuleDecl pass -> Maybe [LHsTyVarBndr () (NoGhcTc pass)]
rd_tyvs = Maybe [LHsTyVarBndr () (NoGhcTc GhcPs)]
tyvs
, rd_tmvs :: forall pass. RuleDecl pass -> [LRuleBndr pass]
rd_tmvs = [LRuleBndr GhcPs]
tmvs
, rd_lhs :: forall pass. RuleDecl pass -> XRec pass (HsExpr pass)
rd_lhs = XRec GhcPs (HsExpr GhcPs)
lhs
, rd_rhs :: forall pass. RuleDecl pass -> XRec pass (HsExpr pass)
rd_rhs = XRec GhcPs (HsExpr GhcPs)
rhs })
= do { let rdr_names_w_loc :: FreeKiTyVars
rdr_names_w_loc = (GenLocated EpAnnCO (RuleBndr GhcPs)
-> GenLocated SrcSpanAnnN RdrName)
-> [GenLocated EpAnnCO (RuleBndr GhcPs)] -> FreeKiTyVars
forall a b. (a -> b) -> [a] -> [b]
map (RuleBndr GhcPs -> GenLocated SrcSpanAnnN RdrName
get_var (RuleBndr GhcPs -> GenLocated SrcSpanAnnN RdrName)
-> (GenLocated EpAnnCO (RuleBndr GhcPs) -> RuleBndr GhcPs)
-> GenLocated EpAnnCO (RuleBndr GhcPs)
-> GenLocated SrcSpanAnnN RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated EpAnnCO (RuleBndr GhcPs) -> RuleBndr GhcPs
forall l e. GenLocated l e -> e
unLoc) [LRuleBndr GhcPs]
[GenLocated EpAnnCO (RuleBndr GhcPs)]
tmvs
; FreeKiTyVars -> TcRn ()
checkDupRdrNames FreeKiTyVars
rdr_names_w_loc
; FreeKiTyVars -> TcRn ()
checkShadowedRdrNames FreeKiTyVars
rdr_names_w_loc
; names <- FreeKiTyVars -> IOEnv (Env TcGblEnv TcLclEnv) [Name]
newLocalBndrsRn FreeKiTyVars
rdr_names_w_loc
; let doc = CLabelString -> HsDocContext
RuleCtx (GenLocated EpAnnCO CLabelString -> CLabelString
forall l e. GenLocated l e -> e
unLoc XRec GhcPs CLabelString
GenLocated EpAnnCO CLabelString
rule_name)
; bindRuleTyVars doc tyvs $ \ Maybe [LHsTyVarBndr () GhcRn]
tyvs' ->
HsDocContext
-> Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
-> [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (RuleDecl GhcRn, FreeVars))
-> RnM (RuleDecl GhcRn, FreeVars)
forall ty_bndrs a.
HsDocContext
-> Maybe ty_bndrs
-> [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
bindRuleTmVars HsDocContext
doc Maybe [LHsTyVarBndr () GhcRn]
Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
tyvs' [LRuleBndr GhcPs]
tmvs [Name]
names (([LRuleBndr GhcRn] -> RnM (RuleDecl GhcRn, FreeVars))
-> RnM (RuleDecl GhcRn, FreeVars))
-> ([LRuleBndr GhcRn] -> RnM (RuleDecl GhcRn, FreeVars))
-> RnM (RuleDecl GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ [LRuleBndr GhcRn]
tmvs' ->
do { (lhs', fv_lhs') <- XRec GhcPs (HsExpr GhcPs) -> TcM (LHsExpr GhcRn, FreeVars)
rnLExpr XRec GhcPs (HsExpr GhcPs)
lhs
; (rhs', fv_rhs') <- rnLExpr rhs
; checkValidRule (unLoc rule_name) names lhs' fv_lhs'
; return (HsRule { rd_ext = (HsRuleRn fv_lhs' fv_rhs', st)
, rd_name = rule_name
, rd_act = act
, rd_tyvs = tyvs'
, rd_tmvs = tmvs'
, rd_lhs = lhs'
, rd_rhs = rhs' }, fv_lhs' `plusFV` fv_rhs') } }
where
get_var :: RuleBndr GhcPs -> LocatedN RdrName
get_var :: RuleBndr GhcPs -> GenLocated SrcSpanAnnN RdrName
get_var (RuleBndrSig XRuleBndrSig GhcPs
_ LIdP GhcPs
v HsPatSigType GhcPs
_) = LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
v
get_var (RuleBndr XCRuleBndr GhcPs
_ LIdP GhcPs
v) = LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
v
bindRuleTmVars :: HsDocContext -> Maybe ty_bndrs
-> [LRuleBndr GhcPs] -> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
bindRuleTmVars :: forall ty_bndrs a.
HsDocContext
-> Maybe ty_bndrs
-> [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
bindRuleTmVars HsDocContext
doc Maybe ty_bndrs
tyvs [LRuleBndr GhcPs]
vars [Name]
names [LRuleBndr GhcRn] -> RnM (a, FreeVars)
thing_inside
= [GenLocated EpAnnCO (RuleBndr GhcPs)]
-> [Name]
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
go [LRuleBndr GhcPs]
[GenLocated EpAnnCO (RuleBndr GhcPs)]
vars [Name]
names (([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars))
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ [GenLocated EpAnnCO (RuleBndr GhcRn)]
vars' ->
[Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars)
forall a. [Name] -> RnM (a, FreeVars) -> RnM (a, FreeVars)
bindLocalNamesFV [Name]
names ([LRuleBndr GhcRn] -> RnM (a, FreeVars)
thing_inside [LRuleBndr GhcRn]
[GenLocated EpAnnCO (RuleBndr GhcRn)]
vars')
where
go :: [GenLocated EpAnnCO (RuleBndr GhcPs)]
-> [Name]
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
go ((L EpAnnCO
l (RuleBndr XCRuleBndr GhcPs
_ (L SrcSpanAnnN
loc RdrName
_))) : [GenLocated EpAnnCO (RuleBndr GhcPs)]
vars) (Name
n : [Name]
ns) [GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
thing_inside
= [GenLocated EpAnnCO (RuleBndr GhcPs)]
-> [Name]
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
go [GenLocated EpAnnCO (RuleBndr GhcPs)]
vars [Name]
ns (([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars))
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ [GenLocated EpAnnCO (RuleBndr GhcRn)]
vars' ->
[GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
thing_inside (EpAnnCO -> RuleBndr GhcRn -> GenLocated EpAnnCO (RuleBndr GhcRn)
forall l e. l -> e -> GenLocated l e
L EpAnnCO
l (XCRuleBndr GhcRn -> LIdP GhcRn -> RuleBndr GhcRn
forall pass. XCRuleBndr pass -> LIdP pass -> RuleBndr pass
RuleBndr XCRuleBndr GhcRn
AnnTyVarBndr
forall a. NoAnn a => a
noAnn (SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
loc Name
n)) GenLocated EpAnnCO (RuleBndr GhcRn)
-> [GenLocated EpAnnCO (RuleBndr GhcRn)]
-> [GenLocated EpAnnCO (RuleBndr GhcRn)]
forall a. a -> [a] -> [a]
: [GenLocated EpAnnCO (RuleBndr GhcRn)]
vars')
go ((L EpAnnCO
l (RuleBndrSig XRuleBndrSig GhcPs
_ (L SrcSpanAnnN
loc RdrName
_) HsPatSigType GhcPs
bsig)) : [GenLocated EpAnnCO (RuleBndr GhcPs)]
vars)
(Name
n : [Name]
ns) [GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
thing_inside
= HsPatSigTypeScoping
-> HsDocContext
-> HsPatSigType GhcPs
-> (HsPatSigType GhcRn -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
forall a.
HsPatSigTypeScoping
-> HsDocContext
-> HsPatSigType GhcPs
-> (HsPatSigType GhcRn -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
rnHsPatSigType HsPatSigTypeScoping
bind_free_tvs HsDocContext
doc HsPatSigType GhcPs
bsig ((HsPatSigType GhcRn -> RnM (a, FreeVars)) -> RnM (a, FreeVars))
-> (HsPatSigType GhcRn -> RnM (a, FreeVars)) -> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ HsPatSigType GhcRn
bsig' ->
[GenLocated EpAnnCO (RuleBndr GhcPs)]
-> [Name]
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
go [GenLocated EpAnnCO (RuleBndr GhcPs)]
vars [Name]
ns (([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars))
-> ([GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
forall a b. (a -> b) -> a -> b
$ \ [GenLocated EpAnnCO (RuleBndr GhcRn)]
vars' ->
[GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
thing_inside (EpAnnCO -> RuleBndr GhcRn -> GenLocated EpAnnCO (RuleBndr GhcRn)
forall l e. l -> e -> GenLocated l e
L EpAnnCO
l (XRuleBndrSig GhcRn
-> LIdP GhcRn -> HsPatSigType GhcRn -> RuleBndr GhcRn
forall pass.
XRuleBndrSig pass
-> LIdP pass -> HsPatSigType pass -> RuleBndr pass
RuleBndrSig XRuleBndrSig GhcRn
AnnTyVarBndr
forall a. NoAnn a => a
noAnn (SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
loc Name
n) HsPatSigType GhcRn
bsig') GenLocated EpAnnCO (RuleBndr GhcRn)
-> [GenLocated EpAnnCO (RuleBndr GhcRn)]
-> [GenLocated EpAnnCO (RuleBndr GhcRn)]
forall a. a -> [a] -> [a]
: [GenLocated EpAnnCO (RuleBndr GhcRn)]
vars')
go [] [] [GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
thing_inside = [GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
thing_inside []
go [GenLocated EpAnnCO (RuleBndr GhcPs)]
vars [Name]
names [GenLocated EpAnnCO (RuleBndr GhcRn)] -> RnM (a, FreeVars)
_ = String -> SDoc -> RnM (a, FreeVars)
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"bindRuleVars" ([GenLocated EpAnnCO (RuleBndr GhcPs)] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated EpAnnCO (RuleBndr GhcPs)]
vars SDoc -> SDoc -> SDoc
forall doc. IsDoc doc => doc -> doc -> doc
$$ [Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Name]
names)
bind_free_tvs :: HsPatSigTypeScoping
bind_free_tvs = case Maybe ty_bndrs
tyvs of Maybe ty_bndrs
Nothing -> HsPatSigTypeScoping
AlwaysBind
Just ty_bndrs
_ -> HsPatSigTypeScoping
NeverBind
bindRuleTyVars :: HsDocContext -> Maybe [LHsTyVarBndr () GhcPs]
-> (Maybe [LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars))
-> RnM (b, FreeVars)
bindRuleTyVars :: forall b.
HsDocContext
-> Maybe [LHsTyVarBndr () GhcPs]
-> (Maybe [LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars))
-> RnM (b, FreeVars)
bindRuleTyVars HsDocContext
doc (Just [LHsTyVarBndr () GhcPs]
bndrs) Maybe [LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars)
thing_inside
= HsDocContext
-> WarnUnusedForalls
-> Maybe (ZonkAny 5)
-> [LHsTyVarBndr () GhcPs]
-> ([LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars))
-> RnM (b, FreeVars)
forall flag a b.
OutputableBndrFlag flag 'Renamed =>
HsDocContext
-> WarnUnusedForalls
-> Maybe a
-> [LHsTyVarBndr flag GhcPs]
-> ([LHsTyVarBndr flag GhcRn] -> RnM (b, FreeVars))
-> RnM (b, FreeVars)
bindLHsTyVarBndrs HsDocContext
doc WarnUnusedForalls
WarnUnusedForalls Maybe (ZonkAny 5)
forall a. Maybe a
Nothing [LHsTyVarBndr () GhcPs]
bndrs (Maybe [LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars)
Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
-> RnM (b, FreeVars)
thing_inside (Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
-> RnM (b, FreeVars))
-> ([GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
-> Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)])
-> [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
-> RnM (b, FreeVars)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
-> Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
forall a. a -> Maybe a
Just)
bindRuleTyVars HsDocContext
_ Maybe [LHsTyVarBndr () GhcPs]
_ Maybe [LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars)
thing_inside = Maybe [LHsTyVarBndr () GhcRn] -> RnM (b, FreeVars)
thing_inside Maybe [LHsTyVarBndr () GhcRn]
Maybe [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
forall a. Maybe a
Nothing
checkValidRule :: FastString -> [Name] -> LHsExpr GhcRn -> NameSet -> RnM ()
checkValidRule :: CLabelString -> [Name] -> LHsExpr GhcRn -> FreeVars -> TcRn ()
checkValidRule CLabelString
rule_name [Name]
ids LHsExpr GhcRn
lhs' FreeVars
fv_lhs'
= do {
case ([Name] -> LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
validRuleLhs [Name]
ids LHsExpr GhcRn
lhs') of
Maybe (HsExpr GhcRn)
Nothing -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just HsExpr GhcRn
bad -> TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWithTc (CLabelString -> LHsExpr GhcRn -> HsExpr GhcRn -> TcRnMessage
badRuleLhsErr CLabelString
rule_name LHsExpr GhcRn
lhs' HsExpr GhcRn
bad)
; let bad_vars :: [Name]
bad_vars = [Name
var | Name
var <- [Name]
ids, Bool -> Bool
not (Name
var Name -> FreeVars -> Bool
`elemNameSet` FreeVars
fv_lhs')]
; (Name -> TcRn ()) -> [Name] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (TcRnMessage -> TcRn ()
addErr (TcRnMessage -> TcRn ())
-> (Name -> TcRnMessage) -> Name -> TcRn ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CLabelString -> Name -> TcRnMessage
TcRnUnusedVariableInRuleDecl CLabelString
rule_name) [Name]
bad_vars }
validRuleLhs :: [Name] -> LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
validRuleLhs :: [Name] -> LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
validRuleLhs [Name]
foralls LHsExpr GhcRn
lhs
= GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
lhs
where
checkl :: GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
checkl = HsExpr GhcRn -> Maybe (HsExpr GhcRn)
check (HsExpr GhcRn -> Maybe (HsExpr GhcRn))
-> (GenLocated SrcSpanAnnA (HsExpr GhcRn) -> HsExpr GhcRn)
-> GenLocated SrcSpanAnnA (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (HsExpr GhcRn) -> HsExpr GhcRn
forall l e. GenLocated l e -> e
unLoc
check :: HsExpr GhcRn -> Maybe (HsExpr GhcRn)
check (OpApp XOpApp GhcRn
_ LHsExpr GhcRn
e1 LHsExpr GhcRn
op LHsExpr GhcRn
e2) = GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
op Maybe (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall {p} {a}. p -> Maybe a
checkl_e LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
e1
Maybe (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall {p} {a}. p -> Maybe a
checkl_e LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
e2
check (HsApp XApp GhcRn
_ LHsExpr GhcRn
e1 LHsExpr GhcRn
e2) = GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
e1 Maybe (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall {p} {a}. p -> Maybe a
checkl_e LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
e2
check (HsAppType XAppTypeE GhcRn
_ LHsExpr GhcRn
e LHsWcType (NoGhcTc GhcRn)
_) = GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
e
check (HsVar XVar GhcRn
_ LIdP GhcRn
lv)
| (GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc LIdP GhcRn
GenLocated SrcSpanAnnN Name
lv) Name -> [Name] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Name]
foralls = Maybe (HsExpr GhcRn)
forall a. Maybe a
Nothing
check (HsPar XPar GhcRn
_ LHsExpr GhcRn
e) = GenLocated SrcSpanAnnA (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
GenLocated SrcSpanAnnA (HsExpr GhcRn)
e
check HsExpr GhcRn
other = HsExpr GhcRn -> Maybe (HsExpr GhcRn)
forall a. a -> Maybe a
Just HsExpr GhcRn
other
checkl_e :: p -> Maybe a
checkl_e p
_ = Maybe a
forall a. Maybe a
Nothing
badRuleLhsErr :: FastString -> LHsExpr GhcRn -> HsExpr GhcRn -> TcRnMessage
badRuleLhsErr :: CLabelString -> LHsExpr GhcRn -> HsExpr GhcRn -> TcRnMessage
badRuleLhsErr CLabelString
name LHsExpr GhcRn
lhs HsExpr GhcRn
bad_e
= RuleLhsErrReason
-> CLabelString -> LHsExpr GhcRn -> HsExpr GhcRn -> TcRnMessage
TcRnIllegalRuleLhs RuleLhsErrReason
errReason CLabelString
name LHsExpr GhcRn
lhs HsExpr GhcRn
bad_e
where
errReason :: RuleLhsErrReason
errReason = case HsExpr GhcRn
bad_e of
HsUnboundVar XUnboundVar GhcRn
_ RdrName
uv ->
RdrName -> NotInScopeError -> RuleLhsErrReason
UnboundVariable RdrName
uv (NotInScopeError -> RuleLhsErrReason)
-> NotInScopeError -> RuleLhsErrReason
forall a b. (a -> b) -> a -> b
$ WhereLooking -> RdrName -> NotInScopeError
notInScopeErr WhereLooking
WL_Global RdrName
uv
HsExpr GhcRn
_ -> RuleLhsErrReason
IllegalExpression
rnTyClDecls :: [TyClGroup GhcPs]
-> RnM ([TyClGroup GhcRn], FreeVars)
rnTyClDecls :: [TyClGroup GhcPs] -> RnM ([TyClGroup GhcRn], FreeVars)
rnTyClDecls [TyClGroup GhcPs]
tycl_ds
= do {
; tycls_w_fvs <- (GenLocated SrcSpanAnnA (TyClDecl GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars))
-> [GenLocated SrcSpanAnnA (TyClDecl GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((TyClDecl GhcPs -> TcM (TyClDecl GhcRn, FreeVars))
-> GenLocated SrcSpanAnnA (TyClDecl GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
forall a b c ann.
(a -> TcM (b, c))
-> GenLocated (EpAnn ann) a -> TcM (GenLocated (EpAnn ann) b, c)
wrapLocFstMA TyClDecl GhcPs -> TcM (TyClDecl GhcRn, FreeVars)
rnTyClDecl) ([TyClGroup GhcPs] -> [LTyClDecl GhcPs]
forall (p :: Pass).
[TyClGroup (GhcPass p)] -> [LTyClDecl (GhcPass p)]
tyClGroupTyClDecls [TyClGroup GhcPs]
tycl_ds)
; let tc_names = [Name] -> FreeVars
mkNameSet (((GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars) -> Name)
-> [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (TyClDecl GhcRn -> IdP GhcRn
TyClDecl GhcRn -> Name
forall (p :: Pass).
(Anno (IdGhcP p) ~ SrcSpanAnnN) =>
TyClDecl (GhcPass p) -> IdP (GhcPass p)
tcdName (TyClDecl GhcRn -> Name)
-> ((GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> TyClDecl GhcRn)
-> (GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
-> ((GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> GenLocated SrcSpanAnnA (TyClDecl GhcRn))
-> (GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> TyClDecl GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
forall a b. (a, b) -> a
fst) [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)]
tycls_w_fvs)
; traceRn "rnTyClDecls" $
vcat [ text "tyClGroupTyClDecls:" <+> ppr tycls_w_fvs
, text "tc_names:" <+> ppr tc_names ]
; kisigs_w_fvs <- rnStandaloneKindSignatures tc_names (tyClGroupKindSigs tycl_ds)
; instds_w_fvs <- mapM (wrapLocFstMA rnSrcInstDecl) (tyClGroupInstDecls tycl_ds)
; role_annots <- rnRoleAnnots tc_names (tyClGroupRoleDecls tycl_ds)
; rdr_env <- getGlobalRdrEnv
; traceRn "rnTyClDecls SCC analysis" $
vcat [ text "rdr_env:" <+> ppr rdr_env ]
; let tycl_sccs = GlobalRdrEnv
-> KindSig_FV_Env
-> [(LTyClDecl GhcRn, FreeVars)]
-> [SCC (LTyClDecl GhcRn)]
depAnalTyClDecls GlobalRdrEnv
rdr_env KindSig_FV_Env
kisig_fv_env [(LTyClDecl GhcRn, FreeVars)]
[(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)]
tycls_w_fvs
role_annot_env = [LRoleAnnotDecl GhcRn] -> RoleAnnotEnv
mkRoleAnnotEnv [LRoleAnnotDecl GhcRn]
[GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn)]
role_annots
(kisig_env, kisig_fv_env) = mkKindSig_fv_env kisigs_w_fvs
inst_ds_map = GlobalRdrEnv
-> FreeVars -> InstDeclFreeVarsMap -> InstDeclFreeVarsMap
mkInstDeclFreeVarsMap GlobalRdrEnv
rdr_env FreeVars
tc_names InstDeclFreeVarsMap
[(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)]
instds_w_fvs
(init_inst_ds, rest_inst_ds) = getInsts [] inst_ds_map
first_group
| [GenLocated SrcSpanAnnA (InstDecl GhcRn)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LInstDecl GhcRn]
[GenLocated SrcSpanAnnA (InstDecl GhcRn)]
init_inst_ds = []
| Bool
otherwise = [TyClGroup { group_ext :: XCTyClGroup GhcRn
group_ext = XCTyClGroup GhcRn
NoExtField
noExtField
, group_tyclds :: [LTyClDecl GhcRn]
group_tyclds = []
, group_kisigs :: [LStandaloneKindSig GhcRn]
group_kisigs = []
, group_roles :: [LRoleAnnotDecl GhcRn]
group_roles = []
, group_instds :: [LInstDecl GhcRn]
group_instds = [LInstDecl GhcRn]
init_inst_ds }]
(final_inst_ds, groups)
= mapAccumL (mk_group role_annot_env kisig_env) rest_inst_ds tycl_sccs
all_fvs = ((GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> FreeVars -> FreeVars)
-> FreeVars
-> [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)]
-> FreeVars
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (FreeVars -> FreeVars -> FreeVars
plusFV (FreeVars -> FreeVars -> FreeVars)
-> ((GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> FreeVars)
-> (GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)
-> FreeVars
-> FreeVars
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars) -> FreeVars
forall a b. (a, b) -> b
snd) FreeVars
emptyFVs [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)]
tycls_w_fvs FreeVars -> FreeVars -> FreeVars
`plusFV`
((GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
-> FreeVars -> FreeVars)
-> FreeVars
-> [(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)]
-> FreeVars
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (FreeVars -> FreeVars -> FreeVars
plusFV (FreeVars -> FreeVars -> FreeVars)
-> ((GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
-> FreeVars)
-> (GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
-> FreeVars
-> FreeVars
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars) -> FreeVars
forall a b. (a, b) -> b
snd) FreeVars
emptyFVs [(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)]
instds_w_fvs FreeVars -> FreeVars -> FreeVars
`plusFV`
((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> FreeVars -> FreeVars)
-> FreeVars
-> [(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)]
-> FreeVars
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (FreeVars -> FreeVars -> FreeVars
plusFV (FreeVars -> FreeVars -> FreeVars)
-> ((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> FreeVars)
-> (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> FreeVars
-> FreeVars
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> FreeVars
forall a b. (a, b) -> b
snd) FreeVars
emptyFVs [(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)]
kisigs_w_fvs
all_groups = [TyClGroup GhcRn]
first_group [TyClGroup GhcRn] -> [TyClGroup GhcRn] -> [TyClGroup GhcRn]
forall a. [a] -> [a] -> [a]
++ [TyClGroup GhcRn]
groups
; massertPpr (null final_inst_ds)
(ppr instds_w_fvs
$$ ppr inst_ds_map
$$ ppr (flattenSCCs tycl_sccs)
$$ ppr final_inst_ds)
; traceRn "rnTycl dependency analysis made groups" (ppr all_groups)
; return (all_groups, all_fvs) }
where
mk_group :: RoleAnnotEnv
-> KindSigEnv
-> InstDeclFreeVarsMap
-> SCC (LTyClDecl GhcRn)
-> (InstDeclFreeVarsMap, TyClGroup GhcRn)
mk_group :: RoleAnnotEnv
-> KindSigEnv
-> InstDeclFreeVarsMap
-> SCC (LTyClDecl GhcRn)
-> (InstDeclFreeVarsMap, TyClGroup GhcRn)
mk_group RoleAnnotEnv
role_env KindSigEnv
kisig_env InstDeclFreeVarsMap
inst_map SCC (LTyClDecl GhcRn)
scc
= (InstDeclFreeVarsMap
inst_map', TyClGroup GhcRn
group)
where
tycl_ds :: [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
tycl_ds = SCC (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
-> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
forall vertex. SCC vertex -> [vertex]
flattenSCC SCC (LTyClDecl GhcRn)
SCC (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
scc
bndrs :: [Name]
bndrs = (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> Name)
-> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (TyClDecl GhcRn -> IdP GhcRn
TyClDecl GhcRn -> Name
forall (p :: Pass).
(Anno (IdGhcP p) ~ SrcSpanAnnN) =>
TyClDecl (GhcPass p) -> IdP (GhcPass p)
tcdName (TyClDecl GhcRn -> Name)
-> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
-> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
forall l e. GenLocated l e -> e
unLoc) [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
tycl_ds
roles :: [LRoleAnnotDecl GhcRn]
roles = [Name] -> RoleAnnotEnv -> [LRoleAnnotDecl GhcRn]
getRoleAnnots [Name]
bndrs RoleAnnotEnv
role_env
kisigs :: [LStandaloneKindSig GhcRn]
kisigs = [Name] -> KindSigEnv -> [LStandaloneKindSig GhcRn]
getKindSigs [Name]
bndrs KindSigEnv
kisig_env
([LInstDecl GhcRn]
inst_ds, InstDeclFreeVarsMap
inst_map') = [Name]
-> InstDeclFreeVarsMap -> ([LInstDecl GhcRn], InstDeclFreeVarsMap)
getInsts [Name]
bndrs InstDeclFreeVarsMap
inst_map
group :: TyClGroup GhcRn
group = TyClGroup { group_ext :: XCTyClGroup GhcRn
group_ext = XCTyClGroup GhcRn
NoExtField
noExtField
, group_tyclds :: [LTyClDecl GhcRn]
group_tyclds = [LTyClDecl GhcRn]
[GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
tycl_ds
, group_kisigs :: [LStandaloneKindSig GhcRn]
group_kisigs = [LStandaloneKindSig GhcRn]
kisigs
, group_roles :: [LRoleAnnotDecl GhcRn]
group_roles = [LRoleAnnotDecl GhcRn]
roles
, group_instds :: [LInstDecl GhcRn]
group_instds = [LInstDecl GhcRn]
inst_ds }
newtype KindSig_FV_Env = KindSig_FV_Env (NameEnv FreeVars)
lookupKindSig_FV_Env :: KindSig_FV_Env -> Name -> FreeVars
lookupKindSig_FV_Env :: KindSig_FV_Env -> Name -> FreeVars
lookupKindSig_FV_Env (KindSig_FV_Env NameEnv FreeVars
e) Name
name
= FreeVars -> Maybe FreeVars -> FreeVars
forall a. a -> Maybe a -> a
fromMaybe FreeVars
emptyFVs (NameEnv FreeVars -> Name -> Maybe FreeVars
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv NameEnv FreeVars
e Name
name)
type KindSigEnv = NameEnv (LStandaloneKindSig GhcRn)
mkKindSig_fv_env :: [(LStandaloneKindSig GhcRn, FreeVars)] -> (KindSigEnv, KindSig_FV_Env)
mkKindSig_fv_env :: [(LStandaloneKindSig GhcRn, FreeVars)]
-> (KindSigEnv, KindSig_FV_Env)
mkKindSig_fv_env [(LStandaloneKindSig GhcRn, FreeVars)]
kisigs_w_fvs = (KindSigEnv
NameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
kisig_env, KindSig_FV_Env
kisig_fv_env)
where
kisig_env :: NameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
kisig_env = ((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
-> NameEnv
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> NameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
forall elt1 elt2. (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
mapNameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
forall a b. (a, b) -> a
fst NameEnv (LStandaloneKindSig GhcRn, FreeVars)
NameEnv
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
compound_env
kisig_fv_env :: KindSig_FV_Env
kisig_fv_env = NameEnv FreeVars -> KindSig_FV_Env
KindSig_FV_Env (((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> FreeVars)
-> NameEnv
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> NameEnv FreeVars
forall elt1 elt2. (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
mapNameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> FreeVars
forall a b. (a, b) -> b
snd NameEnv (LStandaloneKindSig GhcRn, FreeVars)
NameEnv
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
compound_env)
NameEnv (LStandaloneKindSig GhcRn, FreeVars)
compound_env :: NameEnv (LStandaloneKindSig GhcRn, FreeVars)
= ((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> Name)
-> [(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)]
-> NameEnv
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
forall a. (a -> Name) -> [a] -> NameEnv a
mkNameEnvWith (StandaloneKindSig GhcRn -> IdP GhcRn
StandaloneKindSig GhcRn -> Name
forall (p :: Pass).
StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
standaloneKindSigName (StandaloneKindSig GhcRn -> Name)
-> ((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> StandaloneKindSig GhcRn)
-> (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
-> StandaloneKindSig GhcRn
forall l e. GenLocated l e -> e
unLoc (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
-> StandaloneKindSig GhcRn)
-> ((GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
-> (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> StandaloneKindSig GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
-> GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
forall a b. (a, b) -> a
fst) [(LStandaloneKindSig GhcRn, FreeVars)]
[(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)]
kisigs_w_fvs
getKindSigs :: [Name] -> KindSigEnv -> [LStandaloneKindSig GhcRn]
getKindSigs :: [Name] -> KindSigEnv -> [LStandaloneKindSig GhcRn]
getKindSigs [Name]
bndrs KindSigEnv
kisig_env = (Name -> Maybe (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)))
-> [Name] -> [GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (NameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
-> Name -> Maybe (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv KindSigEnv
NameEnv (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn))
kisig_env) [Name]
bndrs
rnStandaloneKindSignatures
:: NameSet
-> [LStandaloneKindSig GhcPs]
-> RnM [(LStandaloneKindSig GhcRn, FreeVars)]
rnStandaloneKindSignatures :: FreeVars
-> [LStandaloneKindSig GhcPs]
-> RnM [(LStandaloneKindSig GhcRn, FreeVars)]
rnStandaloneKindSignatures FreeVars
tc_names [LStandaloneKindSig GhcPs]
kisigs
= do { let ([GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)]
no_dups, [NonEmpty (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs))]
dup_kisigs) = (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs) -> RdrName)
-> [GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)]
-> ([GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)],
[NonEmpty (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs))])
forall b a. Ord b => (a -> b) -> [a] -> ([a], [NonEmpty a])
removeDupsOn GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs) -> RdrName
GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs) -> IdGhcP 'Parsed
forall {l} {p :: Pass}.
GenLocated l (StandaloneKindSig (GhcPass p)) -> IdGhcP p
get_name [LStandaloneKindSig GhcPs]
[GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)]
kisigs
get_name :: GenLocated l (StandaloneKindSig (GhcPass p)) -> IdGhcP p
get_name = StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
StandaloneKindSig (GhcPass p) -> IdGhcP p
forall (p :: Pass).
StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
standaloneKindSigName (StandaloneKindSig (GhcPass p) -> IdGhcP p)
-> (GenLocated l (StandaloneKindSig (GhcPass p))
-> StandaloneKindSig (GhcPass p))
-> GenLocated l (StandaloneKindSig (GhcPass p))
-> IdGhcP p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated l (StandaloneKindSig (GhcPass p))
-> StandaloneKindSig (GhcPass p)
forall l e. GenLocated l e -> e
unLoc
; (NonEmpty (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs))
-> TcRn ())
-> [NonEmpty (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs))]
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ NonEmpty (LStandaloneKindSig GhcPs) -> TcRn ()
NonEmpty (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs))
-> TcRn ()
dupKindSig_Err [NonEmpty (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs))]
dup_kisigs
; (GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars))
-> [GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((StandaloneKindSig GhcPs
-> TcM (StandaloneKindSig GhcRn, FreeVars))
-> GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn), FreeVars)
forall a b c ann.
(a -> TcM (b, c))
-> GenLocated (EpAnn ann) a -> TcM (GenLocated (EpAnn ann) b, c)
wrapLocFstMA (FreeVars
-> StandaloneKindSig GhcPs
-> TcM (StandaloneKindSig GhcRn, FreeVars)
rnStandaloneKindSignature FreeVars
tc_names)) [GenLocated SrcSpanAnnA (StandaloneKindSig GhcPs)]
no_dups
}
rnStandaloneKindSignature
:: NameSet
-> StandaloneKindSig GhcPs
-> RnM (StandaloneKindSig GhcRn, FreeVars)
rnStandaloneKindSignature :: FreeVars
-> StandaloneKindSig GhcPs
-> TcM (StandaloneKindSig GhcRn, FreeVars)
rnStandaloneKindSignature FreeVars
tc_names (StandaloneKindSig XStandaloneKindSig GhcPs
_ LIdP GhcPs
v LHsSigType GhcPs
ki)
= do { standalone_ki_sig_ok <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.StandaloneKindSignatures
; unless standalone_ki_sig_ok $ addErr TcRnUnexpectedStandaloneKindSig
; new_v <- lookupSigCtxtOccRn (TopSigCtxt tc_names) (text "standalone kind signature") v
; let doc = SDoc -> HsDocContext
StandaloneKindSigCtx (GenLocated SrcSpanAnnN RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
v)
; (new_ki, fvs) <- rnHsSigType doc KindLevel ki
; return (StandaloneKindSig noExtField new_v new_ki, fvs)
}
depAnalTyClDecls :: GlobalRdrEnv
-> KindSig_FV_Env
-> [(LTyClDecl GhcRn, FreeVars)]
-> [SCC (LTyClDecl GhcRn)]
depAnalTyClDecls :: GlobalRdrEnv
-> KindSig_FV_Env
-> [(LTyClDecl GhcRn, FreeVars)]
-> [SCC (LTyClDecl GhcRn)]
depAnalTyClDecls GlobalRdrEnv
rdr_env KindSig_FV_Env
kisig_fv_env [(LTyClDecl GhcRn, FreeVars)]
ds_w_fvs
= [Node Name (GenLocated SrcSpanAnnA (TyClDecl GhcRn))]
-> [SCC (GenLocated SrcSpanAnnA (TyClDecl GhcRn))]
forall key payload.
Uniquable key =>
[Node key payload] -> [SCC payload]
stronglyConnCompFromEdgedVerticesUniq [Node Name (LTyClDecl GhcRn)]
[Node Name (GenLocated SrcSpanAnnA (TyClDecl GhcRn))]
edges
where
edges :: [ Node Name (LTyClDecl GhcRn) ]
edges :: [Node Name (LTyClDecl GhcRn)]
edges = [ GenLocated SrcSpanAnnA (TyClDecl GhcRn)
-> Name
-> [Name]
-> Node Name (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
forall key payload. payload -> key -> [key] -> Node key payload
DigraphNode GenLocated SrcSpanAnnA (TyClDecl GhcRn)
d IdP GhcRn
Name
name ((Name -> Name) -> [Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (GlobalRdrEnv -> Name -> Name
getParent GlobalRdrEnv
rdr_env) (FreeVars -> [Name]
forall elt. UniqSet elt -> [elt]
nonDetEltsUniqSet FreeVars
deps))
| (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
d, FreeVars
fvs) <- [(LTyClDecl GhcRn, FreeVars)]
[(GenLocated SrcSpanAnnA (TyClDecl GhcRn), FreeVars)]
ds_w_fvs,
let { name :: IdP GhcRn
name = TyClDecl GhcRn -> IdP GhcRn
forall (p :: Pass).
(Anno (IdGhcP p) ~ SrcSpanAnnN) =>
TyClDecl (GhcPass p) -> IdP (GhcPass p)
tcdName (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnA (TyClDecl GhcRn)
d)
; kisig_fvs :: FreeVars
kisig_fvs = KindSig_FV_Env -> Name -> FreeVars
lookupKindSig_FV_Env KindSig_FV_Env
kisig_fv_env IdP GhcRn
Name
name
; deps :: FreeVars
deps = FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
kisig_fvs
}
]
toParents :: GlobalRdrEnv -> NameSet -> NameSet
toParents :: GlobalRdrEnv -> FreeVars -> FreeVars
toParents GlobalRdrEnv
rdr_env FreeVars
ns
= (Name -> FreeVars -> FreeVars) -> FreeVars -> FreeVars -> FreeVars
forall elt a. (elt -> a -> a) -> a -> UniqSet elt -> a
nonDetStrictFoldUniqSet Name -> FreeVars -> FreeVars
add FreeVars
emptyNameSet FreeVars
ns
where
add :: Name -> FreeVars -> FreeVars
add Name
n FreeVars
s = FreeVars -> Name -> FreeVars
extendNameSet FreeVars
s (GlobalRdrEnv -> Name -> Name
getParent GlobalRdrEnv
rdr_env Name
n)
getParent :: GlobalRdrEnv -> Name -> Name
getParent :: GlobalRdrEnv -> Name -> Name
getParent GlobalRdrEnv
rdr_env Name
n
= case GlobalRdrEnv -> Name -> Maybe (GlobalRdrEltX GREInfo)
forall info.
Outputable info =>
GlobalRdrEnvX info -> Name -> Maybe (GlobalRdrEltX info)
lookupGRE_Name GlobalRdrEnv
rdr_env Name
n of
Just GlobalRdrEltX GREInfo
gre -> case GlobalRdrEltX GREInfo -> Parent
forall info. GlobalRdrEltX info -> Parent
greParent GlobalRdrEltX GREInfo
gre of
ParentIs { par_is :: Parent -> Name
par_is = Name
p } -> Name
p
Parent
_ -> Name
n
Maybe (GlobalRdrEltX GREInfo)
Nothing -> Name
n
rnRoleAnnots :: NameSet
-> [LRoleAnnotDecl GhcPs]
-> RnM [LRoleAnnotDecl GhcRn]
rnRoleAnnots :: FreeVars -> [LRoleAnnotDecl GhcPs] -> RnM [LRoleAnnotDecl GhcRn]
rnRoleAnnots FreeVars
tc_names [LRoleAnnotDecl GhcPs]
role_annots
= do {
let ([GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)]
no_dups, [NonEmpty (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs))]
dup_annots) = (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs) -> RdrName)
-> [GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)]
-> ([GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)],
[NonEmpty (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs))])
forall b a. Ord b => (a -> b) -> [a] -> ([a], [NonEmpty a])
removeDupsOn GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs) -> RdrName
GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs) -> IdGhcP 'Parsed
forall {l} {p :: Pass}.
GenLocated l (RoleAnnotDecl (GhcPass p)) -> IdGhcP p
get_name [LRoleAnnotDecl GhcPs]
[GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)]
role_annots
get_name :: GenLocated l (RoleAnnotDecl (GhcPass p)) -> IdGhcP p
get_name = RoleAnnotDecl (GhcPass p) -> IdP (GhcPass p)
RoleAnnotDecl (GhcPass p) -> IdGhcP p
forall (p :: Pass). RoleAnnotDecl (GhcPass p) -> IdP (GhcPass p)
roleAnnotDeclName (RoleAnnotDecl (GhcPass p) -> IdGhcP p)
-> (GenLocated l (RoleAnnotDecl (GhcPass p))
-> RoleAnnotDecl (GhcPass p))
-> GenLocated l (RoleAnnotDecl (GhcPass p))
-> IdGhcP p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated l (RoleAnnotDecl (GhcPass p))
-> RoleAnnotDecl (GhcPass p)
forall l e. GenLocated l e -> e
unLoc
; (NonEmpty (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs))
-> TcRn ())
-> [NonEmpty (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs))]
-> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ NonEmpty (LRoleAnnotDecl GhcPs) -> TcRn ()
NonEmpty (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)) -> TcRn ()
dupRoleAnnotErr [NonEmpty (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs))]
dup_annots
; (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn)))
-> [GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
[GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((RoleAnnotDecl GhcPs -> TcM (RoleAnnotDecl GhcRn))
-> GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn))
forall a b ann.
(a -> TcM b)
-> GenLocated (EpAnn ann) a -> TcRn (GenLocated (EpAnn ann) b)
wrapLocMA RoleAnnotDecl GhcPs -> TcM (RoleAnnotDecl GhcRn)
rn_role_annot1) [GenLocated SrcSpanAnnA (RoleAnnotDecl GhcPs)]
no_dups }
where
rn_role_annot1 :: RoleAnnotDecl GhcPs -> TcM (RoleAnnotDecl GhcRn)
rn_role_annot1 (RoleAnnotDecl XCRoleAnnotDecl GhcPs
_ LIdP GhcPs
tycon [XRec GhcPs (Maybe Role)]
roles)
= do {
tycon' <- HsSigCtxt
-> SDoc
-> GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
forall ann.
HsSigCtxt
-> SDoc
-> GenLocated (EpAnn ann) RdrName
-> RnM (GenLocated (EpAnn ann) Name)
lookupSigCtxtOccRn (FreeVars -> HsSigCtxt
RoleAnnotCtxt FreeVars
tc_names)
(String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"role annotation")
LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
; return $ RoleAnnotDecl noExtField tycon' roles }
dupRoleAnnotErr :: NonEmpty (LRoleAnnotDecl GhcPs) -> RnM ()
dupRoleAnnotErr :: NonEmpty (LRoleAnnotDecl GhcPs) -> TcRn ()
dupRoleAnnotErr list :: NonEmpty (LRoleAnnotDecl GhcPs)
list@(L SrcSpanAnnA
loc RoleAnnotDecl GhcPs
_ :| [LRoleAnnotDecl GhcPs]
_)
= SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
loc) (NonEmpty (LRoleAnnotDecl GhcPs) -> TcRnMessage
TcRnDuplicateRoleAnnot NonEmpty (LRoleAnnotDecl GhcPs)
list)
dupKindSig_Err :: NonEmpty (LStandaloneKindSig GhcPs) -> RnM ()
dupKindSig_Err :: NonEmpty (LStandaloneKindSig GhcPs) -> TcRn ()
dupKindSig_Err list :: NonEmpty (LStandaloneKindSig GhcPs)
list@(L SrcSpanAnnA
loc StandaloneKindSig GhcPs
_ :| [LStandaloneKindSig GhcPs]
_)
= SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
loc) (NonEmpty (LStandaloneKindSig GhcPs) -> TcRnMessage
TcRnDuplicateKindSig NonEmpty (LStandaloneKindSig GhcPs)
list)
type InstDeclFreeVarsMap = [(LInstDecl GhcRn, FreeVars)]
mkInstDeclFreeVarsMap :: GlobalRdrEnv
-> NameSet
-> [(LInstDecl GhcRn, FreeVars)]
-> InstDeclFreeVarsMap
mkInstDeclFreeVarsMap :: GlobalRdrEnv
-> FreeVars -> InstDeclFreeVarsMap -> InstDeclFreeVarsMap
mkInstDeclFreeVarsMap GlobalRdrEnv
rdr_env FreeVars
tycl_bndrs InstDeclFreeVarsMap
inst_ds_fvs
= [ (LInstDecl GhcRn
GenLocated SrcSpanAnnA (InstDecl GhcRn)
inst_decl, GlobalRdrEnv -> FreeVars -> FreeVars
toParents GlobalRdrEnv
rdr_env FreeVars
fvs FreeVars -> FreeVars -> FreeVars
`intersectFVs` FreeVars
tycl_bndrs)
| (GenLocated SrcSpanAnnA (InstDecl GhcRn)
inst_decl, FreeVars
fvs) <- InstDeclFreeVarsMap
[(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)]
inst_ds_fvs ]
getInsts :: [Name] -> InstDeclFreeVarsMap
-> ([LInstDecl GhcRn], InstDeclFreeVarsMap)
getInsts :: [Name]
-> InstDeclFreeVarsMap -> ([LInstDecl GhcRn], InstDeclFreeVarsMap)
getInsts [Name]
bndrs InstDeclFreeVarsMap
inst_decl_map
= ((GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
-> Either
(GenLocated SrcSpanAnnA (InstDecl GhcRn))
(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars))
-> [(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)]
-> ([GenLocated SrcSpanAnnA (InstDecl GhcRn)],
[(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)])
forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
partitionWith (LInstDecl GhcRn, FreeVars)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, FreeVars)
(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
-> Either
(GenLocated SrcSpanAnnA (InstDecl GhcRn))
(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
pick_me InstDeclFreeVarsMap
[(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)]
inst_decl_map
where
pick_me :: (LInstDecl GhcRn, FreeVars)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, FreeVars)
pick_me :: (LInstDecl GhcRn, FreeVars)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, FreeVars)
pick_me (LInstDecl GhcRn
decl, FreeVars
fvs)
| FreeVars -> Bool
isEmptyNameSet FreeVars
depleted_fvs = GenLocated SrcSpanAnnA (InstDecl GhcRn)
-> Either
(GenLocated SrcSpanAnnA (InstDecl GhcRn))
(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
forall a b. a -> Either a b
Left LInstDecl GhcRn
GenLocated SrcSpanAnnA (InstDecl GhcRn)
decl
| Bool
otherwise = (GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
-> Either
(GenLocated SrcSpanAnnA (InstDecl GhcRn))
(GenLocated SrcSpanAnnA (InstDecl GhcRn), FreeVars)
forall a b. b -> Either a b
Right (LInstDecl GhcRn
GenLocated SrcSpanAnnA (InstDecl GhcRn)
decl, FreeVars
depleted_fvs)
where
depleted_fvs :: FreeVars
depleted_fvs = [Name] -> FreeVars -> FreeVars
delFVs [Name]
bndrs FreeVars
fvs
rnTyClDecl :: TyClDecl GhcPs
-> RnM (TyClDecl GhcRn, FreeVars)
rnTyClDecl :: TyClDecl GhcPs -> TcM (TyClDecl GhcRn, FreeVars)
rnTyClDecl (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
tcdFam = FamilyDecl GhcPs
fam })
= do { (fam', fvs) <- Maybe (Name, [Name])
-> FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, FreeVars)
rnFamDecl Maybe (Name, [Name])
forall a. Maybe a
Nothing FamilyDecl GhcPs
fam
; return (FamDecl noExtField fam', fvs) }
rnTyClDecl (SynDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdLName = LIdP GhcPs
tycon, tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
tcdTyVars = LHsQTyVars GhcPs
tyvars,
tcdFixity :: forall pass. TyClDecl pass -> LexicalFixity
tcdFixity = LexicalFixity
fixity, tcdRhs :: forall pass. TyClDecl pass -> LHsType pass
tcdRhs = LHsType GhcPs
rhs })
= do { tycon' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopConstructorRnN LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
; let kvs = LHsType GhcPs -> FreeKiTyVars
extractHsTyRdrTyVarsKindVars LHsType GhcPs
rhs
doc = GenLocated SrcSpanAnnN RdrName -> HsDocContext
TySynCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
; traceRn "rntycl-ty" (ppr tycon <+> ppr kvs)
; bindHsQTyVars doc Nothing kvs tyvars $ \ LHsQTyVars GhcRn
tyvars' FreeKiTyVars
free_rhs_kvs ->
do { (GenLocated SrcSpanAnnN RdrName -> TcRn ())
-> FreeKiTyVars -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ GenLocated SrcSpanAnnN RdrName -> TcRn ()
warn_implicit_kvs (FreeKiTyVars -> FreeKiTyVars
forall a l. Eq a => [GenLocated l a] -> [GenLocated l a]
nubL FreeKiTyVars
free_rhs_kvs)
; (rhs', fvs) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnTySyn HsDocContext
doc LHsType GhcPs
rhs
; return (SynDecl { tcdLName = tycon', tcdTyVars = tyvars'
, tcdFixity = fixity
, tcdRhs = rhs', tcdSExt = fvs }, fvs) } }
where
warn_implicit_kvs :: LocatedN RdrName -> RnM ()
warn_implicit_kvs :: GenLocated SrcSpanAnnN RdrName -> TcRn ()
warn_implicit_kvs GenLocated SrcSpanAnnN RdrName
kv =
SrcSpan -> TcRnMessage -> TcRn ()
addDiagnosticAt (GenLocated SrcSpanAnnN RdrName -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA GenLocated SrcSpanAnnN RdrName
kv) (GenLocated SrcSpanAnnN RdrName -> TcRnMessage
TcRnImplicitRhsQuantification GenLocated SrcSpanAnnN RdrName
kv)
rnTyClDecl (DataDecl
{ tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdLName = LIdP GhcPs
tycon, tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
tcdTyVars = LHsQTyVars GhcPs
tyvars,
tcdFixity :: forall pass. TyClDecl pass -> LexicalFixity
tcdFixity = LexicalFixity
fixity,
tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
tcdDataDefn = defn :: HsDataDefn GhcPs
defn@HsDataDefn{ dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
dd_cons = DataDefnCons (LConDecl GhcPs)
cons, dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_kindSig = Maybe (LHsType GhcPs)
kind_sig} })
= do { tycon' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopConstructorRnN LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
; let kvs = HsDataDefn GhcPs -> FreeKiTyVars
extractDataDefnKindVars HsDataDefn GhcPs
defn
doc = GenLocated SrcSpanAnnN RdrName -> HsDocContext
TyDataCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
new_or_data = DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs)) -> NewOrData
forall a. DataDefnCons a -> NewOrData
dataDefnConsNewOrData DataDefnCons (LConDecl GhcPs)
DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
cons
; traceRn "rntycl-data" (ppr tycon <+> ppr kvs)
; bindHsQTyVars doc Nothing kvs tyvars $ \ LHsQTyVars GhcRn
tyvars' FreeKiTyVars
free_rhs_kvs ->
do { (defn', fvs) <- HsDocContext
-> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, FreeVars)
rnDataDefn HsDocContext
doc HsDataDefn GhcPs
defn
; cusk <- data_decl_has_cusk tyvars' new_or_data (null free_rhs_kvs) kind_sig
; let rn_info = DataDeclRn { tcdDataCusk :: Bool
tcdDataCusk = Bool
cusk
, tcdFVs :: FreeVars
tcdFVs = FreeVars
fvs }
; traceRn "rndata" (ppr tycon <+> ppr cusk <+> ppr free_rhs_kvs)
; return (DataDecl { tcdLName = tycon'
, tcdTyVars = tyvars'
, tcdFixity = fixity
, tcdDataDefn = defn'
, tcdDExt = rn_info }, fvs) } }
rnTyClDecl (ClassDecl { tcdCtxt :: forall pass. TyClDecl pass -> Maybe (LHsContext pass)
tcdCtxt = Maybe (LHsContext GhcPs)
context, tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdLName = LIdP GhcPs
lcls,
tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
tcdTyVars = LHsQTyVars GhcPs
tyvars, tcdFixity :: forall pass. TyClDecl pass -> LexicalFixity
tcdFixity = LexicalFixity
fixity,
tcdFDs :: forall pass. TyClDecl pass -> [LHsFunDep pass]
tcdFDs = [LHsFunDep GhcPs]
fds, tcdSigs :: forall pass. TyClDecl pass -> [LSig pass]
tcdSigs = [LSig GhcPs]
sigs,
tcdMeths :: forall pass. TyClDecl pass -> LHsBinds pass
tcdMeths = LHsBinds GhcPs
mbinds, tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
tcdATs = [LFamilyDecl GhcPs]
ats, tcdATDefs :: forall pass. TyClDecl pass -> [LTyFamDefltDecl pass]
tcdATDefs = [LTyFamInstDecl GhcPs]
at_defs,
tcdDocs :: forall pass. TyClDecl pass -> [LDocDecl pass]
tcdDocs = [LDocDecl GhcPs]
docs})
= do { lcls' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopConstructorRnN LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
lcls
; let cls' = GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc GenLocated SrcSpanAnnN Name
lcls'
kvs = []
; ((tyvars', context', fds', ats'), stuff_fvs)
<- bindHsQTyVars cls_doc Nothing kvs tyvars $ \ LHsQTyVars GhcRn
tyvars' FreeKiTyVars
_ -> do
{ (context', cxt_fvs) <- HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMaybeContext HsDocContext
cls_doc Maybe (LHsContext GhcPs)
context
; fds' <- rnFds fds
; (ats', fv_ats) <- rnATDecls cls' (hsAllLTyVarNames tyvars') ats
; let fvs = FreeVars
cxt_fvs FreeVars -> FreeVars -> FreeVars
`plusFV`
FreeVars
fv_ats
; return ((tyvars', context', fds', ats'), fvs) }
; (at_defs', fv_at_defs) <- rnList (rnTyFamDefltDecl cls') at_defs
; let sig_rdr_names_w_locs =
[GenLocated SrcSpanAnnN RdrName
op | L SrcSpanAnnA
_ (ClassOpSig XClassOpSig GhcPs
_ Bool
False [LIdP GhcPs]
ops LHsSigType GhcPs
_) <- [LSig GhcPs]
[GenLocated SrcSpanAnnA (Sig GhcPs)]
sigs
, GenLocated SrcSpanAnnN RdrName
op <- [LIdP GhcPs]
FreeKiTyVars
ops]
; checkDupRdrNames sig_rdr_names_w_locs
; (mbinds', sigs', meth_fvs)
<- rnMethodBinds True cls' (hsAllLTyVarNames tyvars') mbinds sigs
; let all_fvs = FreeVars
meth_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
stuff_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fv_at_defs
; docs' <- traverse rnLDocDecl docs
; return (ClassDecl { tcdCtxt = context', tcdLName = lcls',
tcdTyVars = tyvars', tcdFixity = fixity,
tcdFDs = fds', tcdSigs = sigs',
tcdMeths = mbinds', tcdATs = ats', tcdATDefs = at_defs',
tcdDocs = docs', tcdCExt = all_fvs },
all_fvs ) }
where
cls_doc :: HsDocContext
cls_doc = GenLocated SrcSpanAnnN RdrName -> HsDocContext
ClassDeclCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
lcls
data_decl_has_cusk :: LHsQTyVars (GhcPass p) -> NewOrData -> Bool -> Maybe (LHsKind (GhcPass p')) -> RnM Bool
data_decl_has_cusk :: forall (p :: Pass) (p' :: Pass).
LHsQTyVars (GhcPass p)
-> NewOrData -> Bool -> Maybe (LHsKind (GhcPass p')) -> TcRn Bool
data_decl_has_cusk LHsQTyVars (GhcPass p)
tyvars NewOrData
new_or_data Bool
no_rhs_kvs Maybe (LHsKind (GhcPass p'))
kind_sig = do
{
; unlifted_newtypes <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.UnliftedNewtypes
; let non_cusk_newtype
| NewOrData
NewType <- NewOrData
new_or_data =
Bool
unlifted_newtypes Bool -> Bool -> Bool
&& Maybe (GenLocated SrcSpanAnnA (HsType (GhcPass p'))) -> Bool
forall a. Maybe a -> Bool
isNothing Maybe (LHsKind (GhcPass p'))
Maybe (GenLocated SrcSpanAnnA (HsType (GhcPass p')))
kind_sig
| Bool
otherwise = Bool
False
; return $ hsTvbAllKinded tyvars && no_rhs_kvs && not non_cusk_newtype
}
rnTySyn :: HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnTySyn :: HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnTySyn HsDocContext
doc LHsType GhcPs
rhs = HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnLHsType HsDocContext
doc LHsType GhcPs
rhs
rnDataDefn :: HsDocContext -> HsDataDefn GhcPs
-> RnM (HsDataDefn GhcRn, FreeVars)
rnDataDefn :: HsDocContext
-> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, FreeVars)
rnDataDefn HsDocContext
doc (HsDataDefn { dd_cType :: forall pass. HsDataDefn pass -> Maybe (XRec pass CType)
dd_cType = Maybe (XRec GhcPs CType)
cType, dd_ctxt :: forall pass. HsDataDefn pass -> Maybe (LHsContext pass)
dd_ctxt = Maybe (LHsContext GhcPs)
context, dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
dd_cons = DataDefnCons (LConDecl GhcPs)
condecls
, dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_kindSig = Maybe (LHsType GhcPs)
m_sig, dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
dd_derivs = HsDeriving GhcPs
derivs })
= do {
Bool -> TcRnMessage -> TcRn ()
checkTc (Bool
h98_style Bool -> Bool -> Bool
|| [GenLocated SrcSpanAnnA (HsType GhcPs)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Maybe (LHsContext GhcPs) -> [LHsType GhcPs]
forall (p :: Pass).
Maybe (LHsContext (GhcPass p)) -> HsContext (GhcPass p)
fromMaybeContext Maybe (LHsContext GhcPs)
context))
(HsDocContext -> TcRnMessage
TcRnStupidThetaInGadt HsDocContext
doc)
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs)) -> Bool
forall a. DataDefnCons a -> Bool
isTypeDataDefnCons DataDefnCons (LConDecl GhcPs)
DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
condecls) TcRn ()
check_type_data
; (m_sig', sig_fvs) <- case Maybe (LHsType GhcPs)
m_sig of
Just LHsType GhcPs
sig -> (GenLocated SrcSpanAnnA (HsType GhcRn)
-> Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)))
-> (GenLocated SrcSpanAnnA (HsType GhcRn), FreeVars)
-> (Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars)
forall b c d. (b -> c) -> (b, d) -> (c, d)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first GenLocated SrcSpanAnnA (HsType GhcRn)
-> Maybe (GenLocated SrcSpanAnnA (HsType GhcRn))
forall a. a -> Maybe a
Just ((GenLocated SrcSpanAnnA (HsType GhcRn), FreeVars)
-> (Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars))
-> RnM (GenLocated SrcSpanAnnA (HsType GhcRn), FreeVars)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnLHsKind HsDocContext
doc LHsType GhcPs
sig
Maybe (LHsType GhcPs)
Nothing -> (Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (GenLocated SrcSpanAnnA (HsType GhcRn))
forall a. Maybe a
Nothing, FreeVars
emptyFVs)
; (context', fvs1) <- rnMaybeContext doc context
; (derivs', fvs3) <- rn_derivs derivs
; let { zap_lcl_env | Bool
h98_style = \ RnM (DataDefnCons (LConDecl GhcRn), FreeVars)
thing -> RnM (DataDefnCons (LConDecl GhcRn), FreeVars)
thing
| Bool
otherwise = LocalRdrEnv
-> RnM (DataDefnCons (LConDecl GhcRn), FreeVars)
-> RnM (DataDefnCons (LConDecl GhcRn), FreeVars)
forall a. LocalRdrEnv -> RnM a -> RnM a
setLocalRdrEnv LocalRdrEnv
emptyLocalRdrEnv }
; (condecls', con_fvs) <- zap_lcl_env $ rnConDecls condecls
; let all_fvs = FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3 FreeVars -> FreeVars -> FreeVars
`plusFV`
FreeVars
con_fvs FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
sig_fvs
; return ( HsDataDefn { dd_ext = noAnn, dd_cType = cType
, dd_ctxt = context', dd_kindSig = m_sig'
, dd_cons = condecls'
, dd_derivs = derivs' }
, all_fvs )
}
where
h98_style :: Bool
h98_style = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs)) -> Bool
forall (f :: * -> *) l pass.
Foldable f =>
f (GenLocated l (ConDecl pass)) -> Bool
anyLConIsGadt DataDefnCons (LConDecl GhcPs)
DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
condecls
rn_derivs :: [GenLocated EpAnnCO (HsDerivingClause GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv)
([GenLocated EpAnnCO (HsDerivingClause GhcRn)], FreeVars)
rn_derivs [GenLocated EpAnnCO (HsDerivingClause GhcPs)]
ds
= do { deriv_strats_ok <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DerivingStrategies
; failIfTc (lengthExceeds ds 1 && not deriv_strats_ok)
TcRnIllegalMultipleDerivClauses
; (ds', fvs) <- mapFvRn (rnLHsDerivingClause doc) ds
; return (ds', fvs) }
check_type_data :: TcRn ()
check_type_data
= do { Extension -> TcRn () -> TcRn ()
forall gbl lcl. Extension -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
unlessXOptM Extension
LangExt.TypeData (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith TcRnMessage
TcRnIllegalTypeData
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([GenLocated SrcSpanAnnA (HsType GhcPs)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Maybe (LHsContext GhcPs) -> [LHsType GhcPs]
forall (p :: Pass).
Maybe (LHsContext (GhcPass p)) -> HsContext (GhcPass p)
fromMaybeContext Maybe (LHsContext GhcPs)
context)) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TypeDataForbids -> TcRnMessage
TcRnTypeDataForbids TypeDataForbids
TypeDataForbidsDatatypeContexts
; (GenLocated SrcSpanAnnA (ConDecl GhcPs) -> TcRn ())
-> DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs)) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((ConDecl GhcPs -> TcRn ())
-> GenLocated SrcSpanAnnA (ConDecl GhcPs) -> TcRn ()
forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
addLocM ConDecl GhcPs -> TcRn ()
check_type_data_condecl) DataDefnCons (LConDecl GhcPs)
DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
condecls
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([GenLocated EpAnnCO (HsDerivingClause GhcPs)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null HsDeriving GhcPs
[GenLocated EpAnnCO (HsDerivingClause GhcPs)]
derivs) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TypeDataForbids -> TcRnMessage
TcRnTypeDataForbids TypeDataForbids
TypeDataForbidsDerivingClauses
}
check_type_data_condecl :: ConDecl GhcPs -> RnM ()
check_type_data_condecl :: ConDecl GhcPs -> TcRn ()
check_type_data_condecl ConDecl GhcPs
condecl
= do {
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ConDecl GhcPs -> Bool
forall {pass} {l}.
(XRec pass [XRec pass (ConDeclField pass)]
~ GenLocated l [XRec pass (ConDeclField pass)]) =>
ConDecl pass -> Bool
has_labelled_fields ConDecl GhcPs
condecl) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TypeDataForbids -> TcRnMessage
TcRnTypeDataForbids TypeDataForbids
TypeDataForbidsLabelledFields
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ConDecl GhcPs -> Bool
forall {p :: Pass}. ConDecl (GhcPass p) -> Bool
has_strictness_flags ConDecl GhcPs
condecl) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TypeDataForbids -> TcRnMessage
TcRnTypeDataForbids TypeDataForbids
TypeDataForbidsStrictnessAnnotations
}
has_labelled_fields :: ConDecl pass -> Bool
has_labelled_fields (ConDeclGADT { con_g_args :: forall pass. ConDecl pass -> HsConDeclGADTDetails pass
con_g_args = RecConGADT XRecConGADT pass
_ XRec pass [XRec pass (ConDeclField pass)]
_ }) = Bool
True
has_labelled_fields (ConDeclH98 { con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
con_args = RecCon XRec pass [XRec pass (ConDeclField pass)]
rec })
= Bool -> Bool
not ([XRec pass (ConDeclField pass)] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (GenLocated l [XRec pass (ConDeclField pass)]
-> [XRec pass (ConDeclField pass)]
forall l e. GenLocated l e -> e
unLoc XRec pass [XRec pass (ConDeclField pass)]
GenLocated l [XRec pass (ConDeclField pass)]
rec))
has_labelled_fields ConDecl pass
_ = Bool
False
has_strictness_flags :: ConDecl (GhcPass p) -> Bool
has_strictness_flags ConDecl (GhcPass p)
condecl
= (HsScaled (GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> Bool)
-> [HsScaled
(GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))]
-> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (HsSrcBang -> Bool
is_strict (HsSrcBang -> Bool)
-> (HsScaled
(GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> HsSrcBang)
-> HsScaled
(GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsType (GhcPass p) -> HsSrcBang
GenLocated SrcSpanAnnA (HsType (GhcPass p)) -> HsSrcBang
forall (p :: Pass). LHsType (GhcPass p) -> HsSrcBang
getBangStrictness (GenLocated SrcSpanAnnA (HsType (GhcPass p)) -> HsSrcBang)
-> (HsScaled
(GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> HsScaled
(GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> HsSrcBang
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HsScaled (GhcPass p) (GenLocated SrcSpanAnnA (HsType (GhcPass p)))
-> GenLocated SrcSpanAnnA (HsType (GhcPass p))
forall pass a. HsScaled pass a -> a
hsScaledThing) (ConDecl (GhcPass p) -> [HsScaled (GhcPass p) (LHsType (GhcPass p))]
forall {pass}.
ConDecl pass -> [HsScaled pass (XRec pass (BangType pass))]
con_args ConDecl (GhcPass p)
condecl)
is_strict :: HsSrcBang -> Bool
is_strict (HsSrcBang SourceText
_ (HsBang SrcUnpackedness
_ SrcStrictness
s)) = SrcStrictness -> Bool
isSrcStrict SrcStrictness
s
con_args :: ConDecl pass -> [HsScaled pass (XRec pass (BangType pass))]
con_args (ConDeclGADT { con_g_args :: forall pass. ConDecl pass -> HsConDeclGADTDetails pass
con_g_args = PrefixConGADT XPrefixConGADT pass
_ [HsScaled pass (XRec pass (BangType pass))]
args }) = [HsScaled pass (XRec pass (BangType pass))]
args
con_args (ConDeclH98 { con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
con_args = PrefixCon [Void]
_ [HsScaled pass (XRec pass (BangType pass))]
args }) = [HsScaled pass (XRec pass (BangType pass))]
args
con_args (ConDeclH98 { con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
con_args = InfixCon HsScaled pass (XRec pass (BangType pass))
arg1 HsScaled pass (XRec pass (BangType pass))
arg2 }) = [HsScaled pass (XRec pass (BangType pass))
arg1, HsScaled pass (XRec pass (BangType pass))
arg2]
con_args ConDecl pass
_ = []
rnLHsDerivingClause :: HsDocContext -> LHsDerivingClause GhcPs
-> RnM (LHsDerivingClause GhcRn, FreeVars)
rnLHsDerivingClause :: HsDocContext
-> LHsDerivingClause GhcPs
-> RnM (LHsDerivingClause GhcRn, FreeVars)
rnLHsDerivingClause HsDocContext
doc
(L EpAnnCO
loc (HsDerivingClause
{ deriv_clause_ext :: forall pass. HsDerivingClause pass -> XCHsDerivingClause pass
deriv_clause_ext = XCHsDerivingClause GhcPs
noExtField
, deriv_clause_strategy :: forall pass. HsDerivingClause pass -> Maybe (LDerivStrategy pass)
deriv_clause_strategy = Maybe (LDerivStrategy GhcPs)
dcs
, deriv_clause_tys :: forall pass. HsDerivingClause pass -> LDerivClauseTys pass
deriv_clause_tys = LDerivClauseTys GhcPs
dct }))
= do { (dcs', dct', fvs)
<- HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (LDerivClauseTys GhcRn, FreeVars)
-> RnM
(Maybe (LDerivStrategy GhcRn), LDerivClauseTys GhcRn, FreeVars)
forall a.
HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
rnLDerivStrategy HsDocContext
doc Maybe (LDerivStrategy GhcPs)
dcs (RnM (LDerivClauseTys GhcRn, FreeVars)
-> RnM
(Maybe (LDerivStrategy GhcRn), LDerivClauseTys GhcRn, FreeVars))
-> RnM (LDerivClauseTys GhcRn, FreeVars)
-> RnM
(Maybe (LDerivStrategy GhcRn), LDerivClauseTys GhcRn, FreeVars)
forall a b. (a -> b) -> a -> b
$ LDerivClauseTys GhcPs -> RnM (LDerivClauseTys GhcRn, FreeVars)
rn_deriv_clause_tys LDerivClauseTys GhcPs
dct
; pure ( L loc (HsDerivingClause { deriv_clause_ext = noExtField
, deriv_clause_strategy = dcs'
, deriv_clause_tys = dct' })
, fvs ) }
where
rn_deriv_clause_tys :: LDerivClauseTys GhcPs
-> RnM (LDerivClauseTys GhcRn, FreeVars)
rn_deriv_clause_tys :: LDerivClauseTys GhcPs -> RnM (LDerivClauseTys GhcRn, FreeVars)
rn_deriv_clause_tys (L SrcSpanAnnC
l DerivClauseTys GhcPs
dct) = case DerivClauseTys GhcPs
dct of
DctSingle XDctSingle GhcPs
x LHsSigType GhcPs
ty -> do
(ty', fvs) <- LHsSigType GhcPs -> RnM (LHsSigType GhcRn, FreeVars)
rn_clause_pred LHsSigType GhcPs
ty
pure (L l (DctSingle x ty'), fvs)
DctMulti XDctMulti GhcPs
x [LHsSigType GhcPs]
tys -> do
(tys', fvs) <- (GenLocated SrcSpanAnnA (HsSigType GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (HsSigType GhcRn), FreeVars))
-> [GenLocated SrcSpanAnnA (HsSigType GhcPs)]
-> RnM ([GenLocated SrcSpanAnnA (HsSigType GhcRn)], FreeVars)
forall (f :: * -> *) a b.
Traversable f =>
(a -> RnM (b, FreeVars)) -> f a -> RnM (f b, FreeVars)
mapFvRn LHsSigType GhcPs -> RnM (LHsSigType GhcRn, FreeVars)
GenLocated SrcSpanAnnA (HsSigType GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated SrcSpanAnnA (HsSigType GhcRn), FreeVars)
rn_clause_pred [LHsSigType GhcPs]
[GenLocated SrcSpanAnnA (HsSigType GhcPs)]
tys
pure (L l (DctMulti x tys'), fvs)
rn_clause_pred :: LHsSigType GhcPs -> RnM (LHsSigType GhcRn, FreeVars)
rn_clause_pred :: LHsSigType GhcPs -> RnM (LHsSigType GhcRn, FreeVars)
rn_clause_pred LHsSigType GhcPs
pred_ty = do
HsDocContext -> LHsSigType GhcPs -> TcRn ()
checkInferredVars HsDocContext
doc LHsSigType GhcPs
pred_ty
ret@(pred_ty', _) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, FreeVars)
rnHsSigType HsDocContext
doc TypeOrKind
TypeLevel LHsSigType GhcPs
pred_ty
addNoNestedForallsContextsErr doc NFC_DerivedClassType
(getLHsInstDeclHead pred_ty')
pure ret
rnLDerivStrategy :: forall a.
HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
rnLDerivStrategy :: forall a.
HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
rnLDerivStrategy HsDocContext
doc Maybe (LDerivStrategy GhcPs)
mds RnM (a, FreeVars)
thing_inside
= case Maybe (LDerivStrategy GhcPs)
mds of
Maybe (LDerivStrategy GhcPs)
Nothing -> Maybe (GenLocated EpAnnCO (DerivStrategy GhcRn))
-> RnM
(Maybe (GenLocated EpAnnCO (DerivStrategy GhcRn)), a, FreeVars)
forall ds. ds -> RnM (ds, a, FreeVars)
boring_case Maybe (GenLocated EpAnnCO (DerivStrategy GhcRn))
forall a. Maybe a
Nothing
Just (L EpAnnCO
loc DerivStrategy GhcPs
ds) ->
EpAnnCO
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
forall ann a. EpAnn ann -> TcRn a -> TcRn a
setSrcSpanA EpAnnCO
loc (RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars))
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
forall a b. (a -> b) -> a -> b
$ do
(ds', thing, fvs) <- DerivStrategy GhcPs -> RnM (DerivStrategy GhcRn, a, FreeVars)
rn_deriv_strat DerivStrategy GhcPs
ds
pure (Just (L loc ds'), thing, fvs)
where
rn_deriv_strat :: DerivStrategy GhcPs
-> RnM (DerivStrategy GhcRn, a, FreeVars)
rn_deriv_strat :: DerivStrategy GhcPs -> RnM (DerivStrategy GhcRn, a, FreeVars)
rn_deriv_strat DerivStrategy GhcPs
ds = do
let extNeeded :: LangExt.Extension
extNeeded :: Extension
extNeeded
| ViaStrategy{} <- DerivStrategy GhcPs
ds
= Extension
LangExt.DerivingVia
| Bool
otherwise
= Extension
LangExt.DerivingStrategies
Extension -> TcRn () -> TcRn ()
forall gbl lcl. Extension -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
unlessXOptM Extension
extNeeded (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$ DerivStrategy GhcPs -> TcRnMessage
TcRnIllegalDerivStrategy DerivStrategy GhcPs
ds
case DerivStrategy GhcPs
ds of
StockStrategy XStockStrategy GhcPs
_ -> DerivStrategy GhcRn -> RnM (DerivStrategy GhcRn, a, FreeVars)
forall ds. ds -> RnM (ds, a, FreeVars)
boring_case (XStockStrategy GhcRn -> DerivStrategy GhcRn
forall pass. XStockStrategy pass -> DerivStrategy pass
StockStrategy XStockStrategy GhcRn
NoExtField
noExtField)
AnyclassStrategy XAnyClassStrategy GhcPs
_ -> DerivStrategy GhcRn -> RnM (DerivStrategy GhcRn, a, FreeVars)
forall ds. ds -> RnM (ds, a, FreeVars)
boring_case (XAnyClassStrategy GhcRn -> DerivStrategy GhcRn
forall pass. XAnyClassStrategy pass -> DerivStrategy pass
AnyclassStrategy XAnyClassStrategy GhcRn
NoExtField
noExtField)
NewtypeStrategy XNewtypeStrategy GhcPs
_ -> DerivStrategy GhcRn -> RnM (DerivStrategy GhcRn, a, FreeVars)
forall ds. ds -> RnM (ds, a, FreeVars)
boring_case (XNewtypeStrategy GhcRn -> DerivStrategy GhcRn
forall pass. XNewtypeStrategy pass -> DerivStrategy pass
NewtypeStrategy XNewtypeStrategy GhcRn
NoExtField
noExtField)
ViaStrategy (XViaStrategyPs EpToken "via"
_ LHsSigType GhcPs
via_ty) ->
do HsDocContext -> LHsSigType GhcPs -> TcRn ()
checkInferredVars HsDocContext
doc LHsSigType GhcPs
via_ty
(via_ty', fvs1) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, FreeVars)
rnHsSigType HsDocContext
doc TypeOrKind
TypeLevel LHsSigType GhcPs
via_ty
let HsSig { sig_bndrs = via_outer_bndrs
, sig_body = via_body } = unLoc via_ty'
via_tvs = HsOuterTyVarBndrs Specificity GhcRn -> [Name]
forall flag. HsOuterTyVarBndrs flag GhcRn -> [Name]
hsOuterTyVarNames HsOuterTyVarBndrs Specificity GhcRn
via_outer_bndrs
addNoNestedForallsContextsErr doc
NFC_ViaType via_body
(thing, fvs2) <- bindLocalNamesFV via_tvs thing_inside
pure (ViaStrategy via_ty', thing, fvs1 `plusFV` fvs2)
boring_case :: ds -> RnM (ds, a, FreeVars)
boring_case :: forall ds. ds -> RnM (ds, a, FreeVars)
boring_case ds
ds = do
(thing, fvs) <- RnM (a, FreeVars)
thing_inside
pure (ds, thing, fvs)
rnFamDecl :: Maybe (Name, [Name])
-> FamilyDecl GhcPs
-> RnM (FamilyDecl GhcRn, FreeVars)
rnFamDecl :: Maybe (Name, [Name])
-> FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, FreeVars)
rnFamDecl Maybe (Name, [Name])
mb_cls (FamilyDecl { fdLName :: forall pass. FamilyDecl pass -> LIdP pass
fdLName = LIdP GhcPs
tycon, fdTyVars :: forall pass. FamilyDecl pass -> LHsQTyVars pass
fdTyVars = LHsQTyVars GhcPs
tyvars
, fdTopLevel :: forall pass. FamilyDecl pass -> TopLevelFlag
fdTopLevel = TopLevelFlag
toplevel
, fdFixity :: forall pass. FamilyDecl pass -> LexicalFixity
fdFixity = LexicalFixity
fixity
, fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
fdInfo = FamilyInfo GhcPs
info, fdResultSig :: forall pass. FamilyDecl pass -> LFamilyResultSig pass
fdResultSig = LFamilyResultSig GhcPs
res_sig
, fdInjectivityAnn :: forall pass. FamilyDecl pass -> Maybe (LInjectivityAnn pass)
fdInjectivityAnn = Maybe (LInjectivityAnn GhcPs)
injectivity })
= do { tycon' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopConstructorRnN LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
; ((tyvars', res_sig', injectivity'), fv1) <-
bindHsQTyVars doc mb_cls kvs tyvars $ \ LHsQTyVars GhcRn
tyvars' FreeKiTyVars
_ ->
do { let rn_sig :: FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, FreeVars)
rn_sig = HsDocContext
-> FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, FreeVars)
rnFamResultSig HsDocContext
doc
; (res_sig', fv_kind) <- (FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, FreeVars))
-> GenLocated EpAnnCO (FamilyResultSig GhcPs)
-> TcM (GenLocated EpAnnCO (FamilyResultSig GhcRn), FreeVars)
forall a b c ann.
(a -> TcM (b, c))
-> GenLocated (EpAnn ann) a -> TcM (GenLocated (EpAnn ann) b, c)
wrapLocFstMA FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, FreeVars)
rn_sig LFamilyResultSig GhcPs
GenLocated EpAnnCO (FamilyResultSig GhcPs)
res_sig
; injectivity' <- traverse (rnInjectivityAnn tyvars' res_sig')
injectivity
; return ( (tyvars', res_sig', injectivity') , fv_kind ) }
; (info', fv2) <- rn_info info
; return (FamilyDecl { fdExt = noAnn
, fdLName = tycon', fdTyVars = tyvars'
, fdTopLevel = toplevel
, fdFixity = fixity
, fdInfo = info', fdResultSig = res_sig'
, fdInjectivityAnn = injectivity' }
, fv1 `plusFV` fv2) }
where
doc :: HsDocContext
doc = GenLocated SrcSpanAnnN RdrName -> HsDocContext
TyFamilyCtx LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
tycon
kvs :: FreeKiTyVars
kvs = LFamilyResultSig GhcPs -> FreeKiTyVars
extractRdrKindSigVars LFamilyResultSig GhcPs
res_sig
rn_info :: FamilyInfo GhcPs -> RnM (FamilyInfo GhcRn, FreeVars)
rn_info :: FamilyInfo GhcPs -> RnM (FamilyInfo GhcRn, FreeVars)
rn_info (ClosedTypeFamily (Just [LTyFamInstEqn GhcPs]
eqns))
= do { (eqns', fvs)
<- (FamEqn GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars))
-> [LocatedA
(FamEqn GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs)))]
-> RnM
([LocatedA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))],
FreeVars)
forall a b.
(a -> RnM (b, FreeVars))
-> [LocatedA a] -> RnM ([LocatedA b], FreeVars)
rnList (AssocTyFamInfo
-> TyFamInstEqn GhcPs -> RnM (TyFamInstEqn GhcRn, FreeVars)
rnTyFamInstEqn (ClosedTyFamInfo -> AssocTyFamInfo
NonAssocTyFamEqn ClosedTyFamInfo
ClosedTyFam)) [LTyFamInstEqn GhcPs]
[LocatedA (FamEqn GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs)))]
eqns
; return (ClosedTypeFamily (Just eqns'), fvs) }
rn_info (ClosedTypeFamily Maybe [LTyFamInstEqn GhcPs]
Nothing)
= (FamilyInfo GhcRn, FreeVars) -> RnM (FamilyInfo GhcRn, FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe [LTyFamInstEqn GhcRn] -> FamilyInfo GhcRn
forall pass. Maybe [LTyFamInstEqn pass] -> FamilyInfo pass
ClosedTypeFamily Maybe [LTyFamInstEqn GhcRn]
Maybe
[LocatedA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
forall a. Maybe a
Nothing, FreeVars
emptyFVs)
rn_info FamilyInfo GhcPs
OpenTypeFamily = (FamilyInfo GhcRn, FreeVars) -> RnM (FamilyInfo GhcRn, FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (FamilyInfo GhcRn
forall pass. FamilyInfo pass
OpenTypeFamily, FreeVars
emptyFVs)
rn_info FamilyInfo GhcPs
DataFamily = (FamilyInfo GhcRn, FreeVars) -> RnM (FamilyInfo GhcRn, FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (FamilyInfo GhcRn
forall pass. FamilyInfo pass
DataFamily, FreeVars
emptyFVs)
rnFamResultSig :: HsDocContext
-> FamilyResultSig GhcPs
-> RnM (FamilyResultSig GhcRn, FreeVars)
rnFamResultSig :: HsDocContext
-> FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, FreeVars)
rnFamResultSig HsDocContext
_ (NoSig XNoSig GhcPs
_)
= (FamilyResultSig GhcRn, FreeVars)
-> RnM (FamilyResultSig GhcRn, FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (XNoSig GhcRn -> FamilyResultSig GhcRn
forall pass. XNoSig pass -> FamilyResultSig pass
NoSig XNoSig GhcRn
NoExtField
noExtField, FreeVars
emptyFVs)
rnFamResultSig HsDocContext
doc (KindSig XCKindSig GhcPs
_ LHsType GhcPs
kind)
= do { (rndKind, ftvs) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnLHsKind HsDocContext
doc LHsType GhcPs
kind
; return (KindSig noExtField rndKind, ftvs) }
rnFamResultSig HsDocContext
doc (TyVarSig XTyVarSig GhcPs
_ LHsTyVarBndr () GhcPs
tvbndr)
= do {
rdr_env <- RnM LocalRdrEnv
getLocalRdrEnv
; case hsBndrVar (unLoc tvbndr) of
HsBndrWildCard XBndrWildCard GhcPs
_ ->
SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (GenLocated SrcSpanAnnA (HsTyVarBndr () GhcPs) -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA LHsTyVarBndr () GhcPs
GenLocated SrcSpanAnnA (HsTyVarBndr () GhcPs)
tvbndr) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$
Maybe Name -> BadAnonWildcardContext -> TcRnMessage
TcRnIllegalWildcardInType Maybe Name
forall a. Maybe a
Nothing BadAnonWildcardContext
WildcardBndrInTyFamResultVar
HsBndrVar XBndrVar GhcPs
_ (L SrcSpanAnnN
_ RdrName
resName) ->
Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (RdrName
resName RdrName -> LocalRdrEnv -> Bool
`elemLocalRdrEnv` LocalRdrEnv
rdr_env) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (GenLocated SrcSpanAnnA (HsTyVarBndr () GhcPs) -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA LHsTyVarBndr () GhcPs
GenLocated SrcSpanAnnA (HsTyVarBndr () GhcPs)
tvbndr) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$
IdP GhcPs -> TcRnMessage
TcRnShadowedTyVarNameInFamResult IdP GhcPs
RdrName
resName
; bindLHsTyVarBndr doc Nothing
tvbndr $ \ LHsTyVarBndr () GhcRn
tvbndr' ->
(FamilyResultSig GhcRn, FreeVars)
-> RnM (FamilyResultSig GhcRn, FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (XTyVarSig GhcRn -> LHsTyVarBndr () GhcRn -> FamilyResultSig GhcRn
forall pass.
XTyVarSig pass -> LHsTyVarBndr () pass -> FamilyResultSig pass
TyVarSig XTyVarSig GhcRn
NoExtField
noExtField LHsTyVarBndr () GhcRn
tvbndr', FreeVars -> (Name -> FreeVars) -> Maybe Name -> FreeVars
forall b a. b -> (a -> b) -> Maybe a -> b
maybe FreeVars
emptyFVs Name -> FreeVars
unitFV (LHsTyVarBndr () GhcRn -> Maybe (IdP GhcRn)
forall flag (p :: Pass).
LHsTyVarBndr flag (GhcPass p) -> Maybe (IdP (GhcPass p))
hsLTyVarName LHsTyVarBndr () GhcRn
tvbndr')) }
rnInjectivityAnn :: LHsQTyVars GhcRn
-> LFamilyResultSig GhcRn
-> LInjectivityAnn GhcPs
-> RnM (LInjectivityAnn GhcRn)
rnInjectivityAnn :: LHsQTyVars GhcRn
-> LFamilyResultSig GhcRn
-> LInjectivityAnn GhcPs
-> RnM (LInjectivityAnn GhcRn)
rnInjectivityAnn LHsQTyVars GhcRn
tvBndrs (L EpAnnCO
_ (TyVarSig XTyVarSig GhcRn
_ LHsTyVarBndr () GhcRn
resTv))
(L EpAnnCO
srcSpan (InjectivityAnn XCInjectivityAnn GhcPs
x LIdP GhcPs
injFrom [LIdP GhcPs]
injTo))
= do
{ (injDecl'@(L _ (InjectivityAnn _ injFrom' injTo')), noRnErrors)
<- IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> TcRn (GenLocated EpAnnCO (InjectivityAnn GhcRn), Bool)
forall a. TcRn a -> TcRn (a, Bool)
askNoErrs (IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> TcRn (GenLocated EpAnnCO (InjectivityAnn GhcRn), Bool))
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> TcRn (GenLocated EpAnnCO (InjectivityAnn GhcRn), Bool)
forall a b. (a -> b) -> a -> b
$
[Name]
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
forall a. [Name] -> RnM a -> RnM a
bindLocalNames (Maybe Name -> [Name]
forall a. Maybe a -> [a]
maybeToList (LHsTyVarBndr () GhcRn -> Maybe (IdP GhcRn)
forall flag (p :: Pass).
LHsTyVarBndr flag (GhcPass p) -> Maybe (IdP (GhcPass p))
hsLTyVarName LHsTyVarBndr () GhcRn
resTv)) (IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(GenLocated EpAnnCO (InjectivityAnn GhcRn)))
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
forall a b. (a -> b) -> a -> b
$
do { injFrom' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
rnLTyVar LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
injFrom
; injTo' <- mapM rnLTyVar injTo
; return $ L (l2l srcSpan) (InjectivityAnn x injFrom' injTo') }
; let tvNames = [Name] -> Set Name
forall a. Ord a => [a] -> Set a
Set.fromList ([Name] -> Set Name) -> [Name] -> Set Name
forall a b. (a -> b) -> a -> b
$ LHsQTyVars GhcRn -> [Name]
hsAllLTyVarNames LHsQTyVars GhcRn
tvBndrs
; case hsLTyVarName resTv of { Maybe (IdP GhcRn)
Nothing -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
; Just IdP GhcRn
resName -> do {
; let
lhsValid :: Bool
lhsValid = Ordering
EQ Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== (Name -> Name -> Ordering
stableNameCmp IdP GhcRn
Name
resName (GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc LIdP GhcRn
GenLocated SrcSpanAnnN Name
injFrom'))
rhsValid :: Set Name
rhsValid = [Name] -> Set Name
forall a. Ord a => [a] -> Set a
Set.fromList ((GenLocated SrcSpanAnnN Name -> Name)
-> [GenLocated SrcSpanAnnN Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map GenLocated SrcSpanAnnN Name -> Name
forall l e. GenLocated l e -> e
unLoc [LIdP GhcRn]
[GenLocated SrcSpanAnnN Name]
injTo') Set Name -> Set Name -> Set Name
forall a. Ord a => Set a -> Set a -> Set a
`Set.difference` Set Name
tvNames
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
noRnErrors Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
lhsValid) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (GenLocated SrcSpanAnnN RdrName -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
injFrom) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$
IdP GhcRn -> LIdP GhcPs -> TcRnMessage
TcRnIncorrectTyVarOnLhsOfInjCond IdP GhcRn
resName LIdP GhcPs
injFrom
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
noRnErrors Bool -> Bool -> Bool
&& Bool -> Bool
not (Set Name -> Bool
forall a. Set a -> Bool
Set.null Set Name
rhsValid)) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
do { let errorVars :: [Name]
errorVars = Set Name -> [Name]
forall a. Set a -> [a]
Set.toList Set Name
rhsValid
; SrcSpan -> TcRnMessage -> TcRn ()
addErrAt (EpAnnCO -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA EpAnnCO
srcSpan) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
forall a b. (a -> b) -> a -> b
$
[Name] -> TcRnMessage
TcRnUnknownTyVarsOnRhsOfInjCond [Name]
errorVars } } }
; return injDecl' }
rnInjectivityAnn LHsQTyVars GhcRn
_ LFamilyResultSig GhcRn
_ (L EpAnnCO
srcSpan (InjectivityAnn XCInjectivityAnn GhcPs
x LIdP GhcPs
injFrom [LIdP GhcPs]
injTo)) =
EpAnnCO
-> RnM (LInjectivityAnn GhcRn) -> RnM (LInjectivityAnn GhcRn)
forall ann a. EpAnn ann -> TcRn a -> TcRn a
setSrcSpanA EpAnnCO
srcSpan (RnM (LInjectivityAnn GhcRn) -> RnM (LInjectivityAnn GhcRn))
-> RnM (LInjectivityAnn GhcRn) -> RnM (LInjectivityAnn GhcRn)
forall a b. (a -> b) -> a -> b
$ do
(injDecl', _) <- IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> TcRn (GenLocated EpAnnCO (InjectivityAnn GhcRn), Bool)
forall a. TcRn a -> TcRn (a, Bool)
askNoErrs (IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> TcRn (GenLocated EpAnnCO (InjectivityAnn GhcRn), Bool))
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated EpAnnCO (InjectivityAnn GhcRn))
-> TcRn (GenLocated EpAnnCO (InjectivityAnn GhcRn), Bool)
forall a b. (a -> b) -> a -> b
$ do
injFrom' <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
rnLTyVar LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
injFrom
injTo' <- mapM rnLTyVar injTo
return $ L srcSpan (InjectivityAnn x injFrom' injTo')
return $ injDecl'
rnConDecls :: DataDefnCons (LConDecl GhcPs) -> RnM (DataDefnCons (LConDecl GhcRn), FreeVars)
rnConDecls :: DataDefnCons (LConDecl GhcPs)
-> RnM (DataDefnCons (LConDecl GhcRn), FreeVars)
rnConDecls = (GenLocated SrcSpanAnnA (ConDecl GhcPs)
-> RnM (GenLocated SrcSpanAnnA (ConDecl GhcRn), FreeVars))
-> DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcPs))
-> RnM
(DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn)), FreeVars)
forall (f :: * -> *) a b.
Traversable f =>
(a -> RnM (b, FreeVars)) -> f a -> RnM (f b, FreeVars)
mapFvRn ((ConDecl GhcPs -> TcM (ConDecl GhcRn, FreeVars))
-> GenLocated SrcSpanAnnA (ConDecl GhcPs)
-> RnM (GenLocated SrcSpanAnnA (ConDecl GhcRn), FreeVars)
forall a b c ann.
(a -> TcM (b, c))
-> GenLocated (EpAnn ann) a -> TcM (GenLocated (EpAnn ann) b, c)
wrapLocFstMA ConDecl GhcPs -> TcM (ConDecl GhcRn, FreeVars)
rnConDecl)
rnConDecl :: ConDecl GhcPs -> RnM (ConDecl GhcRn, FreeVars)
rnConDecl :: ConDecl GhcPs -> TcM (ConDecl GhcRn, FreeVars)
rnConDecl decl :: ConDecl GhcPs
decl@(ConDeclH98 { con_name :: forall pass. ConDecl pass -> LIdP pass
con_name = LIdP GhcPs
name, con_ex_tvs :: forall pass. ConDecl pass -> [LHsTyVarBndr Specificity pass]
con_ex_tvs = [LHsTyVarBndr Specificity GhcPs]
ex_tvs
, con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
con_mb_cxt = Maybe (LHsContext GhcPs)
mcxt, con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
con_args = HsConDeclH98Details GhcPs
args
, con_doc :: forall pass. ConDecl pass -> Maybe (LHsDoc pass)
con_doc = Maybe (LHsDoc GhcPs)
mb_doc, con_forall :: forall pass. ConDecl pass -> Bool
con_forall = Bool
forall_ })
= do { _ <- (RdrName -> TcRn ()) -> GenLocated SrcSpanAnnN RdrName -> TcRn ()
forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
addLocM RdrName -> TcRn ()
checkConName LIdP GhcPs
GenLocated SrcSpanAnnN RdrName
name
; new_name <- lookupLocatedTopConstructorRnN name
; let ctxt = [GenLocated SrcSpanAnnN Name] -> HsDocContext
ConDeclCtx [GenLocated SrcSpanAnnN Name
new_name]
; bindLHsTyVarBndrs ctxt WarnUnusedForalls
Nothing ex_tvs $ \ [LHsTyVarBndr Specificity GhcRn]
new_ex_tvs ->
do { (new_context, fvs1) <- HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMbContext HsDocContext
ctxt Maybe (LHsContext GhcPs)
mcxt
; (new_args, fvs2) <- rnConDeclH98Details (unLoc new_name) ctxt args
; let all_fvs = FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2
; traceRn "rnConDecl (ConDeclH98)" (ppr name <+> vcat
[ text "ex_tvs:" <+> ppr ex_tvs
, text "new_ex_dqtvs':" <+> ppr new_ex_tvs ])
; mb_doc' <- traverse rnLHsDoc mb_doc
; return (decl { con_ext = noExtField
, con_name = new_name, con_ex_tvs = new_ex_tvs
, con_mb_cxt = new_context, con_args = new_args
, con_doc = mb_doc'
, con_forall = forall_ },
all_fvs) }}
rnConDecl (ConDeclGADT { con_names :: forall pass. ConDecl pass -> NonEmpty (LIdP pass)
con_names = NonEmpty (LIdP GhcPs)
names
, con_bndrs :: forall pass. ConDecl pass -> XRec pass (HsOuterSigTyVarBndrs pass)
con_bndrs = L SrcSpanAnnA
l HsOuterSigTyVarBndrs GhcPs
outer_bndrs
, con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
con_mb_cxt = Maybe (LHsContext GhcPs)
mcxt
, con_g_args :: forall pass. ConDecl pass -> HsConDeclGADTDetails pass
con_g_args = HsConDeclGADTDetails GhcPs
args
, con_res_ty :: forall pass. ConDecl pass -> LHsType pass
con_res_ty = LHsType GhcPs
res_ty
, con_doc :: forall pass. ConDecl pass -> Maybe (LHsDoc pass)
con_doc = Maybe (LHsDoc GhcPs)
mb_doc })
= do { (GenLocated SrcSpanAnnN RdrName -> TcRn ())
-> NonEmpty (GenLocated SrcSpanAnnN RdrName) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((RdrName -> TcRn ()) -> GenLocated SrcSpanAnnN RdrName -> TcRn ()
forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
addLocM RdrName -> TcRn ()
checkConName) NonEmpty (LIdP GhcPs)
NonEmpty (GenLocated SrcSpanAnnN RdrName)
names
; new_names <- (GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name))
-> NonEmpty (GenLocated SrcSpanAnnN RdrName)
-> IOEnv
(Env TcGblEnv TcLclEnv) (NonEmpty (GenLocated SrcSpanAnnN Name))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> NonEmpty a -> m (NonEmpty b)
mapM (GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
lookupLocatedTopConstructorRnN) NonEmpty (LIdP GhcPs)
NonEmpty (GenLocated SrcSpanAnnN RdrName)
names
; let
implicit_bndrs =
HsOuterSigTyVarBndrs GhcPs -> FreeKiTyVars -> FreeKiTyVars
forall flag.
HsOuterTyVarBndrs flag GhcPs -> FreeKiTyVars -> FreeKiTyVars
extractHsOuterTvBndrs HsOuterSigTyVarBndrs GhcPs
outer_bndrs (FreeKiTyVars -> FreeKiTyVars) -> FreeKiTyVars -> FreeKiTyVars
forall a b. (a -> b) -> a -> b
$
[LHsType GhcPs] -> FreeKiTyVars -> FreeKiTyVars
extractHsTysRdrTyVars (Maybe (LHsContext GhcPs) -> [LHsType GhcPs]
forall (p :: Pass).
Maybe (LHsContext (GhcPass p)) -> HsContext (GhcPass p)
hsConDeclTheta Maybe (LHsContext GhcPs)
mcxt) (FreeKiTyVars -> FreeKiTyVars) -> FreeKiTyVars -> FreeKiTyVars
forall a b. (a -> b) -> a -> b
$
HsConDeclGADTDetails GhcPs -> FreeKiTyVars -> FreeKiTyVars
extractConDeclGADTDetailsTyVars HsConDeclGADTDetails GhcPs
args (FreeKiTyVars -> FreeKiTyVars) -> FreeKiTyVars -> FreeKiTyVars
forall a b. (a -> b) -> a -> b
$
[LHsType GhcPs] -> FreeKiTyVars -> FreeKiTyVars
extractHsTysRdrTyVars [LHsType GhcPs
res_ty] []
; let ctxt = [GenLocated SrcSpanAnnN Name] -> HsDocContext
ConDeclCtx (NonEmpty (GenLocated SrcSpanAnnN Name)
-> [GenLocated SrcSpanAnnN Name]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList NonEmpty (GenLocated SrcSpanAnnN Name)
new_names)
; bindHsOuterTyVarBndrs ctxt Nothing implicit_bndrs outer_bndrs $ \HsOuterTyVarBndrs Specificity GhcRn
outer_bndrs' ->
do { (new_cxt, fvs1) <- HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMbContext HsDocContext
ctxt Maybe (LHsContext GhcPs)
mcxt
; (new_args, fvs2) <- rnConDeclGADTDetails (unLoc (head new_names)) ctxt args
; (new_res_ty, fvs3) <- rnLHsType ctxt res_ty
; addNoNestedForallsContextsErr ctxt
NFC_GadtConSig new_res_ty
; let all_fvs = FreeVars
fvs1 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs2 FreeVars -> FreeVars -> FreeVars
`plusFV` FreeVars
fvs3
; traceRn "rnConDecl (ConDeclGADT)"
(ppr names $$ ppr outer_bndrs')
; new_mb_doc <- traverse rnLHsDoc mb_doc
; return (ConDeclGADT { con_g_ext = noExtField, con_names = new_names
, con_bndrs = L l outer_bndrs', con_mb_cxt = new_cxt
, con_g_args = new_args, con_res_ty = new_res_ty
, con_doc = new_mb_doc },
all_fvs) } }
rnMbContext :: HsDocContext -> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMbContext :: HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMbContext HsDocContext
_ Maybe (LHsContext GhcPs)
Nothing = (Maybe
(GenLocated SrcSpanAnnC [GenLocated SrcSpanAnnA (HsType GhcRn)]),
FreeVars)
-> IOEnv
(Env TcGblEnv TcLclEnv)
(Maybe
(GenLocated SrcSpanAnnC [GenLocated SrcSpanAnnA (HsType GhcRn)]),
FreeVars)
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe
(GenLocated SrcSpanAnnC [GenLocated SrcSpanAnnA (HsType GhcRn)])
forall a. Maybe a
Nothing, FreeVars
emptyFVs)
rnMbContext HsDocContext
doc Maybe (LHsContext GhcPs)
cxt = do { (ctx',fvs) <- HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMaybeContext HsDocContext
doc Maybe (LHsContext GhcPs)
cxt
; return (ctx',fvs) }
rnConDeclH98Details ::
Name
-> HsDocContext
-> HsConDeclH98Details GhcPs
-> RnM (HsConDeclH98Details GhcRn, FreeVars)
rnConDeclH98Details :: Name
-> HsDocContext
-> HsConDeclH98Details GhcPs
-> RnM (HsConDeclH98Details GhcRn, FreeVars)
rnConDeclH98Details Name
_ HsDocContext
doc (PrefixCon [Void]
_ [HsScaled GhcPs (LHsType GhcPs)]
tys)
= do { (new_tys, fvs) <- (HsScaled GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))
-> RnM
(HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars))
-> [HsScaled GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))]
-> RnM
([HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))],
FreeVars)
forall (f :: * -> *) a b.
Traversable f =>
(a -> RnM (b, FreeVars)) -> f a -> RnM (f b, FreeVars)
mapFvRn (HsDocContext
-> HsScaled GhcPs (LHsType GhcPs)
-> RnM (HsScaled GhcRn (LHsType GhcRn), FreeVars)
rnScaledLHsType HsDocContext
doc) [HsScaled GhcPs (LHsType GhcPs)]
[HsScaled GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))]
tys
; return (PrefixCon noTypeArgs new_tys, fvs) }
rnConDeclH98Details Name
_ HsDocContext
doc (InfixCon HsScaled GhcPs (LHsType GhcPs)
ty1 HsScaled GhcPs (LHsType GhcPs)
ty2)
= do { (new_ty1, fvs1) <- HsDocContext
-> HsScaled GhcPs (LHsType GhcPs)
-> RnM (HsScaled GhcRn (LHsType GhcRn), FreeVars)
rnScaledLHsType HsDocContext
doc HsScaled GhcPs (LHsType GhcPs)
ty1
; (new_ty2, fvs2) <- rnScaledLHsType doc ty2
; return (InfixCon new_ty1 new_ty2, fvs1 `plusFV` fvs2) }
rnConDeclH98Details Name
con HsDocContext
doc (RecCon XRec GhcPs [XRec GhcPs (ConDeclField GhcPs)]
flds)
= do { (new_flds, fvs) <- Name
-> HsDocContext
-> GenLocated SrcSpanAnnL [XRec GhcPs (ConDeclField GhcPs)]
-> RnM (LocatedL [LConDeclField GhcRn], FreeVars)
rnRecConDeclFields Name
con HsDocContext
doc XRec GhcPs [XRec GhcPs (ConDeclField GhcPs)]
GenLocated SrcSpanAnnL [XRec GhcPs (ConDeclField GhcPs)]
flds
; return (RecCon new_flds, fvs) }
rnConDeclGADTDetails ::
Name
-> HsDocContext
-> HsConDeclGADTDetails GhcPs
-> RnM (HsConDeclGADTDetails GhcRn, FreeVars)
rnConDeclGADTDetails :: Name
-> HsDocContext
-> HsConDeclGADTDetails GhcPs
-> RnM (HsConDeclGADTDetails GhcRn, FreeVars)
rnConDeclGADTDetails Name
_ HsDocContext
doc (PrefixConGADT XPrefixConGADT GhcPs
_ [HsScaled GhcPs (LHsType GhcPs)]
tys)
= do { (new_tys, fvs) <- (HsScaled GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))
-> RnM
(HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)), FreeVars))
-> [HsScaled GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))]
-> RnM
([HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))],
FreeVars)
forall (f :: * -> *) a b.
Traversable f =>
(a -> RnM (b, FreeVars)) -> f a -> RnM (f b, FreeVars)
mapFvRn (HsDocContext
-> HsScaled GhcPs (LHsType GhcPs)
-> RnM (HsScaled GhcRn (LHsType GhcRn), FreeVars)
rnScaledLHsType HsDocContext
doc) [HsScaled GhcPs (LHsType GhcPs)]
[HsScaled GhcPs (GenLocated SrcSpanAnnA (HsType GhcPs))]
tys
; return (PrefixConGADT noExtField new_tys, fvs) }
rnConDeclGADTDetails Name
con HsDocContext
doc (RecConGADT XRecConGADT GhcPs
_ XRec GhcPs [XRec GhcPs (ConDeclField GhcPs)]
flds)
= do { (new_flds, fvs) <- Name
-> HsDocContext
-> GenLocated SrcSpanAnnL [XRec GhcPs (ConDeclField GhcPs)]
-> RnM (LocatedL [LConDeclField GhcRn], FreeVars)
rnRecConDeclFields Name
con HsDocContext
doc XRec GhcPs [XRec GhcPs (ConDeclField GhcPs)]
GenLocated SrcSpanAnnL [XRec GhcPs (ConDeclField GhcPs)]
flds
; return (RecConGADT noExtField new_flds, fvs) }
rnRecConDeclFields ::
Name
-> HsDocContext
-> LocatedL [LConDeclField GhcPs]
-> RnM (LocatedL [LConDeclField GhcRn], FreeVars)
rnRecConDeclFields :: Name
-> HsDocContext
-> GenLocated SrcSpanAnnL [XRec GhcPs (ConDeclField GhcPs)]
-> RnM (LocatedL [LConDeclField GhcRn], FreeVars)
rnRecConDeclFields Name
con HsDocContext
doc (L SrcSpanAnnL
l [XRec GhcPs (ConDeclField GhcPs)]
fields)
= do { fls <- HasDebugCallStack => Name -> RnM [FieldLabel]
Name -> RnM [FieldLabel]
lookupConstructorFields Name
con
; (new_fields, fvs) <- rnConDeclFields doc fls fields
; pure (L l new_fields, fvs) }
extendPatSynEnv :: DuplicateRecordFields -> FieldSelectors -> HsValBinds GhcPs -> MiniFixityEnv
-> ([Name] -> TcRnIf TcGblEnv TcLclEnv a) -> TcM a
extendPatSynEnv :: forall a.
DuplicateRecordFields
-> FieldSelectors
-> HsValBinds GhcPs
-> MiniFixityEnv
-> ([Name] -> TcRnIf TcGblEnv TcLclEnv a)
-> TcRnIf TcGblEnv TcLclEnv a
extendPatSynEnv DuplicateRecordFields
dup_fields_ok FieldSelectors
has_sel HsValBinds GhcPs
val_decls MiniFixityEnv
local_fix_env [Name] -> TcRnIf TcGblEnv TcLclEnv a
thing = do {
names_with_fls <- HsValBinds GhcPs -> TcM [(ConLikeName, ConInfo)]
new_ps HsValBinds GhcPs
val_decls
; let pat_syn_bndrs = [[Name]] -> [Name]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ ConLikeName -> Name
conLikeName_Name ConLikeName
name Name -> [Name] -> [Name]
forall a. a -> [a] -> [a]
: (FieldLabel -> Name) -> [FieldLabel] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map FieldLabel -> Name
flSelector [FieldLabel]
flds
| (ConLikeName
name, ConInfo
con_info) <- [(ConLikeName, ConInfo)]
names_with_fls
, let flds :: [FieldLabel]
flds = ConInfo -> [FieldLabel]
conInfoFields ConInfo
con_info ]
; let gres = ((ConLikeName, ConInfo) -> GlobalRdrEltX GREInfo)
-> [(ConLikeName, ConInfo)] -> [GlobalRdrEltX GREInfo]
forall a b. (a -> b) -> [a] -> [b]
map (Parent -> (ConLikeName, ConInfo) -> GlobalRdrEltX GREInfo
mkLocalConLikeGRE Parent
NoParent) [(ConLikeName, ConInfo)]
names_with_fls
[GlobalRdrEltX GREInfo]
-> [GlobalRdrEltX GREInfo] -> [GlobalRdrEltX GREInfo]
forall a. [a] -> [a] -> [a]
++ Parent -> [(ConLikeName, ConInfo)] -> [GlobalRdrEltX GREInfo]
mkLocalFieldGREs Parent
NoParent [(ConLikeName, ConInfo)]
names_with_fls
; (gbl_env, lcl_env) <- extendGlobalRdrEnvRn gres local_fix_env
; restoreEnvs (gbl_env, lcl_env) (thing pat_syn_bndrs) }
where
new_ps :: HsValBinds GhcPs -> TcM [(ConLikeName, ConInfo)]
new_ps :: HsValBinds GhcPs -> TcM [(ConLikeName, ConInfo)]
new_ps (ValBinds XValBinds GhcPs GhcPs
_ LHsBinds GhcPs
binds [LSig GhcPs]
_) = (GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> [(ConLikeName, ConInfo)] -> TcM [(ConLikeName, ConInfo)])
-> [(ConLikeName, ConInfo)]
-> [GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)]
-> TcM [(ConLikeName, ConInfo)]
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> b -> m b) -> b -> t a -> m b
foldrM LHsBindLR GhcPs GhcPs
-> [(ConLikeName, ConInfo)] -> TcM [(ConLikeName, ConInfo)]
GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)
-> [(ConLikeName, ConInfo)] -> TcM [(ConLikeName, ConInfo)]
new_ps' [] LHsBinds GhcPs
[GenLocated SrcSpanAnnA (HsBindLR GhcPs GhcPs)]
binds
new_ps HsValBinds GhcPs
_ = String -> TcM [(ConLikeName, ConInfo)]
forall a. HasCallStack => String -> a
panic String
"new_ps"
new_ps' :: LHsBindLR GhcPs GhcPs
-> [(ConLikeName, ConInfo)]
-> TcM [(ConLikeName, ConInfo)]
new_ps' :: LHsBindLR GhcPs GhcPs
-> [(ConLikeName, ConInfo)] -> TcM [(ConLikeName, ConInfo)]
new_ps' LHsBindLR GhcPs GhcPs
bind [(ConLikeName, ConInfo)]
names
| (L SrcSpanAnnA
bind_loc (PatSynBind XPatSynBind GhcPs GhcPs
_ (PSB { psb_id :: forall idL idR. PatSynBind idL idR -> LIdP idL
psb_id = L SrcSpanAnnN
_ RdrName
n
, psb_args :: forall idL idR. PatSynBind idL idR -> HsPatSynDetails idR
psb_args = RecCon [RecordPatSynField GhcPs]
as }))) <- LHsBindLR GhcPs GhcPs
bind
= do
bnd_name <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) Name
newTopSrcBinder (SrcSpanAnnN -> RdrName -> GenLocated SrcSpanAnnN RdrName
forall l e. l -> e -> GenLocated l e
L (SrcSpanAnnA -> SrcSpanAnnN
forall a b. (HasLoc a, HasAnnotation b) => a -> b
l2l SrcSpanAnnA
bind_loc) RdrName
n)
let field_occs = (RecordPatSynField GhcPs
-> GenLocated SrcSpanAnnA (FieldOcc GhcPs))
-> [RecordPatSynField GhcPs]
-> [GenLocated SrcSpanAnnA (FieldOcc GhcPs)]
forall a b. (a -> b) -> [a] -> [b]
map ((\ FieldOcc GhcPs
f -> SrcSpanAnnA
-> FieldOcc GhcPs -> GenLocated SrcSpanAnnA (FieldOcc GhcPs)
forall l e. l -> e -> GenLocated l e
L (SrcSpan -> SrcSpanAnnA
forall e. HasAnnotation e => SrcSpan -> e
noAnnSrcSpan (SrcSpan -> SrcSpanAnnA) -> SrcSpan -> SrcSpanAnnA
forall a b. (a -> b) -> a -> b
$ GenLocated SrcSpanAnnN RdrName -> SrcSpan
forall a e. HasLoc a => GenLocated a e -> SrcSpan
getLocA (FieldOcc GhcPs -> LIdP GhcPs
forall pass. FieldOcc pass -> LIdP pass
foLabel FieldOcc GhcPs
f)) FieldOcc GhcPs
f) (FieldOcc GhcPs -> GenLocated SrcSpanAnnA (FieldOcc GhcPs))
-> (RecordPatSynField GhcPs -> FieldOcc GhcPs)
-> RecordPatSynField GhcPs
-> GenLocated SrcSpanAnnA (FieldOcc GhcPs)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RecordPatSynField GhcPs -> FieldOcc GhcPs
forall pass. RecordPatSynField pass -> FieldOcc pass
recordPatSynField) [RecordPatSynField GhcPs]
as
flds <- mapM (newRecordFieldLabel dup_fields_ok has_sel [bnd_name]) field_occs
let con_info = ConLikeInfo -> Int -> [FieldLabel] -> ConInfo
mkConInfo ConLikeInfo
ConIsPatSyn (([RecordPatSynField GhcPs] -> Int)
-> HsConDetails (ZonkAny 1) (ZonkAny 0) [RecordPatSynField GhcPs]
-> Int
forall rec tyarg arg.
(rec -> Int) -> HsConDetails tyarg arg rec -> Int
conDetailsArity [RecordPatSynField GhcPs] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([RecordPatSynField GhcPs]
-> HsConDetails (ZonkAny 1) (ZonkAny 0) [RecordPatSynField GhcPs]
forall tyarg arg rec. rec -> HsConDetails tyarg arg rec
RecCon [RecordPatSynField GhcPs]
as)) [FieldLabel]
flds
return ((PatSynName bnd_name, con_info) : names)
| L SrcSpanAnnA
bind_loc (PatSynBind XPatSynBind GhcPs GhcPs
_ (PSB { psb_id :: forall idL idR. PatSynBind idL idR -> LIdP idL
psb_id = L SrcSpanAnnN
_ RdrName
n, psb_args :: forall idL idR. PatSynBind idL idR -> HsPatSynDetails idR
psb_args = HsConDetails Void (LIdP GhcPs) [RecordPatSynField GhcPs]
as })) <- LHsBindLR GhcPs GhcPs
bind
= do
bnd_name <- GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) Name
newTopSrcBinder (SrcSpanAnnN -> RdrName -> GenLocated SrcSpanAnnN RdrName
forall l e. l -> e -> GenLocated l e
L (SrcSpanAnnA -> SrcSpanAnnN
forall a b. (HasLoc a, HasAnnotation b) => a -> b
l2l SrcSpanAnnA
bind_loc) RdrName
n)
let con_info = ConLikeInfo -> Int -> [FieldLabel] -> ConInfo
mkConInfo ConLikeInfo
ConIsPatSyn (([RecordPatSynField GhcPs] -> Int)
-> HsConDetails
Void (GenLocated SrcSpanAnnN RdrName) [RecordPatSynField GhcPs]
-> Int
forall rec tyarg arg.
(rec -> Int) -> HsConDetails tyarg arg rec -> Int
conDetailsArity [RecordPatSynField GhcPs] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length HsConDetails Void (LIdP GhcPs) [RecordPatSynField GhcPs]
HsConDetails
Void (GenLocated SrcSpanAnnN RdrName) [RecordPatSynField GhcPs]
as) []
return ((PatSynName bnd_name, con_info) : names)
| Bool
otherwise
= [(ConLikeName, ConInfo)] -> TcM [(ConLikeName, ConInfo)]
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return [(ConLikeName, ConInfo)]
names
conDetailsArity :: (rec -> Arity) -> HsConDetails tyarg arg rec -> Arity
conDetailsArity :: forall rec tyarg arg.
(rec -> Int) -> HsConDetails tyarg arg rec -> Int
conDetailsArity rec -> Int
recToArity = \case
PrefixCon [tyarg]
_ [arg]
args -> [arg] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [arg]
args
RecCon rec
rec -> rec -> Int
recToArity rec
rec
InfixCon arg
_ arg
_ -> Int
2
rnFds :: [LHsFunDep GhcPs] -> RnM [LHsFunDep GhcRn]
rnFds :: [LHsFunDep GhcPs] -> RnM [LHsFunDep GhcRn]
rnFds [LHsFunDep GhcPs]
fds
= (GenLocated SrcSpanAnnA (FunDep GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnA (FunDep GhcRn)))
-> [GenLocated SrcSpanAnnA (FunDep GhcPs)]
-> IOEnv
(Env TcGblEnv TcLclEnv) [GenLocated SrcSpanAnnA (FunDep GhcRn)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((FunDep GhcPs -> TcM (FunDep GhcRn))
-> GenLocated SrcSpanAnnA (FunDep GhcPs)
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnA (FunDep GhcRn))
forall a b ann.
(a -> TcM b)
-> GenLocated (EpAnn ann) a -> TcRn (GenLocated (EpAnn ann) b)
wrapLocMA FunDep GhcPs -> TcM (FunDep GhcRn)
rn_fds) [LHsFunDep GhcPs]
[GenLocated SrcSpanAnnA (FunDep GhcPs)]
fds
where
rn_fds :: FunDep GhcPs -> RnM (FunDep GhcRn)
rn_fds :: FunDep GhcPs -> TcM (FunDep GhcRn)
rn_fds (FunDep XCFunDep GhcPs
x [LIdP GhcPs]
tys1 [LIdP GhcPs]
tys2)
= do { tys1' <- FreeKiTyVars
-> IOEnv (Env TcGblEnv TcLclEnv) [GenLocated SrcSpanAnnN Name]
rnHsTyVars [LIdP GhcPs]
FreeKiTyVars
tys1
; tys2' <- rnHsTyVars tys2
; return (FunDep x tys1' tys2') }
rnHsTyVars :: [LocatedN RdrName] -> RnM [LocatedN Name]
rnHsTyVars :: FreeKiTyVars
-> IOEnv (Env TcGblEnv TcLclEnv) [GenLocated SrcSpanAnnN Name]
rnHsTyVars FreeKiTyVars
tvs = (GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name))
-> FreeKiTyVars
-> IOEnv (Env TcGblEnv TcLclEnv) [GenLocated SrcSpanAnnN Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
rnHsTyVar FreeKiTyVars
tvs
rnHsTyVar :: LocatedN RdrName -> RnM (LocatedN Name)
rnHsTyVar :: GenLocated SrcSpanAnnN RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (GenLocated SrcSpanAnnN Name)
rnHsTyVar (L SrcSpanAnnN
l RdrName
tyvar) = do
tyvar' <- RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
lookupOccRn RdrName
tyvar
return (L l tyvar')
findSplice :: [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
findSplice :: [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
findSplice [LHsDecl GhcPs]
ds = HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl HsGroup GhcPs
forall (p :: Pass). HsGroup (GhcPass p)
emptyRdrGroup [LHsDecl GhcPs]
ds
addl :: HsGroup GhcPs -> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl :: HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl HsGroup GhcPs
gp [] = (HsGroup GhcPs,
Maybe (SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)]))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(HsGroup GhcPs,
Maybe (SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)]))
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HsGroup GhcPs
gp, Maybe (SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)])
forall a. Maybe a
Nothing)
addl HsGroup GhcPs
gp (L SrcSpanAnnA
l HsDecl GhcPs
d : [LHsDecl GhcPs]
ds) = HsGroup GhcPs
-> SrcSpanAnnA
-> HsDecl GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
add HsGroup GhcPs
gp SrcSpanAnnA
l HsDecl GhcPs
d [LHsDecl GhcPs]
ds
add :: HsGroup GhcPs -> SrcSpanAnnA -> HsDecl GhcPs -> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
add :: HsGroup GhcPs
-> SrcSpanAnnA
-> HsDecl GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
add HsGroup GhcPs
gp SrcSpanAnnA
_ (SpliceD XSpliceD GhcPs
_ (SpliceDecl XSpliceDecl GhcPs
_ (L SrcSpanAnnA
_ qq :: HsUntypedSplice GhcPs
qq@HsQuasiQuote{}) SpliceDecoration
_)) [LHsDecl GhcPs]
ds
= do { (ds', _) <- HsUntypedSplice GhcPs -> RnM ([LHsDecl GhcPs], FreeVars)
rnTopSpliceDecls HsUntypedSplice GhcPs
qq
; addl gp (ds' ++ ds)
}
add HsGroup GhcPs
gp SrcSpanAnnA
loc (SpliceD XSpliceD GhcPs
_ splice :: SpliceDecl GhcPs
splice@(SpliceDecl XSpliceDecl GhcPs
_ XRec GhcPs (HsUntypedSplice GhcPs)
_ SpliceDecoration
flag)) [LHsDecl GhcPs]
ds
= do {
case SpliceDecoration
flag of
SpliceDecoration
DollarSplice -> () -> TcRn ()
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
SpliceDecoration
BareSplice -> do { Extension -> TcRn () -> TcRn ()
forall gbl lcl. Extension -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
unlessXOptM Extension
LangExt.TemplateHaskell
(TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan (SrcSpanAnnA -> SrcSpan
forall a. HasLoc a => a -> SrcSpan
locA SrcSpanAnnA
loc)
(TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ TcRnMessage -> TcRn ()
forall a. TcRnMessage -> TcM a
failWith TcRnMessage
badImplicitSplice }
; (HsGroup GhcPs,
Maybe (SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)]))
-> IOEnv
(Env TcGblEnv TcLclEnv)
(HsGroup GhcPs,
Maybe (SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)]))
forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
forall (m :: * -> *) a. Monad m => a -> m a
return (HsGroup GhcPs
gp, (SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)])
-> Maybe
(SpliceDecl GhcPs, [GenLocated SrcSpanAnnA (HsDecl GhcPs)])
forall a. a -> Maybe a
Just (SpliceDecl GhcPs
splice, [LHsDecl GhcPs]
[GenLocated SrcSpanAnnA (HsDecl GhcPs)]
ds)) }
where
badImplicitSplice :: TcRnMessage
badImplicitSplice :: TcRnMessage
badImplicitSplice = THError -> TcRnMessage
TcRnTHError (THSyntaxError -> THError
THSyntaxError THSyntaxError
BadImplicitSplice)
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpanAnnA
l (TyClD XTyClD GhcPs
_ TyClDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_tyclds = add_tycld (L l d) ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_fixds :: forall p. HsGroup p -> [LFixitySig p]
hs_fixds = [LFixitySig GhcPs]
ts}) SrcSpanAnnA
l (SigD XSigD GhcPs
_ (FixSig XFixSig GhcPs
_ FixitySig GhcPs
f)) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp {hs_fixds = L l f : ts}) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpanAnnA
l (KindSigD XKindSigD GhcPs
_ StandaloneKindSig GhcPs
s) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp {hs_tyclds = add_kisig (L l s) ts}) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_valds :: forall p. HsGroup p -> HsValBinds p
hs_valds = HsValBinds GhcPs
ts}) SrcSpanAnnA
l (SigD XSigD GhcPs
_ Sig GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp {hs_valds = add_sig (L l d) ts}) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_valds :: forall p. HsGroup p -> HsValBinds p
hs_valds = HsValBinds GhcPs
ts}) SrcSpanAnnA
l (ValD XValD GhcPs
_ HsBindLR GhcPs GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_valds = add_bind (L l d) ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpanAnnA
l (RoleAnnotD XRoleAnnotD GhcPs
_ RoleAnnotDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_tyclds = add_role_annot (L l d) ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpanAnnA
l (InstD XInstD GhcPs
_ InstDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_tyclds = add_instd (L l d) ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_derivds :: forall p. HsGroup p -> [LDerivDecl p]
hs_derivds = [LDerivDecl GhcPs]
ts}) SrcSpanAnnA
l (DerivD XDerivD GhcPs
_ DerivDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_derivds = L l d : ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_defds :: forall p. HsGroup p -> [LDefaultDecl p]
hs_defds = [LDefaultDecl GhcPs]
ts}) SrcSpanAnnA
l (DefD XDefD GhcPs
_ DefaultDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_defds = L l d : ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_fords :: forall p. HsGroup p -> [LForeignDecl p]
hs_fords = [LForeignDecl GhcPs]
ts}) SrcSpanAnnA
l (ForD XForD GhcPs
_ ForeignDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_fords = L l d : ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_warnds :: forall p. HsGroup p -> [LWarnDecls p]
hs_warnds = [LWarnDecls GhcPs]
ts}) SrcSpanAnnA
l (WarningD XWarningD GhcPs
_ WarnDecls GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_warnds = L l d : ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_annds :: forall p. HsGroup p -> [LAnnDecl p]
hs_annds = [LAnnDecl GhcPs]
ts}) SrcSpanAnnA
l (AnnD XAnnD GhcPs
_ AnnDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_annds = L l d : ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_ruleds :: forall p. HsGroup p -> [LRuleDecls p]
hs_ruleds = [LRuleDecls GhcPs]
ts}) SrcSpanAnnA
l (RuleD XRuleD GhcPs
_ RuleDecls GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_ruleds = L l d : ts }) [LHsDecl GhcPs]
ds
add HsGroup GhcPs
gp SrcSpanAnnA
l (DocD XDocD GhcPs
_ DocDecl GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_docs = (L l d) : (hs_docs gp) }) [LHsDecl GhcPs]
ds
add_tycld :: LTyClDecl (GhcPass p) -> [TyClGroup (GhcPass p)]
-> [TyClGroup (GhcPass p)]
add_tycld :: forall (p :: Pass).
LTyClDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_tycld LTyClDecl (GhcPass p)
d [] = [TyClGroup { group_ext :: XCTyClGroup (GhcPass p)
group_ext = XCTyClGroup (GhcPass p)
NoExtField
noExtField
, group_tyclds :: [LTyClDecl (GhcPass p)]
group_tyclds = [LTyClDecl (GhcPass p)
d]
, group_kisigs :: [LStandaloneKindSig (GhcPass p)]
group_kisigs = []
, group_roles :: [LRoleAnnotDecl (GhcPass p)]
group_roles = []
, group_instds :: [LInstDecl (GhcPass p)]
group_instds = []
}
]
add_tycld LTyClDecl (GhcPass p)
d (ds :: TyClGroup (GhcPass p)
ds@(TyClGroup { group_tyclds :: forall pass. TyClGroup pass -> [LTyClDecl pass]
group_tyclds = [LTyClDecl (GhcPass p)]
tyclds }):[TyClGroup (GhcPass p)]
dss)
= TyClGroup (GhcPass p)
ds { group_tyclds = d : tyclds } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
dss
add_instd :: LInstDecl (GhcPass p) -> [TyClGroup (GhcPass p)]
-> [TyClGroup (GhcPass p)]
add_instd :: forall (p :: Pass).
LInstDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_instd LInstDecl (GhcPass p)
d [] = [TyClGroup { group_ext :: XCTyClGroup (GhcPass p)
group_ext = XCTyClGroup (GhcPass p)
NoExtField
noExtField
, group_tyclds :: [LTyClDecl (GhcPass p)]
group_tyclds = []
, group_kisigs :: [LStandaloneKindSig (GhcPass p)]
group_kisigs = []
, group_roles :: [LRoleAnnotDecl (GhcPass p)]
group_roles = []
, group_instds :: [LInstDecl (GhcPass p)]
group_instds = [LInstDecl (GhcPass p)
d]
}
]
add_instd LInstDecl (GhcPass p)
d (ds :: TyClGroup (GhcPass p)
ds@(TyClGroup { group_instds :: forall pass. TyClGroup pass -> [LInstDecl pass]
group_instds = [LInstDecl (GhcPass p)]
instds }):[TyClGroup (GhcPass p)]
dss)
= TyClGroup (GhcPass p)
ds { group_instds = d : instds } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
dss
add_role_annot :: LRoleAnnotDecl (GhcPass p) -> [TyClGroup (GhcPass p)]
-> [TyClGroup (GhcPass p)]
add_role_annot :: forall (p :: Pass).
LRoleAnnotDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_role_annot LRoleAnnotDecl (GhcPass p)
d [] = [TyClGroup { group_ext :: XCTyClGroup (GhcPass p)
group_ext = XCTyClGroup (GhcPass p)
NoExtField
noExtField
, group_tyclds :: [LTyClDecl (GhcPass p)]
group_tyclds = []
, group_kisigs :: [LStandaloneKindSig (GhcPass p)]
group_kisigs = []
, group_roles :: [LRoleAnnotDecl (GhcPass p)]
group_roles = [LRoleAnnotDecl (GhcPass p)
d]
, group_instds :: [LInstDecl (GhcPass p)]
group_instds = []
}
]
add_role_annot LRoleAnnotDecl (GhcPass p)
d (tycls :: TyClGroup (GhcPass p)
tycls@(TyClGroup { group_roles :: forall pass. TyClGroup pass -> [LRoleAnnotDecl pass]
group_roles = [LRoleAnnotDecl (GhcPass p)]
roles }) : [TyClGroup (GhcPass p)]
rest)
= TyClGroup (GhcPass p)
tycls { group_roles = d : roles } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
rest
add_kisig :: LStandaloneKindSig (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_kisig :: forall (p :: Pass).
LStandaloneKindSig (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_kisig LStandaloneKindSig (GhcPass p)
d [] = [TyClGroup { group_ext :: XCTyClGroup (GhcPass p)
group_ext = XCTyClGroup (GhcPass p)
NoExtField
noExtField
, group_tyclds :: [LTyClDecl (GhcPass p)]
group_tyclds = []
, group_kisigs :: [LStandaloneKindSig (GhcPass p)]
group_kisigs = [LStandaloneKindSig (GhcPass p)
d]
, group_roles :: [LRoleAnnotDecl (GhcPass p)]
group_roles = []
, group_instds :: [LInstDecl (GhcPass p)]
group_instds = []
}
]
add_kisig LStandaloneKindSig (GhcPass p)
d (tycls :: TyClGroup (GhcPass p)
tycls@(TyClGroup { group_kisigs :: forall pass. TyClGroup pass -> [LStandaloneKindSig pass]
group_kisigs = [LStandaloneKindSig (GhcPass p)]
kisigs }) : [TyClGroup (GhcPass p)]
rest)
= TyClGroup (GhcPass p)
tycls { group_kisigs = d : kisigs } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
rest
add_bind :: LHsBind a -> HsValBinds a -> HsValBinds a
add_bind :: forall a. LHsBind a -> HsValBinds a -> HsValBinds a
add_bind LHsBind a
b (ValBinds XValBinds a a
x LHsBindsLR a a
bs [LSig a]
sigs) = XValBinds a a -> LHsBindsLR a a -> [LSig a] -> HsValBindsLR a a
forall idL idR.
XValBinds idL idR
-> LHsBindsLR idL idR -> [LSig idR] -> HsValBindsLR idL idR
ValBinds XValBinds a a
x (LHsBindsLR a a
bs LHsBindsLR a a -> LHsBindsLR a a -> LHsBindsLR a a
forall a. [a] -> [a] -> [a]
++ [LHsBind a
b]) [LSig a]
sigs
add_bind LHsBind a
_ (XValBindsLR {}) = String -> HsValBindsLR a a
forall a. HasCallStack => String -> a
panic String
"GHC.Rename.Module.add_bind"
add_sig :: LSig (GhcPass a) -> HsValBinds (GhcPass a) -> HsValBinds (GhcPass a)
add_sig :: forall (a :: Pass).
LSig (GhcPass a)
-> HsValBinds (GhcPass a) -> HsValBinds (GhcPass a)
add_sig LSig (GhcPass a)
s (ValBinds XValBinds (GhcPass a) (GhcPass a)
x LHsBindsLR (GhcPass a) (GhcPass a)
bs [LSig (GhcPass a)]
sigs) = XValBinds (GhcPass a) (GhcPass a)
-> LHsBindsLR (GhcPass a) (GhcPass a)
-> [LSig (GhcPass a)]
-> HsValBindsLR (GhcPass a) (GhcPass a)
forall idL idR.
XValBinds idL idR
-> LHsBindsLR idL idR -> [LSig idR] -> HsValBindsLR idL idR
ValBinds XValBinds (GhcPass a) (GhcPass a)
x LHsBindsLR (GhcPass a) (GhcPass a)
bs (LSig (GhcPass a)
GenLocated SrcSpanAnnA (Sig (GhcPass a))
sGenLocated SrcSpanAnnA (Sig (GhcPass a))
-> [GenLocated SrcSpanAnnA (Sig (GhcPass a))]
-> [GenLocated SrcSpanAnnA (Sig (GhcPass a))]
forall a. a -> [a] -> [a]
:[LSig (GhcPass a)]
[GenLocated SrcSpanAnnA (Sig (GhcPass a))]
sigs)
add_sig LSig (GhcPass a)
_ (XValBindsLR {}) = String -> HsValBindsLR (GhcPass a) (GhcPass a)
forall a. HasCallStack => String -> a
panic String
"GHC.Rename.Module.add_sig"