{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE ViewPatterns #-}
module RnSource (
rnSrcDecls, addTcgDUs, findSplice
) where
#include "HsVersions.h"
import GhcPrelude
import {-# SOURCE #-} RnExpr( rnLExpr )
import {-# SOURCE #-} RnSplice ( rnSpliceDecl, rnTopSpliceDecls )
import GHC.Hs
import FieldLabel
import RdrName
import RnTypes
import RnBinds
import RnEnv
import RnUtils ( HsDocContext(..), mapFvRn, bindLocalNames
, checkDupRdrNames, inHsDocContext, bindLocalNamesFV
, checkShadowedRdrNames, warnUnusedTypePatterns
, extendTyVarEnvFVRn, newLocalBndrsRn
, withHsDocContext )
import RnUnbound ( mkUnboundName, notInScopeErr )
import RnNames
import RnHsDoc ( rnHsDoc, rnMbLHsDoc )
import TcAnnotations ( annCtxt )
import TcRnMonad
import ForeignCall ( CCallTarget(..) )
import Module
import HscTypes ( Warnings(..), plusWarns )
import PrelNames ( applicativeClassName, pureAName, thenAName
, monadClassName, returnMName, thenMName
, semigroupClassName, sappendName
, monoidClassName, mappendName
)
import Name
import NameSet
import NameEnv
import Avail
import Outputable
import Bag
import BasicTypes ( pprRuleName, TypeOrKind(..) )
import FastString
import SrcLoc
import DynFlags
import Util ( debugIsOn, filterOut, lengthExceeds, partitionWith )
import HscTypes ( HscEnv, hsc_dflags )
import ListSetOps ( findDupsEq, removeDups, equivClasses )
import Digraph ( SCC, flattenSCC, flattenSCCs, Node(..)
, stronglyConnCompFromEdgedVerticesUniq )
import UniqSet
import OrdList
import qualified GHC.LanguageExtensions as LangExt
import Control.Monad
import Control.Arrow ( first )
import Data.List ( mapAccumL )
import qualified Data.List.NonEmpty as NE
import Data.List.NonEmpty ( NonEmpty(..) )
import Data.Maybe ( isNothing, fromMaybe, mapMaybe )
import qualified Data.Set as Set ( difference, fromList, toList, null )
import Data.Function ( on )
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]
hs_docs = [LDocDecl]
docs })
= do {
MiniFixityEnv
local_fix_env <- [LFixitySig GhcPs] -> RnM MiniFixityEnv
makeMiniFixityEnv [LFixitySig GhcPs]
fix_decls ;
((TcGblEnv, TcLclEnv)
tc_envs, NameSet
tc_bndrs) <- MiniFixityEnv
-> HsGroup GhcPs -> RnM ((TcGblEnv, TcLclEnv), NameSet)
getLocalNonValBinders MiniFixityEnv
local_fix_env HsGroup GhcPs
group ;
(TcGblEnv, TcLclEnv)
-> RnM (TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn)
forall gbl' lcl' a gbl lcl.
(gbl', lcl') -> TcRnIf gbl' lcl' a -> TcRnIf gbl lcl a
setEnvs (TcGblEnv, TcLclEnv)
tc_envs (RnM (TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn))
-> RnM (TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn)
forall a b. (a -> b) -> a -> b
$ do {
TcRn ()
failIfErrsM ;
HsValBinds GhcPs
-> MiniFixityEnv
-> ([Name] -> RnM (TcGblEnv, HsGroup GhcRn))
-> RnM (TcGblEnv, HsGroup GhcRn)
forall a.
HsValBinds GhcPs
-> MiniFixityEnv
-> ([Name] -> TcRnIf TcGblEnv TcLclEnv a)
-> TcRnIf TcGblEnv TcLclEnv a
extendPatSynEnv HsValBinds GhcPs
val_decls MiniFixityEnv
local_fix_env (([Name] -> RnM (TcGblEnv, HsGroup GhcRn))
-> RnM (TcGblEnv, HsGroup GhcRn))
-> ([Name] -> RnM (TcGblEnv, HsGroup GhcRn))
-> RnM (TcGblEnv, HsGroup GhcRn)
forall a b. (a -> b) -> a -> b
$ \[Name]
pat_syn_bndrs -> do {
HsValBindsLR GhcRn GhcPs
new_lhs <- MiniFixityEnv -> HsValBinds GhcPs -> RnM (HsValBindsLR GhcRn GhcPs)
rnTopBindsLHS MiniFixityEnv
local_fix_env HsValBinds GhcPs
val_decls ;
let { id_bndrs :: [IdP GhcRn]
id_bndrs = HsValBindsLR GhcRn GhcPs -> [IdP GhcRn]
forall (idL :: Pass) (idR :: Pass).
HsValBindsLR (GhcPass idL) (GhcPass idR) -> [IdP (GhcPass idL)]
collectHsIdBinders HsValBindsLR GhcRn GhcPs
new_lhs } ;
String -> SDoc -> TcRn ()
traceRn String
"rnSrcDecls" ([Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Name]
[IdP GhcRn]
id_bndrs) ;
(TcGblEnv, TcLclEnv)
tc_envs <- [AvailInfo] -> MiniFixityEnv -> RnM (TcGblEnv, TcLclEnv)
extendGlobalRdrEnvRn ((Name -> AvailInfo) -> [Name] -> [AvailInfo]
forall a b. (a -> b) -> [a] -> [b]
map Name -> AvailInfo
avail [Name]
[IdP GhcRn]
id_bndrs) MiniFixityEnv
local_fix_env ;
(TcGblEnv, TcLclEnv)
-> RnM (TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn)
forall gbl' lcl' a gbl lcl.
(gbl', lcl') -> TcRnIf gbl' lcl' a -> TcRnIf gbl lcl a
setEnvs (TcGblEnv, TcLclEnv)
tc_envs (RnM (TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn))
-> RnM (TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn)
forall a b. (a -> b) -> a -> b
$ do {
String -> SDoc -> TcRn ()
traceRn String
"Start rnTyClDecls" ([TyClGroup GhcPs] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyClGroup GhcPs]
tycl_decls) ;
([TyClGroup GhcRn]
rn_tycl_decls, NameSet
src_fvs1) <- [TyClGroup GhcPs] -> RnM ([TyClGroup GhcRn], NameSet)
rnTyClDecls [TyClGroup GhcPs]
tycl_decls ;
String -> SDoc -> TcRn ()
traceRn String
"Start rnmono" SDoc
empty ;
let { val_bndr_set :: NameSet
val_bndr_set = [Name] -> NameSet
mkNameSet [Name]
[IdP GhcRn]
id_bndrs NameSet -> NameSet -> NameSet
`unionNameSet` [Name] -> NameSet
mkNameSet [Name]
pat_syn_bndrs } ;
Bool
is_boot <- TcRn Bool
tcIsHsBootOrSig ;
(HsValBinds GhcRn
rn_val_decls, DefUses
bind_dus) <- if Bool
is_boot
then NameSet
-> HsValBindsLR GhcRn GhcPs -> RnM (HsValBinds GhcRn, DefUses)
rnTopBindsBoot NameSet
tc_bndrs HsValBindsLR GhcRn GhcPs
new_lhs
else HsSigCtxt
-> HsValBindsLR GhcRn GhcPs -> RnM (HsValBinds GhcRn, DefUses)
rnValBindsRHS (NameSet -> HsSigCtxt
TopSigCtxt NameSet
val_bndr_set) HsValBindsLR GhcRn GhcPs
new_lhs ;
String -> SDoc -> TcRn ()
traceRn String
"finish rnmono" (HsValBinds GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsValBinds GhcRn
rn_val_decls) ;
let { all_bndrs :: NameSet
all_bndrs = NameSet
tc_bndrs NameSet -> NameSet -> NameSet
`unionNameSet` NameSet
val_bndr_set } ;
[GenLocated SrcSpan (FixitySig GhcRn)]
rn_fix_decls <- (LFixitySig GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpan (FixitySig GhcRn)))
-> [LFixitySig GhcPs]
-> IOEnv
(Env TcGblEnv TcLclEnv) [GenLocated SrcSpan (FixitySig GhcRn)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((FixitySig GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (FixitySig GhcRn))
-> LFixitySig GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (GenLocated SrcSpan (FixitySig GhcRn))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (HsSigCtxt
-> FixitySig GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (FixitySig GhcRn)
rnSrcFixityDecl (NameSet -> HsSigCtxt
TopSigCtxt NameSet
all_bndrs)))
[LFixitySig GhcPs]
fix_decls ;
Warnings
rn_warns <- NameSet -> [LWarnDecls GhcPs] -> RnM Warnings
rnSrcWarnDecls NameSet
all_bndrs [LWarnDecls GhcPs]
warn_decls ;
([Located (RuleDecls GhcRn)]
rn_rule_decls, NameSet
src_fvs2) <- Extension
-> TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet)
-> TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet)
forall gbl lcl a. Extension -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
setXOptM Extension
LangExt.ScopedTypeVariables (TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet)
-> TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet))
-> TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet)
-> TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet)
forall a b. (a -> b) -> a -> b
$
(RuleDecls GhcPs -> RnM (RuleDecls GhcRn, NameSet))
-> [LRuleDecls GhcPs]
-> TcRnIf TcGblEnv TcLclEnv ([Located (RuleDecls GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList RuleDecls GhcPs -> RnM (RuleDecls GhcRn, NameSet)
rnHsRuleDecls [LRuleDecls GhcPs]
rule_decls ;
([Located (ForeignDecl GhcRn)]
rn_foreign_decls, NameSet
src_fvs3) <- (ForeignDecl GhcPs -> RnM (ForeignDecl GhcRn, NameSet))
-> [LForeignDecl GhcPs]
-> RnM ([Located (ForeignDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList ForeignDecl GhcPs -> RnM (ForeignDecl GhcRn, NameSet)
rnHsForeignDecl [LForeignDecl GhcPs]
foreign_decls ;
([Located (AnnDecl GhcRn)]
rn_ann_decls, NameSet
src_fvs4) <- (AnnDecl GhcPs -> RnM (AnnDecl GhcRn, NameSet))
-> [LAnnDecl GhcPs] -> RnM ([Located (AnnDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList AnnDecl GhcPs -> RnM (AnnDecl GhcRn, NameSet)
rnAnnDecl [LAnnDecl GhcPs]
ann_decls ;
([Located (DefaultDecl GhcRn)]
rn_default_decls, NameSet
src_fvs5) <- (DefaultDecl GhcPs -> RnM (DefaultDecl GhcRn, NameSet))
-> [LDefaultDecl GhcPs]
-> RnM ([Located (DefaultDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList DefaultDecl GhcPs -> RnM (DefaultDecl GhcRn, NameSet)
rnDefaultDecl [LDefaultDecl GhcPs]
default_decls ;
([Located (DerivDecl GhcRn)]
rn_deriv_decls, NameSet
src_fvs6) <- (DerivDecl GhcPs -> RnM (DerivDecl GhcRn, NameSet))
-> [LDerivDecl GhcPs] -> RnM ([Located (DerivDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList DerivDecl GhcPs -> RnM (DerivDecl GhcRn, NameSet)
rnSrcDerivDecl [LDerivDecl GhcPs]
deriv_decls ;
([Located (SpliceDecl GhcRn)]
rn_splice_decls, NameSet
src_fvs7) <- (SpliceDecl GhcPs -> RnM (SpliceDecl GhcRn, NameSet))
-> [LSpliceDecl GhcPs]
-> RnM ([Located (SpliceDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList SpliceDecl GhcPs -> RnM (SpliceDecl GhcRn, NameSet)
rnSpliceDecl [LSpliceDecl GhcPs]
splice_decls ;
[LDocDecl]
rn_docs <- (LDocDecl -> IOEnv (Env TcGblEnv TcLclEnv) LDocDecl)
-> [LDocDecl] -> IOEnv (Env TcGblEnv TcLclEnv) [LDocDecl]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess LDocDecl -> TcM (SrcSpanLess LDocDecl))
-> LDocDecl -> IOEnv (Env TcGblEnv TcLclEnv) LDocDecl
forall a b.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b)) -> a -> TcM b
wrapLocM SrcSpanLess LDocDecl -> TcM (SrcSpanLess LDocDecl)
DocDecl -> RnM DocDecl
rnDocDecl) [LDocDecl]
docs ;
TcGblEnv
last_tcg_env <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
forall gbl lcl. TcRnIf gbl lcl gbl
getGblEnv ;
let {rn_group :: HsGroup GhcRn
rn_group = HsGroup :: forall p.
XCHsGroup p
-> HsValBinds p
-> [LSpliceDecl p]
-> [TyClGroup p]
-> [LDerivDecl p]
-> [LFixitySig p]
-> [LDefaultDecl p]
-> [LForeignDecl p]
-> [LWarnDecls p]
-> [LAnnDecl p]
-> [LRuleDecls p]
-> [LDocDecl]
-> HsGroup p
HsGroup { hs_ext :: XCHsGroup GhcRn
hs_ext = XCHsGroup GhcRn
NoExtField
noExtField,
hs_valds :: HsValBinds GhcRn
hs_valds = HsValBinds GhcRn
rn_val_decls,
hs_splcds :: [Located (SpliceDecl GhcRn)]
hs_splcds = [Located (SpliceDecl GhcRn)]
rn_splice_decls,
hs_tyclds :: [TyClGroup GhcRn]
hs_tyclds = [TyClGroup GhcRn]
rn_tycl_decls,
hs_derivds :: [Located (DerivDecl GhcRn)]
hs_derivds = [Located (DerivDecl GhcRn)]
rn_deriv_decls,
hs_fixds :: [GenLocated SrcSpan (FixitySig GhcRn)]
hs_fixds = [GenLocated SrcSpan (FixitySig GhcRn)]
rn_fix_decls,
hs_warnds :: [LWarnDecls GhcRn]
hs_warnds = [],
hs_fords :: [Located (ForeignDecl GhcRn)]
hs_fords = [Located (ForeignDecl GhcRn)]
rn_foreign_decls,
hs_annds :: [Located (AnnDecl GhcRn)]
hs_annds = [Located (AnnDecl GhcRn)]
rn_ann_decls,
hs_defds :: [Located (DefaultDecl GhcRn)]
hs_defds = [Located (DefaultDecl GhcRn)]
rn_default_decls,
hs_ruleds :: [Located (RuleDecls GhcRn)]
hs_ruleds = [Located (RuleDecls GhcRn)]
rn_rule_decls,
hs_docs :: [LDocDecl]
hs_docs = [LDocDecl]
rn_docs } ;
tcf_bndrs :: [Name]
tcf_bndrs = [TyClGroup GhcRn] -> [Located (ForeignDecl GhcRn)] -> [Name]
hsTyClForeignBinders [TyClGroup GhcRn]
rn_tycl_decls [Located (ForeignDecl GhcRn)]
rn_foreign_decls ;
other_def :: (Maybe NameSet, NameSet)
other_def = (NameSet -> Maybe NameSet
forall a. a -> Maybe a
Just ([Name] -> NameSet
mkNameSet [Name]
tcf_bndrs), NameSet
emptyNameSet) ;
other_fvs :: NameSet
other_fvs = [NameSet] -> NameSet
plusFVs [NameSet
src_fvs1, NameSet
src_fvs2, NameSet
src_fvs3, NameSet
src_fvs4,
NameSet
src_fvs5, NameSet
src_fvs6, NameSet
src_fvs7] ;
src_dus :: DefUses
src_dus = (Maybe NameSet, NameSet) -> DefUses
forall a. a -> OrdList a
unitOL (Maybe NameSet, NameSet)
other_def DefUses -> DefUses -> DefUses
`plusDU` DefUses
bind_dus DefUses -> DefUses -> DefUses
`plusDU` NameSet -> DefUses
usesOnly NameSet
other_fvs ;
final_tcg_env :: TcGblEnv
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 :: Warnings
tcg_warns = TcGblEnv -> Warnings
tcg_warns TcGblEnv
tcg_env' Warnings -> Warnings -> Warnings
`plusWarns` Warnings
rn_warns };
} ;
String -> SDoc -> TcRn ()
traceRn String
"finish rnSrc" (HsGroup GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsGroup GhcRn
rn_group) ;
String -> SDoc -> TcRn ()
traceRn String
"finish Dus" (DefUses -> SDoc
forall a. Outputable a => a -> SDoc
ppr DefUses
src_dus ) ;
(TcGblEnv, HsGroup GhcRn) -> RnM (TcGblEnv, HsGroup GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (TcGblEnv
final_tcg_env, HsGroup GhcRn
rn_group)
}}}}
rnSrcDecls (XHsGroup XXHsGroup GhcPs
nec) = NoExtCon -> RnM (TcGblEnv, HsGroup GhcRn)
forall a. NoExtCon -> a
noExtCon XXHsGroup GhcPs
NoExtCon
nec
addTcgDUs :: TcGblEnv -> DefUses -> TcGblEnv
addTcgDUs :: TcGblEnv -> DefUses -> TcGblEnv
addTcgDUs TcGblEnv
tcg_env DefUses
dus = TcGblEnv
tcg_env { tcg_dus :: DefUses
tcg_dus = TcGblEnv -> DefUses
tcg_dus TcGblEnv
tcg_env DefUses -> DefUses -> DefUses
`plusDU` DefUses
dus }
rnList :: (a -> RnM (b, FreeVars)) -> [Located a] -> RnM ([Located b], FreeVars)
rnList :: (a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList a -> RnM (b, NameSet)
f [Located a]
xs = (Located a -> RnM (Located b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
forall a b. (a -> RnM (b, NameSet)) -> [a] -> RnM ([b], NameSet)
mapFvRn ((SrcSpanLess (Located a) -> TcM (SrcSpanLess (Located b), NameSet))
-> Located a -> RnM (Located b, NameSet)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM a -> RnM (b, NameSet)
SrcSpanLess (Located a) -> TcM (SrcSpanLess (Located b), NameSet)
f) [Located a]
xs
rnDocDecl :: DocDecl -> RnM DocDecl
rnDocDecl :: DocDecl -> RnM DocDecl
rnDocDecl (DocCommentNext HsDocString
doc) = do
HsDocString
rn_doc <- HsDocString -> RnM HsDocString
rnHsDoc HsDocString
doc
DocDecl -> RnM DocDecl
forall (m :: * -> *) a. Monad m => a -> m a
return (HsDocString -> DocDecl
DocCommentNext HsDocString
rn_doc)
rnDocDecl (DocCommentPrev HsDocString
doc) = do
HsDocString
rn_doc <- HsDocString -> RnM HsDocString
rnHsDoc HsDocString
doc
DocDecl -> RnM DocDecl
forall (m :: * -> *) a. Monad m => a -> m a
return (HsDocString -> DocDecl
DocCommentPrev HsDocString
rn_doc)
rnDocDecl (DocCommentNamed String
str HsDocString
doc) = do
HsDocString
rn_doc <- HsDocString -> RnM HsDocString
rnHsDoc HsDocString
doc
DocDecl -> RnM DocDecl
forall (m :: * -> *) a. Monad m => a -> m a
return (String -> HsDocString -> DocDecl
DocCommentNamed String
str HsDocString
rn_doc)
rnDocDecl (DocGroup Int
lev HsDocString
doc) = do
HsDocString
rn_doc <- HsDocString -> RnM HsDocString
rnHsDoc HsDocString
doc
DocDecl -> RnM DocDecl
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> HsDocString -> DocDecl
DocGroup Int
lev HsDocString
rn_doc)
rnSrcWarnDecls :: NameSet -> [LWarnDecls GhcPs] -> RnM Warnings
rnSrcWarnDecls :: NameSet -> [LWarnDecls GhcPs] -> RnM Warnings
rnSrcWarnDecls NameSet
_ []
= Warnings -> RnM Warnings
forall (m :: * -> *) a. Monad m => a -> m a
return Warnings
NoWarnings
rnSrcWarnDecls NameSet
bndr_set [LWarnDecls GhcPs]
decls'
= do {
; (NonEmpty (GenLocated SrcSpan RdrName) -> TcRn ())
-> [NonEmpty (GenLocated SrcSpan RdrName)] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\ NonEmpty (GenLocated SrcSpan RdrName)
dups -> let ((GenLocated SrcSpan RdrName
-> Located (SrcSpanLess (GenLocated SrcSpan RdrName))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (GenLocated SrcSpan RdrName)
rdr) :| (GenLocated SrcSpan RdrName
lrdr':[GenLocated SrcSpan RdrName]
_)) = NonEmpty (GenLocated SrcSpan RdrName)
dups
in SrcSpan -> SDoc -> TcRn ()
addErrAt SrcSpan
loc (GenLocated SrcSpan RdrName -> RdrName -> SDoc
dupWarnDecl GenLocated SrcSpan RdrName
lrdr' SrcSpanLess (GenLocated SrcSpan RdrName)
RdrName
rdr))
[NonEmpty (GenLocated SrcSpan RdrName)]
warn_rdr_dups
; [[(OccName, WarningTxt)]]
pairs_s <- (LWarnDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)])
-> [LWarnDecl GhcPs]
-> IOEnv (Env TcGblEnv TcLclEnv) [[(OccName, WarningTxt)]]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (LWarnDecl GhcPs)
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)])
-> LWarnDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)]
forall a b. HasSrcSpan a => (SrcSpanLess a -> TcM b) -> a -> TcM b
addLocM SrcSpanLess (LWarnDecl GhcPs)
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)]
WarnDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)]
rn_deprec) [LWarnDecl GhcPs]
decls
; Warnings -> RnM Warnings
forall (m :: * -> *) a. Monad m => a -> m a
return ([(OccName, WarningTxt)] -> Warnings
WarnSome (([[(OccName, WarningTxt)]] -> [(OccName, WarningTxt)]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [[(OccName, WarningTxt)]]
pairs_s))) }
where
decls :: [LWarnDecl GhcPs]
decls = (LWarnDecls GhcPs -> [LWarnDecl GhcPs])
-> [LWarnDecls GhcPs] -> [LWarnDecl GhcPs]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (WarnDecls GhcPs -> [LWarnDecl GhcPs]
forall pass. WarnDecls pass -> [LWarnDecl pass]
wd_warnings (WarnDecls GhcPs -> [LWarnDecl GhcPs])
-> (LWarnDecls GhcPs -> WarnDecls GhcPs)
-> LWarnDecls GhcPs
-> [LWarnDecl GhcPs]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LWarnDecls GhcPs -> WarnDecls GhcPs
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) [LWarnDecls GhcPs]
decls'
sig_ctxt :: HsSigCtxt
sig_ctxt = NameSet -> HsSigCtxt
TopSigCtxt NameSet
bndr_set
rn_deprec :: WarnDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)]
rn_deprec (Warning XWarning GhcPs
_ [Located (IdP GhcPs)]
rdr_names WarningTxt
txt)
= do { [(RdrName, Name)]
names <- (GenLocated SrcSpan RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)])
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)]
forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
concatMapM (HsSigCtxt
-> SDoc
-> RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)]
lookupLocalTcNames HsSigCtxt
sig_ctxt SDoc
what (RdrName -> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)])
-> (GenLocated SrcSpan RdrName -> RdrName)
-> GenLocated SrcSpan RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) [(RdrName, Name)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpan RdrName -> RdrName
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc)
[GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
rdr_names
; [(OccName, WarningTxt)]
-> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)]
forall (m :: * -> *) a. Monad m => a -> m a
return [(RdrName -> OccName
rdrNameOcc RdrName
rdr, WarningTxt
txt) | (RdrName
rdr, Name
_) <- [(RdrName, Name)]
names] }
rn_deprec (XWarnDecl XXWarnDecl GhcPs
nec) = NoExtCon -> IOEnv (Env TcGblEnv TcLclEnv) [(OccName, WarningTxt)]
forall a. NoExtCon -> a
noExtCon XXWarnDecl GhcPs
NoExtCon
nec
what :: SDoc
what = String -> SDoc
text String
"deprecation"
warn_rdr_dups :: [NonEmpty (GenLocated SrcSpan RdrName)]
warn_rdr_dups = [GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)]
findDupRdrNames
([GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)])
-> [GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)]
forall a b. (a -> b) -> a -> b
$ (LWarnDecl GhcPs -> [GenLocated SrcSpan RdrName])
-> [LWarnDecl GhcPs] -> [GenLocated SrcSpan RdrName]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\(LWarnDecl GhcPs -> Located (SrcSpanLess (LWarnDecl GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (Warning _ ns _)) -> [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
ns) [LWarnDecl GhcPs]
decls
findDupRdrNames :: [Located RdrName] -> [NonEmpty (Located RdrName)]
findDupRdrNames :: [GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)]
findDupRdrNames = (GenLocated SrcSpan RdrName -> GenLocated SrcSpan RdrName -> Bool)
-> [GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)]
forall a. (a -> a -> Bool) -> [a] -> [NonEmpty a]
findDupsEq (\ GenLocated SrcSpan RdrName
x -> \ GenLocated SrcSpan RdrName
y -> RdrName -> OccName
rdrNameOcc (GenLocated SrcSpan RdrName
-> SrcSpanLess (GenLocated SrcSpan RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc GenLocated SrcSpan RdrName
x) OccName -> OccName -> Bool
forall a. Eq a => a -> a -> Bool
== RdrName -> OccName
rdrNameOcc (GenLocated SrcSpan RdrName
-> SrcSpanLess (GenLocated SrcSpan RdrName)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc GenLocated SrcSpan RdrName
y))
dupWarnDecl :: Located RdrName -> RdrName -> SDoc
dupWarnDecl :: GenLocated SrcSpan RdrName -> RdrName -> SDoc
dupWarnDecl GenLocated SrcSpan RdrName
d RdrName
rdr_name
= [SDoc] -> SDoc
vcat [String -> SDoc
text String
"Multiple warning declarations for" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr RdrName
rdr_name),
String -> SDoc
text String
"also at " SDoc -> SDoc -> SDoc
<+> SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr (GenLocated SrcSpan RdrName -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc GenLocated SrcSpan RdrName
d)]
rnAnnDecl :: AnnDecl GhcPs -> RnM (AnnDecl GhcRn, FreeVars)
rnAnnDecl :: AnnDecl GhcPs -> RnM (AnnDecl GhcRn, NameSet)
rnAnnDecl ann :: AnnDecl GhcPs
ann@(HsAnnotation XHsAnnotation GhcPs
_ SourceText
s AnnProvenance (IdP GhcPs)
provenance Located (HsExpr GhcPs)
expr)
= SDoc
-> RnM (AnnDecl GhcRn, NameSet) -> RnM (AnnDecl GhcRn, NameSet)
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, NameSet) -> RnM (AnnDecl GhcRn, NameSet))
-> RnM (AnnDecl GhcRn, NameSet) -> RnM (AnnDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$
do { (AnnProvenance Name
provenance', NameSet
provenance_fvs) <- AnnProvenance RdrName -> RnM (AnnProvenance Name, NameSet)
rnAnnProvenance AnnProvenance RdrName
AnnProvenance (IdP GhcPs)
provenance
; (LHsExpr GhcRn
expr', NameSet
expr_fvs) <- ThStage
-> TcM (LHsExpr GhcRn, NameSet) -> TcM (LHsExpr GhcRn, NameSet)
forall a. ThStage -> TcM a -> TcM a
setStage (SpliceType -> ThStage
Splice SpliceType
Untyped) (TcM (LHsExpr GhcRn, NameSet) -> TcM (LHsExpr GhcRn, NameSet))
-> TcM (LHsExpr GhcRn, NameSet) -> TcM (LHsExpr GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$
Located (HsExpr GhcPs) -> TcM (LHsExpr GhcRn, NameSet)
rnLExpr Located (HsExpr GhcPs)
expr
; (AnnDecl GhcRn, NameSet) -> RnM (AnnDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XHsAnnotation GhcRn
-> SourceText
-> AnnProvenance (IdP GhcRn)
-> LHsExpr GhcRn
-> AnnDecl GhcRn
forall pass.
XHsAnnotation pass
-> SourceText
-> AnnProvenance (IdP pass)
-> Located (HsExpr pass)
-> AnnDecl pass
HsAnnotation XHsAnnotation GhcRn
NoExtField
noExtField SourceText
s AnnProvenance Name
AnnProvenance (IdP GhcRn)
provenance' LHsExpr GhcRn
expr',
NameSet
provenance_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
expr_fvs) }
rnAnnDecl (XAnnDecl XXAnnDecl GhcPs
nec) = NoExtCon -> RnM (AnnDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXAnnDecl GhcPs
NoExtCon
nec
rnAnnProvenance :: AnnProvenance RdrName
-> RnM (AnnProvenance Name, FreeVars)
rnAnnProvenance :: AnnProvenance RdrName -> RnM (AnnProvenance Name, NameSet)
rnAnnProvenance AnnProvenance RdrName
provenance = do
AnnProvenance Name
provenance' <- (RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> AnnProvenance RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) (AnnProvenance Name)
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
lookupTopBndrRn AnnProvenance RdrName
provenance
(AnnProvenance Name, NameSet) -> RnM (AnnProvenance Name, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (AnnProvenance Name
provenance', NameSet -> (Name -> NameSet) -> Maybe Name -> NameSet
forall b a. b -> (a -> b) -> Maybe a -> b
maybe NameSet
emptyFVs Name -> NameSet
unitFV (AnnProvenance Name -> Maybe Name
forall name. AnnProvenance name -> Maybe name
annProvenanceName_maybe AnnProvenance Name
provenance'))
rnDefaultDecl :: DefaultDecl GhcPs -> RnM (DefaultDecl GhcRn, FreeVars)
rnDefaultDecl :: DefaultDecl GhcPs -> RnM (DefaultDecl GhcRn, NameSet)
rnDefaultDecl (DefaultDecl XCDefaultDecl GhcPs
_ [LHsType GhcPs]
tys)
= do { ([LHsType GhcRn]
tys', NameSet
fvs) <- HsDocContext -> [LHsType GhcPs] -> RnM ([LHsType GhcRn], NameSet)
rnLHsTypes HsDocContext
doc_str [LHsType GhcPs]
tys
; (DefaultDecl GhcRn, NameSet) -> RnM (DefaultDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCDefaultDecl GhcRn -> [LHsType GhcRn] -> DefaultDecl GhcRn
forall pass.
XCDefaultDecl pass -> [LHsType pass] -> DefaultDecl pass
DefaultDecl XCDefaultDecl GhcRn
NoExtField
noExtField [LHsType GhcRn]
tys', NameSet
fvs) }
where
doc_str :: HsDocContext
doc_str = HsDocContext
DefaultDeclCtx
rnDefaultDecl (XDefaultDecl XXDefaultDecl GhcPs
nec) = NoExtCon -> RnM (DefaultDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXDefaultDecl GhcPs
NoExtCon
nec
rnHsForeignDecl :: ForeignDecl GhcPs -> RnM (ForeignDecl GhcRn, FreeVars)
rnHsForeignDecl :: ForeignDecl GhcPs -> RnM (ForeignDecl GhcRn, NameSet)
rnHsForeignDecl (ForeignImport { fd_name :: forall pass. ForeignDecl pass -> Located (IdP pass)
fd_name = Located (IdP GhcPs)
name, fd_sig_ty :: forall pass. ForeignDecl pass -> LHsSigType pass
fd_sig_ty = LHsSigType GhcPs
ty, fd_fi :: forall pass. ForeignDecl pass -> ForeignImport
fd_fi = ForeignImport
spec })
= do { HscEnv
topEnv :: HscEnv <- TcRnIf TcGblEnv TcLclEnv HscEnv
forall gbl lcl. TcRnIf gbl lcl HscEnv
getTopEnv
; Located Name
name' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name
; (LHsSigType GhcRn
ty', NameSet
fvs) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, NameSet)
rnHsSigType (GenLocated SrcSpan RdrName -> HsDocContext
ForeignDeclCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name) TypeOrKind
TypeLevel LHsSigType GhcPs
ty
; let unitId :: UnitId
unitId = DynFlags -> UnitId
thisPackage (DynFlags -> UnitId) -> DynFlags -> UnitId
forall a b. (a -> b) -> a -> b
$ HscEnv -> DynFlags
hsc_dflags HscEnv
topEnv
spec' :: ForeignImport
spec' = UnitId -> ForeignImport -> ForeignImport
patchForeignImport UnitId
unitId ForeignImport
spec
; (ForeignDecl GhcRn, NameSet) -> RnM (ForeignDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ForeignImport :: forall pass.
XForeignImport pass
-> Located (IdP pass)
-> LHsSigType pass
-> ForeignImport
-> ForeignDecl pass
ForeignImport { fd_i_ext :: XForeignImport GhcRn
fd_i_ext = XForeignImport GhcRn
NoExtField
noExtField
, fd_name :: Located (IdP GhcRn)
fd_name = Located Name
Located (IdP GhcRn)
name', fd_sig_ty :: LHsSigType GhcRn
fd_sig_ty = LHsSigType GhcRn
ty'
, fd_fi :: ForeignImport
fd_fi = ForeignImport
spec' }, NameSet
fvs) }
rnHsForeignDecl (ForeignExport { fd_name :: forall pass. ForeignDecl pass -> Located (IdP pass)
fd_name = Located (IdP GhcPs)
name, fd_sig_ty :: forall pass. ForeignDecl pass -> LHsSigType pass
fd_sig_ty = LHsSigType GhcPs
ty, fd_fe :: forall pass. ForeignDecl pass -> ForeignExport
fd_fe = ForeignExport
spec })
= do { Located Name
name' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedOccRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name
; (LHsSigType GhcRn
ty', NameSet
fvs) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, NameSet)
rnHsSigType (GenLocated SrcSpan RdrName -> HsDocContext
ForeignDeclCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name) TypeOrKind
TypeLevel LHsSigType GhcPs
ty
; (ForeignDecl GhcRn, NameSet) -> RnM (ForeignDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ForeignExport :: forall pass.
XForeignExport pass
-> Located (IdP pass)
-> LHsSigType pass
-> ForeignExport
-> ForeignDecl pass
ForeignExport { fd_e_ext :: XForeignExport GhcRn
fd_e_ext = XForeignExport GhcRn
NoExtField
noExtField
, fd_name :: Located (IdP GhcRn)
fd_name = Located Name
Located (IdP GhcRn)
name', fd_sig_ty :: LHsSigType GhcRn
fd_sig_ty = LHsSigType GhcRn
ty'
, fd_fe :: ForeignExport
fd_fe = ForeignExport
spec }
, NameSet
fvs NameSet -> Name -> NameSet
`addOneFV` Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
name') }
rnHsForeignDecl (XForeignDecl XXForeignDecl GhcPs
nec) = NoExtCon -> RnM (ForeignDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXForeignDecl GhcPs
NoExtCon
nec
patchForeignImport :: UnitId -> ForeignImport -> ForeignImport
patchForeignImport :: UnitId -> ForeignImport -> ForeignImport
patchForeignImport UnitId
unitId (CImport Located CCallConv
cconv Located Safety
safety Maybe Header
fs CImportSpec
spec Located SourceText
src)
= Located CCallConv
-> Located Safety
-> Maybe Header
-> CImportSpec
-> Located SourceText
-> ForeignImport
CImport Located CCallConv
cconv Located Safety
safety Maybe Header
fs (UnitId -> CImportSpec -> CImportSpec
patchCImportSpec UnitId
unitId CImportSpec
spec) Located SourceText
src
patchCImportSpec :: UnitId -> CImportSpec -> CImportSpec
patchCImportSpec :: UnitId -> CImportSpec -> CImportSpec
patchCImportSpec UnitId
unitId CImportSpec
spec
= case CImportSpec
spec of
CFunction CCallTarget
callTarget -> CCallTarget -> CImportSpec
CFunction (CCallTarget -> CImportSpec) -> CCallTarget -> CImportSpec
forall a b. (a -> b) -> a -> b
$ UnitId -> CCallTarget -> CCallTarget
patchCCallTarget UnitId
unitId CCallTarget
callTarget
CImportSpec
_ -> CImportSpec
spec
patchCCallTarget :: UnitId -> CCallTarget -> CCallTarget
patchCCallTarget :: UnitId -> CCallTarget -> CCallTarget
patchCCallTarget UnitId
unitId CCallTarget
callTarget =
case CCallTarget
callTarget of
StaticTarget SourceText
src CLabelString
label Maybe UnitId
Nothing Bool
isFun
-> SourceText -> CLabelString -> Maybe UnitId -> Bool -> CCallTarget
StaticTarget SourceText
src CLabelString
label (UnitId -> Maybe UnitId
forall a. a -> Maybe a
Just UnitId
unitId) Bool
isFun
CCallTarget
_ -> CCallTarget
callTarget
rnSrcInstDecl :: InstDecl GhcPs -> RnM (InstDecl GhcRn, FreeVars)
rnSrcInstDecl :: InstDecl GhcPs -> RnM (InstDecl GhcRn, NameSet)
rnSrcInstDecl (TyFamInstD { tfid_inst :: forall pass. InstDecl pass -> TyFamInstDecl pass
tfid_inst = TyFamInstDecl GhcPs
tfi })
= do { (TyFamInstDecl GhcRn
tfi', NameSet
fvs) <- AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet)
rnTyFamInstDecl AssocTyFamInfo
NonAssocTyFamEqn TyFamInstDecl GhcPs
tfi
; (InstDecl GhcRn, NameSet) -> RnM (InstDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyFamInstD :: forall pass.
XTyFamInstD pass -> TyFamInstDecl pass -> InstDecl pass
TyFamInstD { tfid_ext :: XTyFamInstD GhcRn
tfid_ext = XTyFamInstD GhcRn
NoExtField
noExtField, tfid_inst :: TyFamInstDecl GhcRn
tfid_inst = TyFamInstDecl GhcRn
tfi' }, NameSet
fvs) }
rnSrcInstDecl (DataFamInstD { dfid_inst :: forall pass. InstDecl pass -> DataFamInstDecl pass
dfid_inst = DataFamInstDecl GhcPs
dfi })
= do { (DataFamInstDecl GhcRn
dfi', NameSet
fvs) <- AssocTyFamInfo
-> DataFamInstDecl GhcPs -> RnM (DataFamInstDecl GhcRn, NameSet)
rnDataFamInstDecl AssocTyFamInfo
NonAssocTyFamEqn DataFamInstDecl GhcPs
dfi
; (InstDecl GhcRn, NameSet) -> RnM (InstDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (DataFamInstD :: forall pass.
XDataFamInstD pass -> DataFamInstDecl pass -> InstDecl pass
DataFamInstD { dfid_ext :: XDataFamInstD GhcRn
dfid_ext = XDataFamInstD GhcRn
NoExtField
noExtField, dfid_inst :: DataFamInstDecl GhcRn
dfid_inst = DataFamInstDecl GhcRn
dfi' }, NameSet
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)
; (ClsInstDecl GhcRn
cid', NameSet
fvs) <- ClsInstDecl GhcPs -> RnM (ClsInstDecl GhcRn, NameSet)
rnClsInstDecl ClsInstDecl GhcPs
cid
; String -> SDoc -> TcRn ()
traceRn String
"rnSrcIstDecl end }" SDoc
empty
; (InstDecl GhcRn, NameSet) -> RnM (InstDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ClsInstD :: forall pass. XClsInstD pass -> ClsInstDecl pass -> InstDecl pass
ClsInstD { cid_d_ext :: XClsInstD GhcRn
cid_d_ext = XClsInstD GhcRn
NoExtField
noExtField, cid_inst :: ClsInstDecl GhcRn
cid_inst = ClsInstDecl GhcRn
cid' }, NameSet
fvs) }
rnSrcInstDecl (XInstDecl XXInstDecl GhcPs
nec) = NoExtCon -> RnM (InstDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXInstDecl GhcPs
NoExtCon
nec
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 ()
checkCanonicalMonadInstances
WarningFlag -> TcRn () -> TcRn ()
forall gbl lcl.
WarningFlag -> TcRnIf gbl lcl () -> TcRnIf gbl lcl ()
whenWOptM WarningFlag
Opt_WarnNonCanonicalMonoidInstances
TcRn ()
checkCanonicalMonoidInstances
where
checkCanonicalMonadInstances :: TcRn ()
checkCanonicalMonadInstances
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
applicativeClassName = do
[LHsBindLR GhcRn GhcRn]
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (LHsBinds GhcRn -> [LHsBindLR GhcRn GhcRn]
forall a. Bag a -> [a]
bagToList LHsBinds GhcRn
mbinds) ((LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ())
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(LHsBindLR GhcRn GhcRn
-> Located (SrcSpanLess (LHsBindLR GhcRn GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind) -> SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ do
case SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind of
FunBind { fun_id = (dL->L _ name)
, fun_matches = mg }
| Name
SrcSpanLess (Located 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
-> WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod1
WarningFlag
Opt_WarnNonCanonicalMonadInstances String
"pure" String
"return"
| Name
SrcSpanLess (Located 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
-> WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod1
WarningFlag
Opt_WarnNonCanonicalMonadInstances String
"(*>)" String
"(>>)"
SrcSpanLess (LHsBindLR GhcRn GhcRn)
_ -> () -> TcRn ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
monadClassName = do
[LHsBindLR GhcRn GhcRn]
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (LHsBinds GhcRn -> [LHsBindLR GhcRn GhcRn]
forall a. Bag a -> [a]
bagToList LHsBinds GhcRn
mbinds) ((LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ())
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(LHsBindLR GhcRn GhcRn
-> Located (SrcSpanLess (LHsBindLR GhcRn GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind) -> SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ do
case SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind of
FunBind { fun_id = (dL->L _ name)
, fun_matches = mg }
| Name
SrcSpanLess (Located 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
-> WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod2
WarningFlag
Opt_WarnNonCanonicalMonadInstances String
"return" String
"pure"
| Name
SrcSpanLess (Located 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
-> WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod2
WarningFlag
Opt_WarnNonCanonicalMonadInstances String
"(>>)" String
"(*>)"
SrcSpanLess (LHsBindLR GhcRn GhcRn)
_ -> () -> TcRn ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = () -> TcRn ()
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 = do
[LHsBindLR GhcRn GhcRn]
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (LHsBinds GhcRn -> [LHsBindLR GhcRn GhcRn]
forall a. Bag a -> [a]
bagToList LHsBinds GhcRn
mbinds) ((LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ())
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(LHsBindLR GhcRn GhcRn
-> Located (SrcSpanLess (LHsBindLR GhcRn GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind) -> SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ do
case SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind of
FunBind { fun_id = (dL->L _ name)
, fun_matches = mg }
| Name
SrcSpanLess (Located 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
-> WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod1
WarningFlag
Opt_WarnNonCanonicalMonoidInstances String
"(<>)" String
"mappend"
SrcSpanLess (LHsBindLR GhcRn GhcRn)
_ -> () -> TcRn ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Name
cls Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
monoidClassName = do
[LHsBindLR GhcRn GhcRn]
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (LHsBinds GhcRn -> [LHsBindLR GhcRn GhcRn]
forall a. Bag a -> [a]
bagToList LHsBinds GhcRn
mbinds) ((LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ())
-> (LHsBindLR GhcRn GhcRn -> TcRn ()) -> TcRn ()
forall a b. (a -> b) -> a -> b
$ \(LHsBindLR GhcRn GhcRn
-> Located (SrcSpanLess (LHsBindLR GhcRn GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind) -> SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ do
case SrcSpanLess (LHsBindLR GhcRn GhcRn)
mbind of
FunBind { fun_id = (dL->L _ name)
, fun_matches = mg }
| Name
SrcSpanLess (Located 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
-> WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod2NoDefault
WarningFlag
Opt_WarnNonCanonicalMonoidInstances String
"mappend" String
"(<>)"
SrcSpanLess (LHsBindLR GhcRn GhcRn)
_ -> () -> TcRn ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = () -> TcRn ()
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 -> Located [LMatch p body]
mg_alts = (Located [LMatch GhcRn (LHsExpr GhcRn)]
-> Located (SrcSpanLess (Located [LMatch GhcRn (LHsExpr GhcRn)]))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_
[dL->L _ (Match { m_pats = []
, m_grhss = grhss })])}
| GRHSs XCGRHSs GhcRn (LHsExpr GhcRn)
_ [LGRHS GhcRn (LHsExpr GhcRn)
-> Located (SrcSpanLess (LGRHS GhcRn (LHsExpr GhcRn)))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (GRHS _ [] body)] LHsLocalBinds GhcRn
lbinds <- GRHSs GhcRn (LHsExpr GhcRn)
grhss
, EmptyLocalBinds _ <- LHsLocalBinds GhcRn -> SrcSpanLess (LHsLocalBinds GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LHsLocalBinds GhcRn
lbinds
, HsVar _ lrhsName <- LHsExpr GhcRn -> SrcSpanLess (LHsExpr GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LHsExpr GhcRn
body = Name -> Maybe Name
forall a. a -> Maybe a
Just (Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
Located (IdP GhcRn)
lrhsName)
isAliasMG MatchGroup GhcRn (LHsExpr GhcRn)
_ = Maybe Name
forall a. Maybe a
Nothing
addWarnNonCanonicalMethod1 :: WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod1 WarningFlag
flag String
lhs String
rhs = do
WarnReason -> SDoc -> TcRn ()
addWarn (WarningFlag -> WarnReason
Reason WarningFlag
flag) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"Noncanonical" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text (String
lhs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rhs)) SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"definition detected"
, LHsSigType GhcRn -> SDoc
instDeclCtxt1 LHsSigType GhcRn
poly_ty
, String -> SDoc
text String
"Move definition from" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text String
rhs) SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"to" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (String -> SDoc
text String
lhs)
]
addWarnNonCanonicalMethod2 :: WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod2 WarningFlag
flag String
lhs String
rhs = do
WarnReason -> SDoc -> TcRn ()
addWarn (WarningFlag -> WarnReason
Reason WarningFlag
flag) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"Noncanonical" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text String
lhs) SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"definition detected"
, LHsSigType GhcRn -> SDoc
instDeclCtxt1 LHsSigType GhcRn
poly_ty
, String -> SDoc
text String
"Either remove definition for" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text String
lhs) SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"or define as" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text (String
lhs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rhs))
]
addWarnNonCanonicalMethod2NoDefault :: WarningFlag -> String -> String -> TcRn ()
addWarnNonCanonicalMethod2NoDefault WarningFlag
flag String
lhs String
rhs = do
WarnReason -> SDoc -> TcRn ()
addWarn (WarningFlag -> WarnReason
Reason WarningFlag
flag) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"Noncanonical" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text String
lhs) SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"definition detected"
, LHsSigType GhcRn -> SDoc
instDeclCtxt1 LHsSigType GhcRn
poly_ty
, String -> SDoc
text String
"Define as" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (String -> SDoc
text (String
lhs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rhs))
]
instDeclCtxt1 :: LHsSigType GhcRn -> SDoc
instDeclCtxt1 :: LHsSigType GhcRn -> SDoc
instDeclCtxt1 LHsSigType GhcRn
hs_inst_ty
= SDoc -> SDoc
inst_decl_ctxt (LHsType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr (LHsSigType GhcRn -> LHsType GhcRn
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
getLHsInstDeclHead LHsSigType GhcRn
hs_inst_ty))
inst_decl_ctxt :: SDoc -> SDoc
inst_decl_ctxt :: SDoc -> SDoc
inst_decl_ctxt SDoc
doc = SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"in the instance declaration for")
Int
2 (SDoc -> SDoc
quotes SDoc
doc SDoc -> SDoc -> SDoc
<> String -> SDoc
text String
".")
rnClsInstDecl :: ClsInstDecl GhcPs -> RnM (ClsInstDecl GhcRn, FreeVars)
rnClsInstDecl :: ClsInstDecl GhcPs -> RnM (ClsInstDecl GhcRn, NameSet)
rnClsInstDecl (ClsInstDecl { 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 (Located OverlapMode)
cid_overlap_mode = Maybe (Located OverlapMode)
oflag
, cid_datafam_insts :: forall pass. ClsInstDecl pass -> [LDataFamInstDecl pass]
cid_datafam_insts = [LDataFamInstDecl GhcPs]
adts })
= do { (LHsSigType GhcRn
inst_ty', NameSet
inst_fvs)
<- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, NameSet)
rnHsSigType (SDoc -> HsDocContext
GenericCtx (SDoc -> HsDocContext) -> SDoc -> HsDocContext
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"an instance declaration") TypeOrKind
TypeLevel LHsSigType GhcPs
inst_ty
; let ([Name]
ktv_names, LHsContext GhcRn
_, LHsType GhcRn
head_ty') = LHsSigType GhcRn -> ([Name], LHsContext GhcRn, LHsType GhcRn)
splitLHsInstDeclTy LHsSigType GhcRn
inst_ty'
; Name
cls <-
case LHsType GhcRn -> Maybe (Located (IdP GhcRn))
forall (p :: Pass).
LHsType (GhcPass p) -> Maybe (Located (IdP (GhcPass p)))
hsTyGetAppHead_maybe LHsType GhcRn
head_ty' of
Just (Located (IdP GhcRn) -> Located (SrcSpanLess (Located Name))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ SrcSpanLess (Located Name)
cls) -> Name -> IOEnv (Env TcGblEnv TcLclEnv) Name
forall (f :: * -> *) a. Applicative f => a -> f a
pure Name
SrcSpanLess (Located Name)
cls
Maybe (Located (IdP GhcRn))
Nothing -> do
SrcSpan -> SDoc -> TcRn ()
addErrAt (LHsType GhcPs -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc (LHsSigType GhcPs -> LHsType GhcPs
forall (p :: Pass). LHsSigType (GhcPass p) -> LHsType (GhcPass p)
hsSigType LHsSigType GhcPs
inst_ty)) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Illegal class instance:" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (LHsSigType GhcPs -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsSigType GhcPs
inst_ty))
Int
2 ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Class instances must be of the form"
, Int -> SDoc -> SDoc
nest Int
2 (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$ String -> SDoc
text String
"context => C ty_1 ... ty_n"
, String -> SDoc
text String
"where" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Char -> SDoc
char Char
'C')
SDoc -> SDoc -> SDoc
<+> String -> SDoc
text String
"is a class"
])
Name -> IOEnv (Env TcGblEnv TcLclEnv) Name
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>"))
; (LHsBinds GhcRn
mbinds', [LSig GhcRn]
uprags', NameSet
meth_fvs) <- Bool
-> Name
-> [Name]
-> LHsBinds GhcPs
-> [LSig GhcPs]
-> RnM (LHsBinds GhcRn, [LSig GhcRn], NameSet)
rnMethodBinds Bool
False Name
cls [Name]
ktv_names LHsBinds GhcPs
mbinds [LSig GhcPs]
uprags
; Name -> LHsSigType GhcRn -> LHsBinds GhcRn -> TcRn ()
checkCanonicalInstances Name
cls LHsSigType GhcRn
inst_ty' LHsBinds GhcRn
mbinds'
; String -> SDoc -> TcRn ()
traceRn String
"rnSrcInstDecl" (LHsSigType GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsSigType GhcRn
inst_ty' SDoc -> SDoc -> SDoc
$$ [Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Name]
ktv_names)
; (([Located (TyFamInstDecl GhcRn)]
ats', [Located (DataFamInstDecl GhcRn)]
adts'), NameSet
more_fvs)
<- [Name]
-> RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
-> RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
forall a. [Name] -> RnM (a, NameSet) -> RnM (a, NameSet)
extendTyVarEnvFVRn [Name]
ktv_names (RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
-> RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet))
-> RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
-> RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
forall a b. (a -> b) -> a -> b
$
do { ([Located (TyFamInstDecl GhcRn)]
ats', NameSet
at_fvs) <- (AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet))
-> Name
-> [Name]
-> [LTyFamInstDecl GhcPs]
-> RnM ([Located (TyFamInstDecl GhcRn)], NameSet)
forall (decl :: * -> *).
(AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, NameSet))
-> Name
-> [Name]
-> [Located (decl GhcPs)]
-> RnM ([Located (decl GhcRn)], NameSet)
rnATInstDecls AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet)
rnTyFamInstDecl Name
cls [Name]
ktv_names [LTyFamInstDecl GhcPs]
ats
; ([Located (DataFamInstDecl GhcRn)]
adts', NameSet
adt_fvs) <- (AssocTyFamInfo
-> DataFamInstDecl GhcPs -> RnM (DataFamInstDecl GhcRn, NameSet))
-> Name
-> [Name]
-> [LDataFamInstDecl GhcPs]
-> RnM ([Located (DataFamInstDecl GhcRn)], NameSet)
forall (decl :: * -> *).
(AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, NameSet))
-> Name
-> [Name]
-> [Located (decl GhcPs)]
-> RnM ([Located (decl GhcRn)], NameSet)
rnATInstDecls AssocTyFamInfo
-> DataFamInstDecl GhcPs -> RnM (DataFamInstDecl GhcRn, NameSet)
rnDataFamInstDecl Name
cls [Name]
ktv_names [LDataFamInstDecl GhcPs]
adts
; (([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
-> RnM
(([Located (TyFamInstDecl GhcRn)],
[Located (DataFamInstDecl GhcRn)]),
NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ( ([Located (TyFamInstDecl GhcRn)]
ats', [Located (DataFamInstDecl GhcRn)]
adts'), NameSet
at_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
adt_fvs) }
; let all_fvs :: NameSet
all_fvs = NameSet
meth_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
more_fvs
NameSet -> NameSet -> NameSet
`plusFV` NameSet
inst_fvs
; (ClsInstDecl GhcRn, NameSet) -> RnM (ClsInstDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ClsInstDecl :: forall pass.
XCClsInstDecl pass
-> LHsSigType pass
-> LHsBinds pass
-> [LSig pass]
-> [LTyFamInstDecl pass]
-> [LDataFamInstDecl pass]
-> Maybe (Located OverlapMode)
-> ClsInstDecl pass
ClsInstDecl { cid_ext :: XCClsInstDecl GhcRn
cid_ext = XCClsInstDecl GhcRn
NoExtField
noExtField
, cid_poly_ty :: LHsSigType GhcRn
cid_poly_ty = LHsSigType GhcRn
inst_ty', cid_binds :: LHsBinds GhcRn
cid_binds = LHsBinds GhcRn
mbinds'
, cid_sigs :: [LSig GhcRn]
cid_sigs = [LSig GhcRn]
uprags', cid_tyfam_insts :: [Located (TyFamInstDecl GhcRn)]
cid_tyfam_insts = [Located (TyFamInstDecl GhcRn)]
ats'
, cid_overlap_mode :: Maybe (Located OverlapMode)
cid_overlap_mode = Maybe (Located OverlapMode)
oflag
, cid_datafam_insts :: [Located (DataFamInstDecl GhcRn)]
cid_datafam_insts = [Located (DataFamInstDecl GhcRn)]
adts' },
NameSet
all_fvs) }
rnClsInstDecl (XClsInstDecl XXClsInstDecl GhcPs
nec) = NoExtCon -> RnM (ClsInstDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXClsInstDecl GhcPs
NoExtCon
nec
rnFamInstEqn :: HsDocContext
-> AssocTyFamInfo
-> [Located RdrName]
-> FamInstEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', FreeVars))
-> RnM (FamInstEqn GhcRn rhs', FreeVars)
rnFamInstEqn :: HsDocContext
-> AssocTyFamInfo
-> [GenLocated SrcSpan RdrName]
-> FamInstEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', NameSet))
-> RnM (FamInstEqn GhcRn rhs', NameSet)
rnFamInstEqn HsDocContext
doc AssocTyFamInfo
atfi [GenLocated SrcSpan RdrName]
rhs_kvars
(HsIB { hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> Located (IdP pass)
feqn_tycon = Located (IdP GhcPs)
tycon
, feqn_bndrs :: forall pass rhs. FamEqn pass rhs -> Maybe [LHsTyVarBndr pass]
feqn_bndrs = Maybe [LHsTyVarBndr GhcPs]
mb_bndrs
, feqn_pats :: forall pass rhs. FamEqn pass rhs -> HsTyPats pass
feqn_pats = HsTyPats 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', NameSet)
rn_payload
= do { let mb_cls :: Maybe Name
mb_cls = case AssocTyFamInfo
atfi of
AssocTyFamInfo
NonAssocTyFamEqn -> 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
; Located Name
tycon' <- Maybe Name -> GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupFamInstName Maybe Name
mb_cls GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; let pat_kity_vars_with_dups :: [GenLocated SrcSpan RdrName]
pat_kity_vars_with_dups = HsTyPats GhcPs -> [GenLocated SrcSpan RdrName]
extractHsTyArgRdrKiTyVarsDup HsTyPats GhcPs
pats
; let imp_vars :: [GenLocated SrcSpan RdrName]
imp_vars | Maybe [LHsTyVarBndr GhcPs] -> Bool
forall a. Maybe a -> Bool
isNothing Maybe [LHsTyVarBndr GhcPs]
mb_bndrs = [GenLocated SrcSpan RdrName] -> [GenLocated SrcSpan RdrName]
forall a. Eq a => [Located a] -> [Located a]
nubL [GenLocated SrcSpan RdrName]
pat_kity_vars_with_dups
| Bool
otherwise = []
; [Name]
imp_var_names <- (GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Maybe Name
-> GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
forall a.
Maybe a
-> GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
newTyVarNameRn Maybe Name
mb_cls) [GenLocated SrcSpan RdrName]
imp_vars
; let bndrs :: [LHsTyVarBndr GhcPs]
bndrs = [LHsTyVarBndr GhcPs]
-> Maybe [LHsTyVarBndr GhcPs] -> [LHsTyVarBndr GhcPs]
forall a. a -> Maybe a -> a
fromMaybe [] Maybe [LHsTyVarBndr GhcPs]
mb_bndrs
bnd_vars :: [GenLocated SrcSpan RdrName]
bnd_vars = (LHsTyVarBndr GhcPs -> GenLocated SrcSpan RdrName)
-> [LHsTyVarBndr GhcPs] -> [GenLocated SrcSpan RdrName]
forall a b. (a -> b) -> [a] -> [b]
map LHsTyVarBndr GhcPs -> GenLocated SrcSpan RdrName
forall (p :: Pass).
LHsTyVarBndr (GhcPass p) -> Located (IdP (GhcPass p))
hsLTyVarLocName [LHsTyVarBndr GhcPs]
bndrs
payload_kvars :: [GenLocated SrcSpan RdrName]
payload_kvars = (GenLocated SrcSpan RdrName -> Bool)
-> [GenLocated SrcSpan RdrName] -> [GenLocated SrcSpan RdrName]
forall a. (a -> Bool) -> [a] -> [a]
filterOut (GenLocated SrcSpan RdrName -> [GenLocated SrcSpan RdrName] -> Bool
`elemRdr` ([GenLocated SrcSpan RdrName]
bnd_vars [GenLocated SrcSpan RdrName]
-> [GenLocated SrcSpan RdrName] -> [GenLocated SrcSpan RdrName]
forall a. [a] -> [a] -> [a]
++ [GenLocated SrcSpan RdrName]
imp_vars)) [GenLocated SrcSpan RdrName]
rhs_kvars
; [Name]
payload_kvar_names <- (GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Maybe Name
-> GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
forall a.
Maybe a
-> GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
newTyVarNameRn Maybe Name
mb_cls) [GenLocated SrcSpan RdrName]
payload_kvars
; let all_imp_var_names :: [Name]
all_imp_var_names = [Name]
imp_var_names [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
payload_kvar_names
; (([LHsTyVarBndr GhcRn]
bndrs', [LHsTypeArg GhcRn]
pats', rhs'
payload'), NameSet
fvs)
<- [Name]
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
forall a. [Name] -> RnM (a, NameSet) -> RnM (a, NameSet)
bindLocalNamesFV [Name]
all_imp_var_names (RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet))
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
forall a b. (a -> b) -> a -> b
$
HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn]
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet))
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindLHsTyVarBndrs HsDocContext
doc (SDoc -> Maybe SDoc
forall a. a -> Maybe a
Just (SDoc -> Maybe SDoc) -> SDoc -> Maybe SDoc
forall a b. (a -> b) -> a -> b
$ HsDocContext -> SDoc
inHsDocContext HsDocContext
doc)
Maybe Any
forall a. Maybe a
Nothing [LHsTyVarBndr GhcPs]
bndrs (([LHsTyVarBndr GhcRn]
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet))
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet))
-> ([LHsTyVarBndr GhcRn]
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet))
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
forall a b. (a -> b) -> a -> b
$ \[LHsTyVarBndr GhcRn]
bndrs' ->
do { ([LHsTypeArg GhcRn]
pats', NameSet
pat_fvs) <- HsDocContext -> HsTyPats GhcPs -> RnM ([LHsTypeArg GhcRn], NameSet)
rnLHsTypeArgs (GenLocated SrcSpan RdrName -> HsDocContext
FamPatCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon) HsTyPats GhcPs
pats
; (rhs'
payload', NameSet
rhs_fvs) <- HsDocContext -> rhs -> RnM (rhs', NameSet)
rn_payload HsDocContext
doc rhs
payload
; let groups :: [NonEmpty (Located RdrName)]
groups :: [NonEmpty (GenLocated SrcSpan RdrName)]
groups = (GenLocated SrcSpan RdrName
-> GenLocated SrcSpan RdrName -> Ordering)
-> [GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)]
forall a. (a -> a -> Ordering) -> [a] -> [NonEmpty a]
equivClasses GenLocated SrcSpan RdrName
-> GenLocated SrcSpan RdrName -> Ordering
forall a. (HasSrcSpan a, Ord (SrcSpanLess a)) => a -> a -> Ordering
cmpLocated ([GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)])
-> [GenLocated SrcSpan RdrName]
-> [NonEmpty (GenLocated SrcSpan RdrName)]
forall a b. (a -> b) -> a -> b
$
[GenLocated SrcSpan RdrName]
pat_kity_vars_with_dups
; [Name]
nms_dups <- (GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
lookupOccRn (RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name)
-> (GenLocated SrcSpan RdrName -> RdrName)
-> GenLocated SrcSpan RdrName
-> IOEnv (Env TcGblEnv TcLclEnv) Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GenLocated SrcSpan RdrName -> RdrName
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) ([GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Name])
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Name]
forall a b. (a -> b) -> a -> b
$
[ GenLocated SrcSpan RdrName
tv | (GenLocated SrcSpan RdrName
tv :| (GenLocated SrcSpan RdrName
_:[GenLocated SrcSpan RdrName]
_)) <- [NonEmpty (GenLocated SrcSpan RdrName)]
groups ]
; let nms_used :: NameSet
nms_used = NameSet -> [Name] -> NameSet
extendNameSetList NameSet
rhs_fvs ([Name] -> NameSet) -> [Name] -> NameSet
forall a b. (a -> b) -> a -> b
$
[Name]
inst_tvs [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
nms_dups
inst_tvs :: [Name]
inst_tvs = case AssocTyFamInfo
atfi of
AssocTyFamInfo
NonAssocTyFamEqn -> []
AssocTyFamDeflt Name
_ -> []
AssocTyFamInst Name
_ [Name]
inst_tvs -> [Name]
inst_tvs
all_nms :: [Name]
all_nms = [Name]
all_imp_var_names [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [LHsTyVarBndr GhcRn] -> [IdP GhcRn]
forall (p :: Pass). [LHsTyVarBndr (GhcPass p)] -> [IdP (GhcPass p)]
hsLTyVarNames [LHsTyVarBndr GhcRn]
bndrs'
; [Name] -> NameSet -> TcRn ()
warnUnusedTypePatterns [Name]
all_nms NameSet
nms_used
; (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
-> RnM (([LHsTyVarBndr GhcRn], [LHsTypeArg GhcRn], rhs'), NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (([LHsTyVarBndr GhcRn]
bndrs', [LHsTypeArg GhcRn]
pats', rhs'
payload'), NameSet
rhs_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
pat_fvs) }
; let all_fvs :: NameSet
all_fvs = NameSet
fvs NameSet -> Name -> NameSet
`addOneFV` Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
tycon'
; (FamInstEqn GhcRn rhs', NameSet)
-> RnM (FamInstEqn GhcRn rhs', NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsIB :: forall pass thing.
XHsIB pass thing -> thing -> HsImplicitBndrs pass thing
HsIB { hsib_ext :: XHsIB GhcRn (FamEqn GhcRn rhs')
hsib_ext = [Name]
XHsIB GhcRn (FamEqn GhcRn rhs')
all_imp_var_names
, hsib_body :: FamEqn GhcRn rhs'
hsib_body
= FamEqn :: forall pass rhs.
XCFamEqn pass rhs
-> Located (IdP pass)
-> Maybe [LHsTyVarBndr pass]
-> HsTyPats pass
-> LexicalFixity
-> rhs
-> FamEqn pass rhs
FamEqn { feqn_ext :: XCFamEqn GhcRn rhs'
feqn_ext = XCFamEqn GhcRn rhs'
NoExtField
noExtField
, feqn_tycon :: Located (IdP GhcRn)
feqn_tycon = Located Name
Located (IdP GhcRn)
tycon'
, feqn_bndrs :: Maybe [LHsTyVarBndr GhcRn]
feqn_bndrs = [LHsTyVarBndr GhcRn]
bndrs' [LHsTyVarBndr GhcRn]
-> Maybe [LHsTyVarBndr GhcPs] -> Maybe [LHsTyVarBndr GhcRn]
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Maybe [LHsTyVarBndr GhcPs]
mb_bndrs
, feqn_pats :: [LHsTypeArg GhcRn]
feqn_pats = [LHsTypeArg GhcRn]
pats'
, feqn_fixity :: LexicalFixity
feqn_fixity = LexicalFixity
fixity
, feqn_rhs :: rhs'
feqn_rhs = rhs'
payload' } },
NameSet
all_fvs) }
rnFamInstEqn HsDocContext
_ AssocTyFamInfo
_ [GenLocated SrcSpan RdrName]
_ (HsIB XHsIB GhcPs (FamEqn GhcPs rhs)
_ (XFamEqn XXFamEqn GhcPs rhs
nec)) HsDocContext -> rhs -> RnM (rhs', NameSet)
_ = NoExtCon -> RnM (FamInstEqn GhcRn rhs', NameSet)
forall a. NoExtCon -> a
noExtCon XXFamEqn GhcPs rhs
NoExtCon
nec
rnFamInstEqn HsDocContext
_ AssocTyFamInfo
_ [GenLocated SrcSpan RdrName]
_ (XHsImplicitBndrs XXHsImplicitBndrs GhcPs (FamEqn GhcPs rhs)
nec) HsDocContext -> rhs -> RnM (rhs', NameSet)
_ = NoExtCon -> RnM (FamInstEqn GhcRn rhs', NameSet)
forall a. NoExtCon -> a
noExtCon XXHsImplicitBndrs GhcPs (FamEqn GhcPs rhs)
NoExtCon
nec
rnTyFamInstDecl :: AssocTyFamInfo
-> TyFamInstDecl GhcPs
-> RnM (TyFamInstDecl GhcRn, FreeVars)
rnTyFamInstDecl :: AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet)
rnTyFamInstDecl AssocTyFamInfo
atfi (TyFamInstDecl { tfid_eqn :: forall pass. TyFamInstDecl pass -> TyFamInstEqn pass
tfid_eqn = TyFamInstEqn GhcPs
eqn })
= do { (TyFamInstEqn GhcRn
eqn', NameSet
fvs) <- AssocTyFamInfo
-> ClosedTyFamInfo
-> TyFamInstEqn GhcPs
-> RnM (TyFamInstEqn GhcRn, NameSet)
rnTyFamInstEqn AssocTyFamInfo
atfi ClosedTyFamInfo
NotClosedTyFam TyFamInstEqn GhcPs
eqn
; (TyFamInstDecl GhcRn, NameSet)
-> RnM (TyFamInstDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (TyFamInstDecl :: forall pass. TyFamInstEqn pass -> TyFamInstDecl pass
TyFamInstDecl { tfid_eqn :: TyFamInstEqn GhcRn
tfid_eqn = TyFamInstEqn GhcRn
eqn' }, NameSet
fvs) }
data AssocTyFamInfo
= NonAssocTyFamEqn
| AssocTyFamDeflt Name
| AssocTyFamInst Name
[Name]
data ClosedTyFamInfo
= NotClosedTyFam
| ClosedTyFam (Located RdrName) Name
rnTyFamInstEqn :: AssocTyFamInfo
-> ClosedTyFamInfo
-> TyFamInstEqn GhcPs
-> RnM (TyFamInstEqn GhcRn, FreeVars)
rnTyFamInstEqn :: AssocTyFamInfo
-> ClosedTyFamInfo
-> TyFamInstEqn GhcPs
-> RnM (TyFamInstEqn GhcRn, NameSet)
rnTyFamInstEqn AssocTyFamInfo
atfi ClosedTyFamInfo
ctf_info
eqn :: TyFamInstEqn GhcPs
eqn@(HsIB { hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> Located (IdP pass)
feqn_tycon = Located (IdP GhcPs)
tycon
, feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
feqn_rhs = LHsType GhcPs
rhs }})
= do { let rhs_kvs :: [GenLocated SrcSpan RdrName]
rhs_kvs = LHsType GhcPs -> [GenLocated SrcSpan RdrName]
extractHsTyRdrTyVarsKindVars LHsType GhcPs
rhs
; (eqn' :: TyFamInstEqn GhcRn
eqn'@(HsIB { hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body =
FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> Located (IdP pass)
feqn_tycon = Located (IdP GhcRn) -> Located (SrcSpanLess (Located Name))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL -> L SrcSpan
_ SrcSpanLess (Located Name)
tycon' }}), NameSet
fvs)
<- HsDocContext
-> AssocTyFamInfo
-> [GenLocated SrcSpan RdrName]
-> TyFamInstEqn GhcPs
-> (HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet))
-> RnM (TyFamInstEqn GhcRn, NameSet)
forall rhs rhs'.
HsDocContext
-> AssocTyFamInfo
-> [GenLocated SrcSpan RdrName]
-> FamInstEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', NameSet))
-> RnM (FamInstEqn GhcRn rhs', NameSet)
rnFamInstEqn (GenLocated SrcSpan RdrName -> HsDocContext
TySynCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon) AssocTyFamInfo
atfi [GenLocated SrcSpan RdrName]
rhs_kvs TyFamInstEqn GhcPs
eqn HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnTySyn
; case ClosedTyFamInfo
ctf_info of
ClosedTyFamInfo
NotClosedTyFam -> () -> TcRn ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
ClosedTyFam GenLocated SrcSpan RdrName
fam_rdr_name Name
fam_name ->
Bool -> SDoc -> TcRn ()
checkTc (Name
fam_name Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
SrcSpanLess (Located Name)
tycon') (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
HsDocContext -> SDoc -> SDoc
withHsDocContext (GenLocated SrcSpan RdrName -> HsDocContext
TyFamilyCtx GenLocated SrcSpan RdrName
fam_rdr_name) (SDoc -> SDoc) -> SDoc -> SDoc
forall a b. (a -> b) -> a -> b
$
Name -> Name -> SDoc
wrongTyFamName Name
fam_name Name
SrcSpanLess (Located Name)
tycon'
; (TyFamInstEqn GhcRn, NameSet) -> RnM (TyFamInstEqn GhcRn, NameSet)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TyFamInstEqn GhcRn
eqn', NameSet
fvs) }
rnTyFamInstEqn AssocTyFamInfo
_ ClosedTyFamInfo
_ (HsIB XHsIB GhcPs (FamEqn GhcPs (LHsType GhcPs))
_ (XFamEqn XXFamEqn GhcPs (LHsType GhcPs)
nec)) = NoExtCon -> RnM (TyFamInstEqn GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXFamEqn GhcPs (LHsType GhcPs)
NoExtCon
nec
rnTyFamInstEqn AssocTyFamInfo
_ ClosedTyFamInfo
_ (XHsImplicitBndrs XXHsImplicitBndrs GhcPs (FamEqn GhcPs (LHsType GhcPs))
nec) = NoExtCon -> RnM (TyFamInstEqn GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXHsImplicitBndrs GhcPs (FamEqn GhcPs (LHsType GhcPs))
NoExtCon
nec
rnTyFamDefltDecl :: Name
-> TyFamDefltDecl GhcPs
-> RnM (TyFamDefltDecl GhcRn, FreeVars)
rnTyFamDefltDecl :: Name -> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet)
rnTyFamDefltDecl Name
cls = AssocTyFamInfo
-> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet)
rnTyFamInstDecl (Name -> AssocTyFamInfo
AssocTyFamDeflt Name
cls)
rnDataFamInstDecl :: AssocTyFamInfo
-> DataFamInstDecl GhcPs
-> RnM (DataFamInstDecl GhcRn, FreeVars)
rnDataFamInstDecl :: AssocTyFamInfo
-> DataFamInstDecl GhcPs -> RnM (DataFamInstDecl GhcRn, NameSet)
rnDataFamInstDecl AssocTyFamInfo
atfi (DataFamInstDecl { dfid_eqn :: forall pass.
DataFamInstDecl pass -> FamInstEqn pass (HsDataDefn pass)
dfid_eqn = eqn :: FamInstEqn GhcPs (HsDataDefn GhcPs)
eqn@(HsIB { hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body =
FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> Located (IdP pass)
feqn_tycon = Located (IdP GhcPs)
tycon
, feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
feqn_rhs = HsDataDefn GhcPs
rhs }})})
= do { let rhs_kvs :: [GenLocated SrcSpan RdrName]
rhs_kvs = HsDataDefn GhcPs -> [GenLocated SrcSpan RdrName]
extractDataDefnKindVars HsDataDefn GhcPs
rhs
; (FamInstEqn GhcRn (HsDataDefn GhcRn)
eqn', NameSet
fvs) <-
HsDocContext
-> AssocTyFamInfo
-> [GenLocated SrcSpan RdrName]
-> FamInstEqn GhcPs (HsDataDefn GhcPs)
-> (HsDocContext
-> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, NameSet))
-> RnM (FamInstEqn GhcRn (HsDataDefn GhcRn), NameSet)
forall rhs rhs'.
HsDocContext
-> AssocTyFamInfo
-> [GenLocated SrcSpan RdrName]
-> FamInstEqn GhcPs rhs
-> (HsDocContext -> rhs -> RnM (rhs', NameSet))
-> RnM (FamInstEqn GhcRn rhs', NameSet)
rnFamInstEqn (GenLocated SrcSpan RdrName -> HsDocContext
TyDataCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon) AssocTyFamInfo
atfi [GenLocated SrcSpan RdrName]
rhs_kvs FamInstEqn GhcPs (HsDataDefn GhcPs)
eqn HsDocContext -> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, NameSet)
rnDataDefn
; (DataFamInstDecl GhcRn, NameSet)
-> RnM (DataFamInstDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (DataFamInstDecl :: forall pass.
FamInstEqn pass (HsDataDefn pass) -> DataFamInstDecl pass
DataFamInstDecl { dfid_eqn :: FamInstEqn GhcRn (HsDataDefn GhcRn)
dfid_eqn = FamInstEqn GhcRn (HsDataDefn GhcRn)
eqn' }, NameSet
fvs) }
rnDataFamInstDecl AssocTyFamInfo
_ (DataFamInstDecl (HsIB XHsIB GhcPs (FamEqn GhcPs (HsDataDefn GhcPs))
_ (XFamEqn XXFamEqn GhcPs (HsDataDefn GhcPs)
nec)))
= NoExtCon -> RnM (DataFamInstDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXFamEqn GhcPs (HsDataDefn GhcPs)
NoExtCon
nec
rnDataFamInstDecl AssocTyFamInfo
_ (DataFamInstDecl (XHsImplicitBndrs XXHsImplicitBndrs GhcPs (FamEqn GhcPs (HsDataDefn GhcPs))
nec))
= NoExtCon -> RnM (DataFamInstDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXHsImplicitBndrs GhcPs (FamEqn GhcPs (HsDataDefn GhcPs))
NoExtCon
nec
rnATDecls :: Name
-> [LFamilyDecl GhcPs]
-> RnM ([LFamilyDecl GhcRn], FreeVars)
rnATDecls :: Name -> [LFamilyDecl GhcPs] -> RnM ([LFamilyDecl GhcRn], NameSet)
rnATDecls Name
cls [LFamilyDecl GhcPs]
at_decls
= (FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, NameSet))
-> [LFamilyDecl GhcPs] -> RnM ([LFamilyDecl GhcRn], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList (Maybe Name -> FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, NameSet)
rnFamDecl (Name -> Maybe Name
forall a. a -> Maybe a
Just Name
cls)) [LFamilyDecl GhcPs]
at_decls
rnATInstDecls :: (AssocTyFamInfo ->
decl GhcPs ->
RnM (decl GhcRn, FreeVars))
-> Name
-> [Name]
-> [Located (decl GhcPs)]
-> RnM ([Located (decl GhcRn)], FreeVars)
rnATInstDecls :: (AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, NameSet))
-> Name
-> [Name]
-> [Located (decl GhcPs)]
-> RnM ([Located (decl GhcRn)], NameSet)
rnATInstDecls AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, NameSet)
rnFun Name
cls [Name]
tv_ns [Located (decl GhcPs)]
at_insts
= (decl GhcPs -> RnM (decl GhcRn, NameSet))
-> [Located (decl GhcPs)] -> RnM ([Located (decl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList (AssocTyFamInfo -> decl GhcPs -> RnM (decl GhcRn, NameSet)
rnFun (Name -> [Name] -> AssocTyFamInfo
AssocTyFamInst Name
cls [Name]
tv_ns)) [Located (decl GhcPs)]
at_insts
rnSrcDerivDecl :: DerivDecl GhcPs -> RnM (DerivDecl GhcRn, FreeVars)
rnSrcDerivDecl :: DerivDecl GhcPs -> RnM (DerivDecl GhcRn, NameSet)
rnSrcDerivDecl (DerivDecl XCDerivDecl GhcPs
_ LHsSigWcType GhcPs
ty Maybe (LDerivStrategy GhcPs)
mds Maybe (Located OverlapMode)
overlap)
= do { Bool
standalone_deriv_ok <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.StandaloneDeriving
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
standalone_deriv_ok (SDoc -> TcRn ()
addErr SDoc
standaloneDerivErr)
; (Maybe (LDerivStrategy GhcRn)
mds', LHsSigWcType GhcRn
ty', NameSet
fvs)
<- HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (LHsSigWcType GhcRn, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), LHsSigWcType GhcRn, NameSet)
forall a.
HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
rnLDerivStrategy HsDocContext
DerivDeclCtx Maybe (LDerivStrategy GhcPs)
mds (RnM (LHsSigWcType GhcRn, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), LHsSigWcType GhcRn, NameSet))
-> RnM (LHsSigWcType GhcRn, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), LHsSigWcType GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$
HsSigWcTypeScoping
-> HsDocContext
-> LHsSigWcType GhcPs
-> RnM (LHsSigWcType GhcRn, NameSet)
rnHsSigWcType HsSigWcTypeScoping
BindUnlessForall HsDocContext
DerivDeclCtx LHsSigWcType GhcPs
ty
; Maybe (LDerivStrategy GhcRn) -> SrcSpan -> TcRn ()
warnNoDerivStrat Maybe (LDerivStrategy GhcRn)
mds' SrcSpan
loc
; (DerivDecl GhcRn, NameSet) -> RnM (DerivDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCDerivDecl GhcRn
-> LHsSigWcType GhcRn
-> Maybe (LDerivStrategy GhcRn)
-> Maybe (Located OverlapMode)
-> DerivDecl GhcRn
forall pass.
XCDerivDecl pass
-> LHsSigWcType pass
-> Maybe (LDerivStrategy pass)
-> Maybe (Located OverlapMode)
-> DerivDecl pass
DerivDecl XCDerivDecl GhcRn
NoExtField
noExtField LHsSigWcType GhcRn
ty' Maybe (LDerivStrategy GhcRn)
mds' Maybe (Located OverlapMode)
overlap, NameSet
fvs) }
where
loc :: SrcSpan
loc = LHsType GhcPs -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc (LHsType GhcPs -> SrcSpan) -> LHsType GhcPs -> SrcSpan
forall a b. (a -> b) -> a -> b
$ LHsSigType GhcPs -> LHsType GhcPs
forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body (LHsSigType GhcPs -> LHsType GhcPs)
-> LHsSigType GhcPs -> LHsType GhcPs
forall a b. (a -> b) -> a -> b
$ LHsSigWcType GhcPs -> LHsSigType GhcPs
forall pass thing. HsWildCardBndrs pass thing -> thing
hswc_body LHsSigWcType GhcPs
ty
rnSrcDerivDecl (XDerivDecl XXDerivDecl GhcPs
nec) = NoExtCon -> RnM (DerivDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXDerivDecl GhcPs
NoExtCon
nec
standaloneDerivErr :: SDoc
standaloneDerivErr :: SDoc
standaloneDerivErr
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Illegal standalone deriving declaration")
Int
2 (String -> SDoc
text String
"Use StandaloneDeriving to enable this extension")
rnHsRuleDecls :: RuleDecls GhcPs -> RnM (RuleDecls GhcRn, FreeVars)
rnHsRuleDecls :: RuleDecls GhcPs -> RnM (RuleDecls GhcRn, NameSet)
rnHsRuleDecls (HsRules { rds_src :: forall pass. RuleDecls pass -> SourceText
rds_src = SourceText
src
, rds_rules :: forall pass. RuleDecls pass -> [LRuleDecl pass]
rds_rules = [LRuleDecl GhcPs]
rules })
= do { ([Located (RuleDecl GhcRn)]
rn_rules,NameSet
fvs) <- (RuleDecl GhcPs -> RnM (RuleDecl GhcRn, NameSet))
-> [LRuleDecl GhcPs] -> RnM ([Located (RuleDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList RuleDecl GhcPs -> RnM (RuleDecl GhcRn, NameSet)
rnHsRuleDecl [LRuleDecl GhcPs]
rules
; (RuleDecls GhcRn, NameSet) -> RnM (RuleDecls GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsRules :: forall pass.
XCRuleDecls pass
-> SourceText -> [LRuleDecl pass] -> RuleDecls pass
HsRules { rds_ext :: XCRuleDecls GhcRn
rds_ext = XCRuleDecls GhcRn
NoExtField
noExtField
, rds_src :: SourceText
rds_src = SourceText
src
, rds_rules :: [Located (RuleDecl GhcRn)]
rds_rules = [Located (RuleDecl GhcRn)]
rn_rules }, NameSet
fvs) }
rnHsRuleDecls (XRuleDecls XXRuleDecls GhcPs
nec) = NoExtCon -> RnM (RuleDecls GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXRuleDecls GhcPs
NoExtCon
nec
rnHsRuleDecl :: RuleDecl GhcPs -> RnM (RuleDecl GhcRn, FreeVars)
rnHsRuleDecl :: RuleDecl GhcPs -> RnM (RuleDecl GhcRn, NameSet)
rnHsRuleDecl (HsRule { rd_name :: forall pass. RuleDecl pass -> Located (SourceText, CLabelString)
rd_name = Located (SourceText, 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 -> Located (HsExpr pass)
rd_lhs = Located (HsExpr GhcPs)
lhs
, rd_rhs :: forall pass. RuleDecl pass -> Located (HsExpr pass)
rd_rhs = Located (HsExpr GhcPs)
rhs })
= do { let rdr_names_w_loc :: [GenLocated SrcSpan RdrName]
rdr_names_w_loc = (LRuleBndr GhcPs -> GenLocated SrcSpan RdrName)
-> [LRuleBndr GhcPs] -> [GenLocated SrcSpan RdrName]
forall a b. (a -> b) -> [a] -> [b]
map (RuleBndr GhcPs -> GenLocated SrcSpan RdrName
forall pass.
(XXRuleBndr pass ~ NoExtCon) =>
RuleBndr pass -> Located (IdP pass)
get_var (RuleBndr GhcPs -> GenLocated SrcSpan RdrName)
-> (LRuleBndr GhcPs -> RuleBndr GhcPs)
-> LRuleBndr GhcPs
-> GenLocated SrcSpan RdrName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LRuleBndr GhcPs -> RuleBndr GhcPs
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) [LRuleBndr GhcPs]
tmvs
; [GenLocated SrcSpan RdrName] -> TcRn ()
checkDupRdrNames [GenLocated SrcSpan RdrName]
rdr_names_w_loc
; [GenLocated SrcSpan RdrName] -> TcRn ()
checkShadowedRdrNames [GenLocated SrcSpan RdrName]
rdr_names_w_loc
; [Name]
names <- [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Name]
newLocalBndrsRn [GenLocated SrcSpan RdrName]
rdr_names_w_loc
; let doc :: HsDocContext
doc = CLabelString -> HsDocContext
RuleCtx ((SourceText, CLabelString) -> CLabelString
forall a b. (a, b) -> b
snd ((SourceText, CLabelString) -> CLabelString)
-> (SourceText, CLabelString) -> CLabelString
forall a b. (a -> b) -> a -> b
$ Located (SourceText, CLabelString)
-> SrcSpanLess (Located (SourceText, CLabelString))
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located (SourceText, CLabelString)
rule_name)
; HsDocContext
-> SDoc
-> Maybe [LHsTyVarBndr GhcPs]
-> (Maybe [LHsTyVarBndr GhcRn] -> RnM (RuleDecl GhcRn, NameSet))
-> RnM (RuleDecl GhcRn, NameSet)
forall b.
HsDocContext
-> SDoc
-> Maybe [LHsTyVarBndr GhcPs]
-> (Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindRuleTyVars HsDocContext
doc SDoc
in_rule Maybe [LHsTyVarBndr (NoGhcTc GhcPs)]
Maybe [LHsTyVarBndr GhcPs]
tyvs ((Maybe [LHsTyVarBndr GhcRn] -> RnM (RuleDecl GhcRn, NameSet))
-> RnM (RuleDecl GhcRn, NameSet))
-> (Maybe [LHsTyVarBndr GhcRn] -> RnM (RuleDecl GhcRn, NameSet))
-> RnM (RuleDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ Maybe [LHsTyVarBndr GhcRn]
tyvs' ->
HsDocContext
-> Maybe [LHsTyVarBndr GhcRn]
-> [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (RuleDecl GhcRn, NameSet))
-> RnM (RuleDecl GhcRn, NameSet)
forall ty_bndrs a.
HsDocContext
-> Maybe ty_bndrs
-> [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet))
-> RnM (a, NameSet)
bindRuleTmVars HsDocContext
doc Maybe [LHsTyVarBndr GhcRn]
tyvs' [LRuleBndr GhcPs]
tmvs [Name]
names (([LRuleBndr GhcRn] -> RnM (RuleDecl GhcRn, NameSet))
-> RnM (RuleDecl GhcRn, NameSet))
-> ([LRuleBndr GhcRn] -> RnM (RuleDecl GhcRn, NameSet))
-> RnM (RuleDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [LRuleBndr GhcRn]
tmvs' ->
do { (LHsExpr GhcRn
lhs', NameSet
fv_lhs') <- Located (HsExpr GhcPs) -> TcM (LHsExpr GhcRn, NameSet)
rnLExpr Located (HsExpr GhcPs)
lhs
; (LHsExpr GhcRn
rhs', NameSet
fv_rhs') <- Located (HsExpr GhcPs) -> TcM (LHsExpr GhcRn, NameSet)
rnLExpr Located (HsExpr GhcPs)
rhs
; CLabelString -> [Name] -> LHsExpr GhcRn -> NameSet -> TcRn ()
checkValidRule ((SourceText, CLabelString) -> CLabelString
forall a b. (a, b) -> b
snd ((SourceText, CLabelString) -> CLabelString)
-> (SourceText, CLabelString) -> CLabelString
forall a b. (a -> b) -> a -> b
$ Located (SourceText, CLabelString)
-> SrcSpanLess (Located (SourceText, CLabelString))
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located (SourceText, CLabelString)
rule_name) [Name]
names LHsExpr GhcRn
lhs' NameSet
fv_lhs'
; (RuleDecl GhcRn, NameSet) -> RnM (RuleDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (HsRule :: forall pass.
XHsRule pass
-> Located (SourceText, CLabelString)
-> Activation
-> Maybe [LHsTyVarBndr (NoGhcTc pass)]
-> [LRuleBndr pass]
-> Located (HsExpr pass)
-> Located (HsExpr pass)
-> RuleDecl pass
HsRule { rd_ext :: XHsRule GhcRn
rd_ext = NameSet -> NameSet -> HsRuleRn
HsRuleRn NameSet
fv_lhs' NameSet
fv_rhs'
, rd_name :: Located (SourceText, CLabelString)
rd_name = Located (SourceText, CLabelString)
rule_name
, rd_act :: Activation
rd_act = Activation
act
, rd_tyvs :: Maybe [LHsTyVarBndr (NoGhcTc GhcRn)]
rd_tyvs = Maybe [LHsTyVarBndr (NoGhcTc GhcRn)]
Maybe [LHsTyVarBndr GhcRn]
tyvs'
, rd_tmvs :: [LRuleBndr GhcRn]
rd_tmvs = [LRuleBndr GhcRn]
tmvs'
, rd_lhs :: LHsExpr GhcRn
rd_lhs = LHsExpr GhcRn
lhs'
, rd_rhs :: LHsExpr GhcRn
rd_rhs = LHsExpr GhcRn
rhs' }, NameSet
fv_lhs' NameSet -> NameSet -> NameSet
`plusFV` NameSet
fv_rhs') } }
where
get_var :: RuleBndr pass -> Located (IdP pass)
get_var (RuleBndrSig XRuleBndrSig pass
_ Located (IdP pass)
v LHsSigWcType pass
_) = Located (IdP pass)
v
get_var (RuleBndr XCRuleBndr pass
_ Located (IdP pass)
v) = Located (IdP pass)
v
get_var (XRuleBndr XXRuleBndr pass
nec) = NoExtCon -> Located (IdP pass)
forall a. NoExtCon -> a
noExtCon XXRuleBndr pass
NoExtCon
nec
in_rule :: SDoc
in_rule = String -> SDoc
text String
"in the rule" SDoc -> SDoc -> SDoc
<+> Located (SourceText, CLabelString) -> SDoc
pprFullRuleName Located (SourceText, CLabelString)
rule_name
rnHsRuleDecl (XRuleDecl XXRuleDecl GhcPs
nec) = NoExtCon -> RnM (RuleDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXRuleDecl GhcPs
NoExtCon
nec
bindRuleTmVars :: HsDocContext -> Maybe ty_bndrs
-> [LRuleBndr GhcPs] -> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, FreeVars))
-> RnM (a, FreeVars)
bindRuleTmVars :: HsDocContext
-> Maybe ty_bndrs
-> [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet))
-> RnM (a, NameSet)
bindRuleTmVars HsDocContext
doc Maybe ty_bndrs
tyvs [LRuleBndr GhcPs]
vars [Name]
names [LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside
= [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet))
-> RnM (a, NameSet)
go [LRuleBndr GhcPs]
vars [Name]
names (([LRuleBndr GhcRn] -> RnM (a, NameSet)) -> RnM (a, NameSet))
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet)) -> RnM (a, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [LRuleBndr GhcRn]
vars' ->
[Name] -> RnM (a, NameSet) -> RnM (a, NameSet)
forall a. [Name] -> RnM (a, NameSet) -> RnM (a, NameSet)
bindLocalNamesFV [Name]
names ([LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside [LRuleBndr GhcRn]
vars')
where
go :: [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet))
-> RnM (a, NameSet)
go ((LRuleBndr GhcPs -> Located (SrcSpanLess (LRuleBndr GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l (RuleBndr _ (dL->L loc _))) : [LRuleBndr GhcPs]
vars) (Name
n : [Name]
ns) [LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside
= [LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet))
-> RnM (a, NameSet)
go [LRuleBndr GhcPs]
vars [Name]
ns (([LRuleBndr GhcRn] -> RnM (a, NameSet)) -> RnM (a, NameSet))
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet)) -> RnM (a, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [LRuleBndr GhcRn]
vars' ->
[LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside (SrcSpan -> SrcSpanLess (LRuleBndr GhcRn) -> LRuleBndr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l (XCRuleBndr GhcRn -> Located (IdP GhcRn) -> RuleBndr GhcRn
forall pass. XCRuleBndr pass -> Located (IdP pass) -> RuleBndr pass
RuleBndr XCRuleBndr GhcRn
NoExtField
noExtField (SrcSpan -> SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc Name
SrcSpanLess (Located Name)
n)) LRuleBndr GhcRn -> [LRuleBndr GhcRn] -> [LRuleBndr GhcRn]
forall a. a -> [a] -> [a]
: [LRuleBndr GhcRn]
vars')
go ((LRuleBndr GhcPs -> Located (SrcSpanLess (LRuleBndr GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l (RuleBndrSig _ (dL->L loc _) bsig)) : [LRuleBndr GhcPs]
vars)
(Name
n : [Name]
ns) [LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside
= HsSigWcTypeScoping
-> HsDocContext
-> LHsSigWcType GhcPs
-> (LHsSigWcType GhcRn -> RnM (a, NameSet))
-> RnM (a, NameSet)
forall a.
HsSigWcTypeScoping
-> HsDocContext
-> LHsSigWcType GhcPs
-> (LHsSigWcType GhcRn -> RnM (a, NameSet))
-> RnM (a, NameSet)
rnHsSigWcTypeScoped HsSigWcTypeScoping
bind_free_tvs HsDocContext
doc LHsSigWcType GhcPs
bsig ((LHsSigWcType GhcRn -> RnM (a, NameSet)) -> RnM (a, NameSet))
-> (LHsSigWcType GhcRn -> RnM (a, NameSet)) -> RnM (a, NameSet)
forall a b. (a -> b) -> a -> b
$ \ LHsSigWcType GhcRn
bsig' ->
[LRuleBndr GhcPs]
-> [Name]
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet))
-> RnM (a, NameSet)
go [LRuleBndr GhcPs]
vars [Name]
ns (([LRuleBndr GhcRn] -> RnM (a, NameSet)) -> RnM (a, NameSet))
-> ([LRuleBndr GhcRn] -> RnM (a, NameSet)) -> RnM (a, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [LRuleBndr GhcRn]
vars' ->
[LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside (SrcSpan -> SrcSpanLess (LRuleBndr GhcRn) -> LRuleBndr GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l (XRuleBndrSig GhcRn
-> Located (IdP GhcRn) -> LHsSigWcType GhcRn -> RuleBndr GhcRn
forall pass.
XRuleBndrSig pass
-> Located (IdP pass) -> LHsSigWcType pass -> RuleBndr pass
RuleBndrSig XRuleBndrSig GhcRn
NoExtField
noExtField (SrcSpan -> SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc Name
SrcSpanLess (Located Name)
n) LHsSigWcType GhcRn
bsig') LRuleBndr GhcRn -> [LRuleBndr GhcRn] -> [LRuleBndr GhcRn]
forall a. a -> [a] -> [a]
: [LRuleBndr GhcRn]
vars')
go [] [] [LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside = [LRuleBndr GhcRn] -> RnM (a, NameSet)
thing_inside []
go [LRuleBndr GhcPs]
vars [Name]
names [LRuleBndr GhcRn] -> RnM (a, NameSet)
_ = String -> SDoc -> RnM (a, NameSet)
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"bindRuleVars" ([LRuleBndr GhcPs] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LRuleBndr GhcPs]
vars SDoc -> SDoc -> SDoc
$$ [Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Name]
names)
bind_free_tvs :: HsSigWcTypeScoping
bind_free_tvs = case Maybe ty_bndrs
tyvs of Maybe ty_bndrs
Nothing -> HsSigWcTypeScoping
AlwaysBind
Just ty_bndrs
_ -> HsSigWcTypeScoping
NeverBind
bindRuleTyVars :: HsDocContext -> SDoc -> Maybe [LHsTyVarBndr GhcPs]
-> (Maybe [LHsTyVarBndr GhcRn] -> RnM (b, FreeVars))
-> RnM (b, FreeVars)
bindRuleTyVars :: HsDocContext
-> SDoc
-> Maybe [LHsTyVarBndr GhcPs]
-> (Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindRuleTyVars HsDocContext
doc SDoc
in_doc (Just [LHsTyVarBndr GhcPs]
bndrs) Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet)
thing_inside
= HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindLHsTyVarBndrs HsDocContext
doc (SDoc -> Maybe SDoc
forall a. a -> Maybe a
Just SDoc
in_doc) Maybe Any
forall a. Maybe a
Nothing [LHsTyVarBndr GhcPs]
bndrs (Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet)
thing_inside (Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> ([LHsTyVarBndr GhcRn] -> Maybe [LHsTyVarBndr GhcRn])
-> [LHsTyVarBndr GhcRn]
-> RnM (b, NameSet)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [LHsTyVarBndr GhcRn] -> Maybe [LHsTyVarBndr GhcRn]
forall a. a -> Maybe a
Just)
bindRuleTyVars HsDocContext
_ SDoc
_ Maybe [LHsTyVarBndr GhcPs]
_ Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet)
thing_inside = Maybe [LHsTyVarBndr GhcRn] -> RnM (b, NameSet)
thing_inside Maybe [LHsTyVarBndr GhcRn]
forall a. Maybe a
Nothing
checkValidRule :: FastString -> [Name] -> LHsExpr GhcRn -> NameSet -> RnM ()
checkValidRule :: CLabelString -> [Name] -> LHsExpr GhcRn -> NameSet -> TcRn ()
checkValidRule CLabelString
rule_name [Name]
ids LHsExpr GhcRn
lhs' NameSet
fv_lhs'
= do {
case ([Name] -> LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
validRuleLhs [Name]
ids LHsExpr GhcRn
lhs') of
Maybe (HsExpr GhcRn)
Nothing -> () -> TcRn ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just HsExpr GhcRn
bad -> SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWithTc (CLabelString -> LHsExpr GhcRn -> HsExpr GhcRn -> SDoc
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 -> NameSet -> Bool
`elemNameSet` NameSet
fv_lhs')]
; (Name -> TcRn ()) -> [Name] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (SDoc -> TcRn ()
addErr (SDoc -> TcRn ()) -> (Name -> SDoc) -> Name -> TcRn ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CLabelString -> Name -> SDoc
badRuleVar 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
= LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
lhs
where
checkl :: LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
checkl = HsExpr GhcRn -> Maybe (HsExpr GhcRn)
check (HsExpr GhcRn -> Maybe (HsExpr GhcRn))
-> (LHsExpr GhcRn -> HsExpr GhcRn)
-> LHsExpr GhcRn
-> Maybe (HsExpr GhcRn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LHsExpr GhcRn -> HsExpr GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc
check :: HsExpr GhcRn -> Maybe (HsExpr GhcRn)
check (OpApp XOpApp GhcRn
_ LHsExpr GhcRn
e1 LHsExpr GhcRn
op LHsExpr GhcRn
e2) = LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
op Maybe (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
forall p a. p -> Maybe a
checkl_e LHsExpr GhcRn
e1
Maybe (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
forall p a. p -> Maybe a
checkl_e LHsExpr GhcRn
e2
check (HsApp XApp GhcRn
_ LHsExpr GhcRn
e1 LHsExpr GhcRn
e2) = LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
e1 Maybe (HsExpr GhcRn)
-> Maybe (HsExpr GhcRn) -> Maybe (HsExpr GhcRn)
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
forall p a. p -> Maybe a
checkl_e LHsExpr GhcRn
e2
check (HsAppType XAppTypeE GhcRn
_ LHsExpr GhcRn
e LHsWcType (NoGhcTc GhcRn)
_) = LHsExpr GhcRn -> Maybe (HsExpr GhcRn)
checkl LHsExpr GhcRn
e
check (HsVar XVar GhcRn
_ Located (IdP GhcRn)
lv)
| (Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
Located (IdP GhcRn)
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 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
badRuleVar :: FastString -> Name -> SDoc
badRuleVar :: CLabelString -> Name -> SDoc
badRuleVar CLabelString
name Name
var
= [SDoc] -> SDoc
sep [String -> SDoc
text String
"Rule" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
doubleQuotes (CLabelString -> SDoc
ftext CLabelString
name) SDoc -> SDoc -> SDoc
<> SDoc
colon,
String -> SDoc
text String
"Forall'd variable" SDoc -> SDoc -> SDoc
<+> SDoc -> SDoc
quotes (Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
var) SDoc -> SDoc -> SDoc
<+>
String -> SDoc
text String
"does not appear on left hand side"]
badRuleLhsErr :: FastString -> LHsExpr GhcRn -> HsExpr GhcRn -> SDoc
badRuleLhsErr :: CLabelString -> LHsExpr GhcRn -> HsExpr GhcRn -> SDoc
badRuleLhsErr CLabelString
name LHsExpr GhcRn
lhs HsExpr GhcRn
bad_e
= [SDoc] -> SDoc
sep [String -> SDoc
text String
"Rule" SDoc -> SDoc -> SDoc
<+> CLabelString -> SDoc
pprRuleName CLabelString
name SDoc -> SDoc -> SDoc
<> SDoc
colon,
Int -> SDoc -> SDoc
nest Int
2 ([SDoc] -> SDoc
vcat [SDoc
err,
String -> SDoc
text String
"in left-hand side:" SDoc -> SDoc -> SDoc
<+> LHsExpr GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr LHsExpr GhcRn
lhs])]
SDoc -> SDoc -> SDoc
$$
String -> SDoc
text String
"LHS must be of form (f e1 .. en) where f is not forall'd"
where
err :: SDoc
err = case HsExpr GhcRn
bad_e of
HsUnboundVar XUnboundVar GhcRn
_ UnboundVar
uv -> RdrName -> SDoc
notInScopeErr (OccName -> RdrName
mkRdrUnqual (UnboundVar -> OccName
unboundVarOcc UnboundVar
uv))
HsExpr GhcRn
_ -> String -> SDoc
text String
"Illegal expression:" SDoc -> SDoc -> SDoc
<+> HsExpr GhcRn -> SDoc
forall a. Outputable a => a -> SDoc
ppr HsExpr GhcRn
bad_e
rnTyClDecls :: [TyClGroup GhcPs]
-> RnM ([TyClGroup GhcRn], FreeVars)
rnTyClDecls :: [TyClGroup GhcPs] -> RnM ([TyClGroup GhcRn], NameSet)
rnTyClDecls [TyClGroup GhcPs]
tycl_ds
= do {
; [(LTyClDecl GhcRn, NameSet)]
tycls_w_fvs <- (LTyClDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LTyClDecl GhcRn, NameSet))
-> [LTyClDecl GhcPs]
-> IOEnv (Env TcGblEnv TcLclEnv) [(LTyClDecl GhcRn, NameSet)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (LTyClDecl GhcPs)
-> TcM (SrcSpanLess (LTyClDecl GhcRn), NameSet))
-> LTyClDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LTyClDecl GhcRn, NameSet)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LTyClDecl GhcPs)
-> TcM (SrcSpanLess (LTyClDecl GhcRn), NameSet)
TyClDecl GhcPs -> RnM (TyClDecl GhcRn, NameSet)
rnTyClDecl) ([TyClGroup GhcPs] -> [LTyClDecl GhcPs]
forall pass. [TyClGroup pass] -> [LTyClDecl pass]
tyClGroupTyClDecls [TyClGroup GhcPs]
tycl_ds)
; let tc_names :: NameSet
tc_names = [Name] -> NameSet
mkNameSet (((LTyClDecl GhcRn, NameSet) -> Name)
-> [(LTyClDecl GhcRn, NameSet)] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (TyClDecl GhcRn -> Name
forall (p :: Pass). TyClDecl (GhcPass p) -> IdP (GhcPass p)
tcdName (TyClDecl GhcRn -> Name)
-> ((LTyClDecl GhcRn, NameSet) -> TyClDecl GhcRn)
-> (LTyClDecl GhcRn, NameSet)
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LTyClDecl GhcRn -> TyClDecl GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc (LTyClDecl GhcRn -> TyClDecl GhcRn)
-> ((LTyClDecl GhcRn, NameSet) -> LTyClDecl GhcRn)
-> (LTyClDecl GhcRn, NameSet)
-> TyClDecl GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LTyClDecl GhcRn, NameSet) -> LTyClDecl GhcRn
forall a b. (a, b) -> a
fst) [(LTyClDecl GhcRn, NameSet)]
tycls_w_fvs)
; [(LStandaloneKindSig GhcRn, NameSet)]
kisigs_w_fvs <- NameSet
-> [LStandaloneKindSig GhcPs]
-> RnM [(LStandaloneKindSig GhcRn, NameSet)]
rnStandaloneKindSignatures NameSet
tc_names ([TyClGroup GhcPs] -> [LStandaloneKindSig GhcPs]
forall pass. [TyClGroup pass] -> [LStandaloneKindSig pass]
tyClGroupKindSigs [TyClGroup GhcPs]
tycl_ds)
; [(LInstDecl GhcRn, NameSet)]
instds_w_fvs <- (LInstDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LInstDecl GhcRn, NameSet))
-> [LInstDecl GhcPs]
-> IOEnv (Env TcGblEnv TcLclEnv) [(LInstDecl GhcRn, NameSet)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (LInstDecl GhcPs)
-> TcM (SrcSpanLess (LInstDecl GhcRn), NameSet))
-> LInstDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LInstDecl GhcRn, NameSet)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LInstDecl GhcPs)
-> TcM (SrcSpanLess (LInstDecl GhcRn), NameSet)
InstDecl GhcPs -> RnM (InstDecl GhcRn, NameSet)
rnSrcInstDecl) ([TyClGroup GhcPs] -> [LInstDecl GhcPs]
forall pass. [TyClGroup pass] -> [LInstDecl pass]
tyClGroupInstDecls [TyClGroup GhcPs]
tycl_ds)
; [LRoleAnnotDecl GhcRn]
role_annots <- NameSet -> [LRoleAnnotDecl GhcPs] -> RnM [LRoleAnnotDecl GhcRn]
rnRoleAnnots NameSet
tc_names ([TyClGroup GhcPs] -> [LRoleAnnotDecl GhcPs]
forall pass. [TyClGroup pass] -> [LRoleAnnotDecl pass]
tyClGroupRoleDecls [TyClGroup GhcPs]
tycl_ds)
; GlobalRdrEnv
rdr_env <- TcRn GlobalRdrEnv
getGlobalRdrEnv
; let tycl_sccs :: [SCC (LTyClDecl GhcRn)]
tycl_sccs = GlobalRdrEnv
-> KindSig_FV_Env
-> [(LTyClDecl GhcRn, NameSet)]
-> [SCC (LTyClDecl GhcRn)]
depAnalTyClDecls GlobalRdrEnv
rdr_env KindSig_FV_Env
kisig_fv_env [(LTyClDecl GhcRn, NameSet)]
tycls_w_fvs
role_annot_env :: RoleAnnotEnv
role_annot_env = [LRoleAnnotDecl GhcRn] -> RoleAnnotEnv
mkRoleAnnotEnv [LRoleAnnotDecl GhcRn]
role_annots
(KindSigEnv
kisig_env, KindSig_FV_Env
kisig_fv_env) = [(LStandaloneKindSig GhcRn, NameSet)]
-> (KindSigEnv, KindSig_FV_Env)
mkKindSig_fv_env [(LStandaloneKindSig GhcRn, NameSet)]
kisigs_w_fvs
inst_ds_map :: [(LInstDecl GhcRn, NameSet)]
inst_ds_map = GlobalRdrEnv
-> NameSet
-> [(LInstDecl GhcRn, NameSet)]
-> [(LInstDecl GhcRn, NameSet)]
mkInstDeclFreeVarsMap GlobalRdrEnv
rdr_env NameSet
tc_names [(LInstDecl GhcRn, NameSet)]
instds_w_fvs
([LInstDecl GhcRn]
init_inst_ds, [(LInstDecl GhcRn, NameSet)]
rest_inst_ds) = [Name]
-> [(LInstDecl GhcRn, NameSet)]
-> ([LInstDecl GhcRn], [(LInstDecl GhcRn, NameSet)])
getInsts [] [(LInstDecl GhcRn, NameSet)]
inst_ds_map
first_group :: [TyClGroup GhcRn]
first_group
| [LInstDecl GhcRn] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [LInstDecl GhcRn]
init_inst_ds = []
| Bool
otherwise = [TyClGroup :: forall pass.
XCTyClGroup pass
-> [LTyClDecl pass]
-> [LRoleAnnotDecl pass]
-> [LStandaloneKindSig pass]
-> [LInstDecl pass]
-> TyClGroup pass
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 }]
([(LInstDecl GhcRn, NameSet)]
final_inst_ds, [TyClGroup GhcRn]
groups)
= ([(LInstDecl GhcRn, NameSet)]
-> SCC (LTyClDecl GhcRn)
-> ([(LInstDecl GhcRn, NameSet)], TyClGroup GhcRn))
-> [(LInstDecl GhcRn, NameSet)]
-> [SCC (LTyClDecl GhcRn)]
-> ([(LInstDecl GhcRn, NameSet)], [TyClGroup GhcRn])
forall (t :: * -> *) a b c.
Traversable t =>
(a -> b -> (a, c)) -> a -> t b -> (a, t c)
mapAccumL (RoleAnnotEnv
-> KindSigEnv
-> [(LInstDecl GhcRn, NameSet)]
-> SCC (LTyClDecl GhcRn)
-> ([(LInstDecl GhcRn, NameSet)], TyClGroup GhcRn)
mk_group RoleAnnotEnv
role_annot_env KindSigEnv
kisig_env) [(LInstDecl GhcRn, NameSet)]
rest_inst_ds [SCC (LTyClDecl GhcRn)]
tycl_sccs
all_fvs :: NameSet
all_fvs = ((LTyClDecl GhcRn, NameSet) -> NameSet -> NameSet)
-> NameSet -> [(LTyClDecl GhcRn, NameSet)] -> NameSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (NameSet -> NameSet -> NameSet
plusFV (NameSet -> NameSet -> NameSet)
-> ((LTyClDecl GhcRn, NameSet) -> NameSet)
-> (LTyClDecl GhcRn, NameSet)
-> NameSet
-> NameSet
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LTyClDecl GhcRn, NameSet) -> NameSet
forall a b. (a, b) -> b
snd) NameSet
emptyFVs [(LTyClDecl GhcRn, NameSet)]
tycls_w_fvs NameSet -> NameSet -> NameSet
`plusFV`
((LInstDecl GhcRn, NameSet) -> NameSet -> NameSet)
-> NameSet -> [(LInstDecl GhcRn, NameSet)] -> NameSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (NameSet -> NameSet -> NameSet
plusFV (NameSet -> NameSet -> NameSet)
-> ((LInstDecl GhcRn, NameSet) -> NameSet)
-> (LInstDecl GhcRn, NameSet)
-> NameSet
-> NameSet
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LInstDecl GhcRn, NameSet) -> NameSet
forall a b. (a, b) -> b
snd) NameSet
emptyFVs [(LInstDecl GhcRn, NameSet)]
instds_w_fvs NameSet -> NameSet -> NameSet
`plusFV`
((LStandaloneKindSig GhcRn, NameSet) -> NameSet -> NameSet)
-> NameSet -> [(LStandaloneKindSig GhcRn, NameSet)] -> NameSet
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (NameSet -> NameSet -> NameSet
plusFV (NameSet -> NameSet -> NameSet)
-> ((LStandaloneKindSig GhcRn, NameSet) -> NameSet)
-> (LStandaloneKindSig GhcRn, NameSet)
-> NameSet
-> NameSet
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LStandaloneKindSig GhcRn, NameSet) -> NameSet
forall a b. (a, b) -> b
snd) NameSet
emptyFVs [(LStandaloneKindSig GhcRn, NameSet)]
kisigs_w_fvs
all_groups :: [TyClGroup GhcRn]
all_groups = [TyClGroup GhcRn]
first_group [TyClGroup GhcRn] -> [TyClGroup GhcRn] -> [TyClGroup GhcRn]
forall a. [a] -> [a] -> [a]
++ [TyClGroup GhcRn]
groups
; MASSERT2( null final_inst_ds, ppr instds_w_fvs $$ ppr inst_ds_map
$$ ppr (flattenSCCs tycl_sccs) $$ ppr final_inst_ds )
; String -> SDoc -> TcRn ()
traceRn String
"rnTycl dependency analysis made groups" ([TyClGroup GhcRn] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [TyClGroup GhcRn]
all_groups)
; ([TyClGroup GhcRn], NameSet) -> RnM ([TyClGroup GhcRn], NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ([TyClGroup GhcRn]
all_groups, NameSet
all_fvs) }
where
mk_group :: RoleAnnotEnv
-> KindSigEnv
-> InstDeclFreeVarsMap
-> SCC (LTyClDecl GhcRn)
-> (InstDeclFreeVarsMap, TyClGroup GhcRn)
mk_group :: RoleAnnotEnv
-> KindSigEnv
-> [(LInstDecl GhcRn, NameSet)]
-> SCC (LTyClDecl GhcRn)
-> ([(LInstDecl GhcRn, NameSet)], TyClGroup GhcRn)
mk_group RoleAnnotEnv
role_env KindSigEnv
kisig_env [(LInstDecl GhcRn, NameSet)]
inst_map SCC (LTyClDecl GhcRn)
scc
= ([(LInstDecl GhcRn, NameSet)]
inst_map', TyClGroup GhcRn
group)
where
tycl_ds :: [LTyClDecl GhcRn]
tycl_ds = SCC (LTyClDecl GhcRn) -> [LTyClDecl GhcRn]
forall vertex. SCC vertex -> [vertex]
flattenSCC SCC (LTyClDecl GhcRn)
scc
bndrs :: [Name]
bndrs = (LTyClDecl GhcRn -> Name) -> [LTyClDecl GhcRn] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (TyClDecl GhcRn -> Name
forall (p :: Pass). TyClDecl (GhcPass p) -> IdP (GhcPass p)
tcdName (TyClDecl GhcRn -> Name)
-> (LTyClDecl GhcRn -> TyClDecl GhcRn) -> LTyClDecl GhcRn -> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LTyClDecl GhcRn -> TyClDecl GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc) [LTyClDecl 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, [(LInstDecl GhcRn, NameSet)]
inst_map') = [Name]
-> [(LInstDecl GhcRn, NameSet)]
-> ([LInstDecl GhcRn], [(LInstDecl GhcRn, NameSet)])
getInsts [Name]
bndrs [(LInstDecl GhcRn, NameSet)]
inst_map
group :: TyClGroup GhcRn
group = TyClGroup :: forall pass.
XCTyClGroup pass
-> [LTyClDecl pass]
-> [LRoleAnnotDecl pass]
-> [LStandaloneKindSig pass]
-> [LInstDecl pass]
-> TyClGroup pass
TyClGroup { group_ext :: XCTyClGroup GhcRn
group_ext = XCTyClGroup GhcRn
NoExtField
noExtField
, group_tyclds :: [LTyClDecl GhcRn]
group_tyclds = [LTyClDecl 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 -> NameSet
lookupKindSig_FV_Env (KindSig_FV_Env NameEnv NameSet
e) Name
name
= NameSet -> Maybe NameSet -> NameSet
forall a. a -> Maybe a -> a
fromMaybe NameSet
emptyFVs (NameEnv NameSet -> Name -> Maybe NameSet
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv NameEnv NameSet
e Name
name)
type KindSigEnv = NameEnv (LStandaloneKindSig GhcRn)
mkKindSig_fv_env :: [(LStandaloneKindSig GhcRn, FreeVars)] -> (KindSigEnv, KindSig_FV_Env)
mkKindSig_fv_env :: [(LStandaloneKindSig GhcRn, NameSet)]
-> (KindSigEnv, KindSig_FV_Env)
mkKindSig_fv_env [(LStandaloneKindSig GhcRn, NameSet)]
kisigs_w_fvs = (KindSigEnv
kisig_env, KindSig_FV_Env
kisig_fv_env)
where
kisig_env :: KindSigEnv
kisig_env = ((LStandaloneKindSig GhcRn, NameSet) -> LStandaloneKindSig GhcRn)
-> NameEnv (LStandaloneKindSig GhcRn, NameSet) -> KindSigEnv
forall elt1 elt2. (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
mapNameEnv (LStandaloneKindSig GhcRn, NameSet) -> LStandaloneKindSig GhcRn
forall a b. (a, b) -> a
fst NameEnv (LStandaloneKindSig GhcRn, NameSet)
compound_env
kisig_fv_env :: KindSig_FV_Env
kisig_fv_env = NameEnv NameSet -> KindSig_FV_Env
KindSig_FV_Env (((LStandaloneKindSig GhcRn, NameSet) -> NameSet)
-> NameEnv (LStandaloneKindSig GhcRn, NameSet) -> NameEnv NameSet
forall elt1 elt2. (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
mapNameEnv (LStandaloneKindSig GhcRn, NameSet) -> NameSet
forall a b. (a, b) -> b
snd NameEnv (LStandaloneKindSig GhcRn, NameSet)
compound_env)
NameEnv (LStandaloneKindSig GhcRn, NameSet)
compound_env :: NameEnv (LStandaloneKindSig GhcRn, FreeVars)
= ((LStandaloneKindSig GhcRn, NameSet) -> Name)
-> [(LStandaloneKindSig GhcRn, NameSet)]
-> NameEnv (LStandaloneKindSig GhcRn, NameSet)
forall a. (a -> Name) -> [a] -> NameEnv a
mkNameEnvWith (StandaloneKindSig GhcRn -> Name
forall (p :: Pass).
StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
standaloneKindSigName (StandaloneKindSig GhcRn -> Name)
-> ((LStandaloneKindSig GhcRn, NameSet) -> StandaloneKindSig GhcRn)
-> (LStandaloneKindSig GhcRn, NameSet)
-> Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LStandaloneKindSig GhcRn -> StandaloneKindSig GhcRn
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc (LStandaloneKindSig GhcRn -> StandaloneKindSig GhcRn)
-> ((LStandaloneKindSig GhcRn, NameSet)
-> LStandaloneKindSig GhcRn)
-> (LStandaloneKindSig GhcRn, NameSet)
-> StandaloneKindSig GhcRn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (LStandaloneKindSig GhcRn, NameSet) -> LStandaloneKindSig GhcRn
forall a b. (a, b) -> a
fst) [(LStandaloneKindSig GhcRn, NameSet)]
kisigs_w_fvs
getKindSigs :: [Name] -> KindSigEnv -> [LStandaloneKindSig GhcRn]
getKindSigs :: [Name] -> KindSigEnv -> [LStandaloneKindSig GhcRn]
getKindSigs [Name]
bndrs KindSigEnv
kisig_env = (Name -> Maybe (LStandaloneKindSig GhcRn))
-> [Name] -> [LStandaloneKindSig GhcRn]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (KindSigEnv -> Name -> Maybe (LStandaloneKindSig GhcRn)
forall a. NameEnv a -> Name -> Maybe a
lookupNameEnv KindSigEnv
kisig_env) [Name]
bndrs
rnStandaloneKindSignatures
:: NameSet
-> [LStandaloneKindSig GhcPs]
-> RnM [(LStandaloneKindSig GhcRn, FreeVars)]
rnStandaloneKindSignatures :: NameSet
-> [LStandaloneKindSig GhcPs]
-> RnM [(LStandaloneKindSig GhcRn, NameSet)]
rnStandaloneKindSignatures NameSet
tc_names [LStandaloneKindSig GhcPs]
kisigs
= do { let ([LStandaloneKindSig GhcPs]
no_dups, [NonEmpty (LStandaloneKindSig GhcPs)]
dup_kisigs) = (LStandaloneKindSig GhcPs -> LStandaloneKindSig GhcPs -> Ordering)
-> [LStandaloneKindSig GhcPs]
-> ([LStandaloneKindSig GhcPs],
[NonEmpty (LStandaloneKindSig GhcPs)])
forall a. (a -> a -> Ordering) -> [a] -> ([a], [NonEmpty a])
removeDups (IdP GhcPs -> IdP GhcPs -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (IdP GhcPs -> IdP GhcPs -> Ordering)
-> (LStandaloneKindSig GhcPs -> IdP GhcPs)
-> LStandaloneKindSig GhcPs
-> LStandaloneKindSig GhcPs
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` LStandaloneKindSig GhcPs -> IdP GhcPs
get_name) [LStandaloneKindSig GhcPs]
kisigs
get_name :: LStandaloneKindSig GhcPs -> IdP GhcPs
get_name = StandaloneKindSig GhcPs -> IdP GhcPs
forall (p :: Pass).
StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
standaloneKindSigName (StandaloneKindSig GhcPs -> IdP GhcPs)
-> (LStandaloneKindSig GhcPs -> StandaloneKindSig GhcPs)
-> LStandaloneKindSig GhcPs
-> IdP GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LStandaloneKindSig GhcPs -> StandaloneKindSig GhcPs
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc
; (NonEmpty (LStandaloneKindSig GhcPs) -> TcRn ())
-> [NonEmpty (LStandaloneKindSig GhcPs)] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ NonEmpty (LStandaloneKindSig GhcPs) -> TcRn ()
dupKindSig_Err [NonEmpty (LStandaloneKindSig GhcPs)]
dup_kisigs
; (LStandaloneKindSig GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (LStandaloneKindSig GhcRn, NameSet))
-> [LStandaloneKindSig GhcPs]
-> RnM [(LStandaloneKindSig GhcRn, NameSet)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (LStandaloneKindSig GhcPs)
-> TcM (SrcSpanLess (LStandaloneKindSig GhcRn), NameSet))
-> LStandaloneKindSig GhcPs
-> IOEnv
(Env TcGblEnv TcLclEnv) (LStandaloneKindSig GhcRn, NameSet)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM (NameSet
-> StandaloneKindSig GhcPs
-> RnM (StandaloneKindSig GhcRn, NameSet)
rnStandaloneKindSignature NameSet
tc_names)) [LStandaloneKindSig GhcPs]
no_dups
}
rnStandaloneKindSignature
:: NameSet
-> StandaloneKindSig GhcPs
-> RnM (StandaloneKindSig GhcRn, FreeVars)
rnStandaloneKindSignature :: NameSet
-> StandaloneKindSig GhcPs
-> RnM (StandaloneKindSig GhcRn, NameSet)
rnStandaloneKindSignature NameSet
tc_names (StandaloneKindSig XStandaloneKindSig GhcPs
_ Located (IdP GhcPs)
v LHsSigType GhcPs
ki)
= do { Bool
standalone_ki_sig_ok <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.StandaloneKindSignatures
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
standalone_ki_sig_ok (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ SDoc -> TcRn ()
addErr SDoc
standaloneKiSigErr
; Located Name
new_v <- HsSigCtxt
-> SDoc -> GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupSigCtxtOccRn (NameSet -> HsSigCtxt
TopSigCtxt NameSet
tc_names) (String -> SDoc
text String
"standalone kind signature") GenLocated SrcSpan RdrName
Located (IdP GhcPs)
v
; let doc :: HsDocContext
doc = SDoc -> HsDocContext
StandaloneKindSigCtx (GenLocated SrcSpan RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenLocated SrcSpan RdrName
Located (IdP GhcPs)
v)
; (LHsSigType GhcRn
new_ki, NameSet
fvs) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, NameSet)
rnHsSigType HsDocContext
doc TypeOrKind
KindLevel LHsSigType GhcPs
ki
; (StandaloneKindSig GhcRn, NameSet)
-> RnM (StandaloneKindSig GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XStandaloneKindSig GhcRn
-> Located (IdP GhcRn)
-> LHsSigType GhcRn
-> StandaloneKindSig GhcRn
forall pass.
XStandaloneKindSig pass
-> Located (IdP pass) -> LHsSigType pass -> StandaloneKindSig pass
StandaloneKindSig XStandaloneKindSig GhcRn
NoExtField
noExtField Located Name
Located (IdP GhcRn)
new_v LHsSigType GhcRn
new_ki, NameSet
fvs)
}
where
standaloneKiSigErr :: SDoc
standaloneKiSigErr :: SDoc
standaloneKiSigErr =
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Illegal standalone kind signature")
Int
2 (String -> SDoc
text String
"Did you mean to enable StandaloneKindSignatures?")
rnStandaloneKindSignature NameSet
_ (XStandaloneKindSig XXStandaloneKindSig GhcPs
nec) = NoExtCon -> RnM (StandaloneKindSig GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXStandaloneKindSig GhcPs
NoExtCon
nec
depAnalTyClDecls :: GlobalRdrEnv
-> KindSig_FV_Env
-> [(LTyClDecl GhcRn, FreeVars)]
-> [SCC (LTyClDecl GhcRn)]
depAnalTyClDecls :: GlobalRdrEnv
-> KindSig_FV_Env
-> [(LTyClDecl GhcRn, NameSet)]
-> [SCC (LTyClDecl GhcRn)]
depAnalTyClDecls GlobalRdrEnv
rdr_env KindSig_FV_Env
kisig_fv_env [(LTyClDecl GhcRn, NameSet)]
ds_w_fvs
= [Node Name (LTyClDecl GhcRn)] -> [SCC (LTyClDecl GhcRn)]
forall key payload.
Uniquable key =>
[Node key payload] -> [SCC payload]
stronglyConnCompFromEdgedVerticesUniq [Node Name (LTyClDecl GhcRn)]
edges
where
edges :: [ Node Name (LTyClDecl GhcRn) ]
edges :: [Node Name (LTyClDecl GhcRn)]
edges = [ LTyClDecl GhcRn -> Name -> [Name] -> Node Name (LTyClDecl GhcRn)
forall key payload. payload -> key -> [key] -> Node key payload
DigraphNode LTyClDecl GhcRn
d Name
IdP GhcRn
name ((Name -> Name) -> [Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (GlobalRdrEnv -> Name -> Name
getParent GlobalRdrEnv
rdr_env) (NameSet -> [Name]
forall elt. UniqSet elt -> [elt]
nonDetEltsUniqSet NameSet
deps))
| (LTyClDecl GhcRn
d, NameSet
fvs) <- [(LTyClDecl GhcRn, NameSet)]
ds_w_fvs,
let { name :: IdP GhcRn
name = TyClDecl GhcRn -> IdP GhcRn
forall (p :: Pass). TyClDecl (GhcPass p) -> IdP (GhcPass p)
tcdName (LTyClDecl GhcRn -> SrcSpanLess (LTyClDecl GhcRn)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LTyClDecl GhcRn
d)
; kisig_fvs :: NameSet
kisig_fvs = KindSig_FV_Env -> Name -> NameSet
lookupKindSig_FV_Env KindSig_FV_Env
kisig_fv_env Name
IdP GhcRn
name
; deps :: NameSet
deps = NameSet
fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
kisig_fvs
}
]
toParents :: GlobalRdrEnv -> NameSet -> NameSet
toParents :: GlobalRdrEnv -> NameSet -> NameSet
toParents GlobalRdrEnv
rdr_env NameSet
ns
= (Name -> NameSet -> NameSet) -> NameSet -> NameSet -> NameSet
forall elt a. (elt -> a -> a) -> a -> UniqSet elt -> a
nonDetFoldUniqSet Name -> NameSet -> NameSet
add NameSet
emptyNameSet NameSet
ns
where
add :: Name -> NameSet -> NameSet
add Name
n NameSet
s = NameSet -> Name -> NameSet
extendNameSet NameSet
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 GlobalRdrElt
lookupGRE_Name GlobalRdrEnv
rdr_env Name
n of
Just GlobalRdrElt
gre -> case GlobalRdrElt -> Parent
gre_par GlobalRdrElt
gre of
ParentIs { par_is :: Parent -> Name
par_is = Name
p } -> Name
p
FldParent { par_is :: Parent -> Name
par_is = Name
p } -> Name
p
Parent
_ -> Name
n
Maybe GlobalRdrElt
Nothing -> Name
n
rnRoleAnnots :: NameSet
-> [LRoleAnnotDecl GhcPs]
-> RnM [LRoleAnnotDecl GhcRn]
rnRoleAnnots :: NameSet -> [LRoleAnnotDecl GhcPs] -> RnM [LRoleAnnotDecl GhcRn]
rnRoleAnnots NameSet
tc_names [LRoleAnnotDecl GhcPs]
role_annots
= do {
let ([LRoleAnnotDecl GhcPs]
no_dups, [NonEmpty (LRoleAnnotDecl GhcPs)]
dup_annots) = (LRoleAnnotDecl GhcPs -> LRoleAnnotDecl GhcPs -> Ordering)
-> [LRoleAnnotDecl GhcPs]
-> ([LRoleAnnotDecl GhcPs], [NonEmpty (LRoleAnnotDecl GhcPs)])
forall a. (a -> a -> Ordering) -> [a] -> ([a], [NonEmpty a])
removeDups (IdP GhcPs -> IdP GhcPs -> Ordering
forall a. Ord a => a -> a -> Ordering
compare (IdP GhcPs -> IdP GhcPs -> Ordering)
-> (LRoleAnnotDecl GhcPs -> IdP GhcPs)
-> LRoleAnnotDecl GhcPs
-> LRoleAnnotDecl GhcPs
-> Ordering
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
`on` LRoleAnnotDecl GhcPs -> IdP GhcPs
get_name) [LRoleAnnotDecl GhcPs]
role_annots
get_name :: LRoleAnnotDecl GhcPs -> IdP GhcPs
get_name = RoleAnnotDecl GhcPs -> IdP GhcPs
forall (p :: Pass). RoleAnnotDecl (GhcPass p) -> IdP (GhcPass p)
roleAnnotDeclName (RoleAnnotDecl GhcPs -> IdP GhcPs)
-> (LRoleAnnotDecl GhcPs -> RoleAnnotDecl GhcPs)
-> LRoleAnnotDecl GhcPs
-> IdP GhcPs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. LRoleAnnotDecl GhcPs -> RoleAnnotDecl GhcPs
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc
; (NonEmpty (LRoleAnnotDecl GhcPs) -> TcRn ())
-> [NonEmpty (LRoleAnnotDecl GhcPs)] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ NonEmpty (LRoleAnnotDecl GhcPs) -> TcRn ()
dupRoleAnnotErr [NonEmpty (LRoleAnnotDecl GhcPs)]
dup_annots
; (LRoleAnnotDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LRoleAnnotDecl GhcRn))
-> [LRoleAnnotDecl GhcPs] -> RnM [LRoleAnnotDecl GhcRn]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (LRoleAnnotDecl GhcPs)
-> TcM (SrcSpanLess (LRoleAnnotDecl GhcRn)))
-> LRoleAnnotDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LRoleAnnotDecl GhcRn)
forall a b.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b)) -> a -> TcM b
wrapLocM SrcSpanLess (LRoleAnnotDecl GhcPs)
-> TcM (SrcSpanLess (LRoleAnnotDecl GhcRn))
RoleAnnotDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (RoleAnnotDecl GhcRn)
rn_role_annot1) [LRoleAnnotDecl GhcPs]
no_dups }
where
rn_role_annot1 :: RoleAnnotDecl GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (RoleAnnotDecl GhcRn)
rn_role_annot1 (RoleAnnotDecl XCRoleAnnotDecl GhcPs
_ Located (IdP GhcPs)
tycon [Located (Maybe Role)]
roles)
= do {
Located Name
tycon' <- HsSigCtxt
-> SDoc -> GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupSigCtxtOccRn (NameSet -> HsSigCtxt
RoleAnnotCtxt NameSet
tc_names)
(String -> SDoc
text String
"role annotation")
GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; RoleAnnotDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (RoleAnnotDecl GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (RoleAnnotDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (RoleAnnotDecl GhcRn))
-> RoleAnnotDecl GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (RoleAnnotDecl GhcRn)
forall a b. (a -> b) -> a -> b
$ XCRoleAnnotDecl GhcRn
-> Located (IdP GhcRn)
-> [Located (Maybe Role)]
-> RoleAnnotDecl GhcRn
forall pass.
XCRoleAnnotDecl pass
-> Located (IdP pass)
-> [Located (Maybe Role)]
-> RoleAnnotDecl pass
RoleAnnotDecl XCRoleAnnotDecl GhcRn
NoExtField
noExtField Located Name
Located (IdP GhcRn)
tycon' [Located (Maybe Role)]
roles }
rn_role_annot1 (XRoleAnnotDecl XXRoleAnnotDecl GhcPs
nec) = NoExtCon -> IOEnv (Env TcGblEnv TcLclEnv) (RoleAnnotDecl GhcRn)
forall a. NoExtCon -> a
noExtCon XXRoleAnnotDecl GhcPs
NoExtCon
nec
dupRoleAnnotErr :: NonEmpty (LRoleAnnotDecl GhcPs) -> RnM ()
dupRoleAnnotErr :: NonEmpty (LRoleAnnotDecl GhcPs) -> TcRn ()
dupRoleAnnotErr NonEmpty (LRoleAnnotDecl GhcPs)
list
= SrcSpan -> SDoc -> TcRn ()
addErrAt SrcSpan
loc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Duplicate role annotations for" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr (RdrName -> SDoc) -> RdrName -> SDoc
forall a b. (a -> b) -> a -> b
$ RoleAnnotDecl GhcPs -> IdP GhcPs
forall (p :: Pass). RoleAnnotDecl (GhcPass p) -> IdP (GhcPass p)
roleAnnotDeclName SrcSpanLess (LRoleAnnotDecl GhcPs)
RoleAnnotDecl GhcPs
first_decl) SDoc -> SDoc -> SDoc
<> SDoc
colon)
Int
2 ([SDoc] -> SDoc
vcat ([SDoc] -> SDoc) -> [SDoc] -> SDoc
forall a b. (a -> b) -> a -> b
$ (LRoleAnnotDecl GhcPs -> SDoc) -> [LRoleAnnotDecl GhcPs] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map LRoleAnnotDecl GhcPs -> SDoc
forall a. (HasSrcSpan a, Outputable (SrcSpanLess a)) => a -> SDoc
pp_role_annot ([LRoleAnnotDecl GhcPs] -> [SDoc])
-> [LRoleAnnotDecl GhcPs] -> [SDoc]
forall a b. (a -> b) -> a -> b
$ NonEmpty (LRoleAnnotDecl GhcPs) -> [LRoleAnnotDecl GhcPs]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty (LRoleAnnotDecl GhcPs)
sorted_list)
where
sorted_list :: NonEmpty (LRoleAnnotDecl GhcPs)
sorted_list = (LRoleAnnotDecl GhcPs -> LRoleAnnotDecl GhcPs -> Ordering)
-> NonEmpty (LRoleAnnotDecl GhcPs)
-> NonEmpty (LRoleAnnotDecl GhcPs)
forall a. (a -> a -> Ordering) -> NonEmpty a -> NonEmpty a
NE.sortBy LRoleAnnotDecl GhcPs -> LRoleAnnotDecl GhcPs -> Ordering
forall a a. (HasSrcSpan a, HasSrcSpan a) => a -> a -> Ordering
cmp_annot NonEmpty (LRoleAnnotDecl GhcPs)
list
((LRoleAnnotDecl GhcPs
-> Located (SrcSpanLess (LRoleAnnotDecl GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LRoleAnnotDecl GhcPs)
first_decl) :| [LRoleAnnotDecl GhcPs]
_) = NonEmpty (LRoleAnnotDecl GhcPs)
sorted_list
pp_role_annot :: a -> SDoc
pp_role_annot (a -> Located (SrcSpanLess a)
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess a
decl) = SDoc -> Int -> SDoc -> SDoc
hang (SrcSpanLess a -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpanLess a
decl)
Int
4 (String -> SDoc
text String
"-- written at" SDoc -> SDoc -> SDoc
<+> SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
loc)
cmp_annot :: a -> a -> Ordering
cmp_annot (a -> Located (SrcSpanLess a)
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc1 SrcSpanLess a
_) (a -> Located (SrcSpanLess a)
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc2 SrcSpanLess a
_) = SrcSpan
loc1 SrcSpan -> SrcSpan -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` SrcSpan
loc2
dupKindSig_Err :: NonEmpty (LStandaloneKindSig GhcPs) -> RnM ()
dupKindSig_Err :: NonEmpty (LStandaloneKindSig GhcPs) -> TcRn ()
dupKindSig_Err NonEmpty (LStandaloneKindSig GhcPs)
list
= SrcSpan -> SDoc -> TcRn ()
addErrAt SrcSpan
loc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Duplicate standalone kind signatures for" SDoc -> SDoc -> SDoc
<+>
SDoc -> SDoc
quotes (RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr (RdrName -> SDoc) -> RdrName -> SDoc
forall a b. (a -> b) -> a -> b
$ StandaloneKindSig GhcPs -> IdP GhcPs
forall (p :: Pass).
StandaloneKindSig (GhcPass p) -> IdP (GhcPass p)
standaloneKindSigName SrcSpanLess (LStandaloneKindSig GhcPs)
StandaloneKindSig GhcPs
first_decl) SDoc -> SDoc -> SDoc
<> SDoc
colon)
Int
2 ([SDoc] -> SDoc
vcat ([SDoc] -> SDoc) -> [SDoc] -> SDoc
forall a b. (a -> b) -> a -> b
$ (LStandaloneKindSig GhcPs -> SDoc)
-> [LStandaloneKindSig GhcPs] -> [SDoc]
forall a b. (a -> b) -> [a] -> [b]
map LStandaloneKindSig GhcPs -> SDoc
forall a. (HasSrcSpan a, Outputable (SrcSpanLess a)) => a -> SDoc
pp_kisig ([LStandaloneKindSig GhcPs] -> [SDoc])
-> [LStandaloneKindSig GhcPs] -> [SDoc]
forall a b. (a -> b) -> a -> b
$ NonEmpty (LStandaloneKindSig GhcPs) -> [LStandaloneKindSig GhcPs]
forall a. NonEmpty a -> [a]
NE.toList NonEmpty (LStandaloneKindSig GhcPs)
sorted_list)
where
sorted_list :: NonEmpty (LStandaloneKindSig GhcPs)
sorted_list = (LStandaloneKindSig GhcPs -> LStandaloneKindSig GhcPs -> Ordering)
-> NonEmpty (LStandaloneKindSig GhcPs)
-> NonEmpty (LStandaloneKindSig GhcPs)
forall a. (a -> a -> Ordering) -> NonEmpty a -> NonEmpty a
NE.sortBy LStandaloneKindSig GhcPs -> LStandaloneKindSig GhcPs -> Ordering
forall a a. (HasSrcSpan a, HasSrcSpan a) => a -> a -> Ordering
cmp_loc NonEmpty (LStandaloneKindSig GhcPs)
list
((LStandaloneKindSig GhcPs
-> Located (SrcSpanLess (LStandaloneKindSig GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LStandaloneKindSig GhcPs)
first_decl) :| [LStandaloneKindSig GhcPs]
_) = NonEmpty (LStandaloneKindSig GhcPs)
sorted_list
pp_kisig :: a -> SDoc
pp_kisig (a -> Located (SrcSpanLess a)
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess a
decl) =
SDoc -> Int -> SDoc -> SDoc
hang (SrcSpanLess a -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpanLess a
decl) Int
4 (String -> SDoc
text String
"-- written at" SDoc -> SDoc -> SDoc
<+> SrcSpan -> SDoc
forall a. Outputable a => a -> SDoc
ppr SrcSpan
loc)
cmp_loc :: a -> a -> Ordering
cmp_loc (a -> Located (SrcSpanLess a)
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc1 SrcSpanLess a
_) (a -> Located (SrcSpanLess a)
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc2 SrcSpanLess a
_) = SrcSpan
loc1 SrcSpan -> SrcSpan -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` SrcSpan
loc2
type InstDeclFreeVarsMap = [(LInstDecl GhcRn, FreeVars)]
mkInstDeclFreeVarsMap :: GlobalRdrEnv
-> NameSet
-> [(LInstDecl GhcRn, FreeVars)]
-> InstDeclFreeVarsMap
mkInstDeclFreeVarsMap :: GlobalRdrEnv
-> NameSet
-> [(LInstDecl GhcRn, NameSet)]
-> [(LInstDecl GhcRn, NameSet)]
mkInstDeclFreeVarsMap GlobalRdrEnv
rdr_env NameSet
tycl_bndrs [(LInstDecl GhcRn, NameSet)]
inst_ds_fvs
= [ (LInstDecl GhcRn
inst_decl, GlobalRdrEnv -> NameSet -> NameSet
toParents GlobalRdrEnv
rdr_env NameSet
fvs NameSet -> NameSet -> NameSet
`intersectFVs` NameSet
tycl_bndrs)
| (LInstDecl GhcRn
inst_decl, NameSet
fvs) <- [(LInstDecl GhcRn, NameSet)]
inst_ds_fvs ]
getInsts :: [Name] -> InstDeclFreeVarsMap
-> ([LInstDecl GhcRn], InstDeclFreeVarsMap)
getInsts :: [Name]
-> [(LInstDecl GhcRn, NameSet)]
-> ([LInstDecl GhcRn], [(LInstDecl GhcRn, NameSet)])
getInsts [Name]
bndrs [(LInstDecl GhcRn, NameSet)]
inst_decl_map
= ((LInstDecl GhcRn, NameSet)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, NameSet))
-> [(LInstDecl GhcRn, NameSet)]
-> ([LInstDecl GhcRn], [(LInstDecl GhcRn, NameSet)])
forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
partitionWith (LInstDecl GhcRn, NameSet)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, NameSet)
pick_me [(LInstDecl GhcRn, NameSet)]
inst_decl_map
where
pick_me :: (LInstDecl GhcRn, FreeVars)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, FreeVars)
pick_me :: (LInstDecl GhcRn, NameSet)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, NameSet)
pick_me (LInstDecl GhcRn
decl, NameSet
fvs)
| NameSet -> Bool
isEmptyNameSet NameSet
depleted_fvs = LInstDecl GhcRn
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, NameSet)
forall a b. a -> Either a b
Left LInstDecl GhcRn
decl
| Bool
otherwise = (LInstDecl GhcRn, NameSet)
-> Either (LInstDecl GhcRn) (LInstDecl GhcRn, NameSet)
forall a b. b -> Either a b
Right (LInstDecl GhcRn
decl, NameSet
depleted_fvs)
where
depleted_fvs :: NameSet
depleted_fvs = [Name] -> NameSet -> NameSet
delFVs [Name]
bndrs NameSet
fvs
rnTyClDecl :: TyClDecl GhcPs
-> RnM (TyClDecl GhcRn, FreeVars)
rnTyClDecl :: TyClDecl GhcPs -> RnM (TyClDecl GhcRn, NameSet)
rnTyClDecl (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
tcdFam = FamilyDecl GhcPs
fam })
= do { (FamilyDecl GhcRn
fam', NameSet
fvs) <- Maybe Name -> FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, NameSet)
rnFamDecl Maybe Name
forall a. Maybe a
Nothing FamilyDecl GhcPs
fam
; (TyClDecl GhcRn, NameSet) -> RnM (TyClDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XFamDecl GhcRn -> FamilyDecl GhcRn -> TyClDecl GhcRn
forall pass. XFamDecl pass -> FamilyDecl pass -> TyClDecl pass
FamDecl XFamDecl GhcRn
NoExtField
noExtField FamilyDecl GhcRn
fam', NameSet
fvs) }
rnTyClDecl (SynDecl { tcdLName :: forall pass. TyClDecl pass -> Located (IdP pass)
tcdLName = Located (IdP 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 { Located Name
tycon' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; let kvs :: [GenLocated SrcSpan RdrName]
kvs = LHsType GhcPs -> [GenLocated SrcSpan RdrName]
extractHsTyRdrTyVarsKindVars LHsType GhcPs
rhs
doc :: HsDocContext
doc = GenLocated SrcSpan RdrName -> HsDocContext
TySynCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; String -> SDoc -> TcRn ()
traceRn String
"rntycl-ty" (GenLocated SrcSpan RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon SDoc -> SDoc -> SDoc
<+> [GenLocated SrcSpan RdrName] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated SrcSpan RdrName]
kvs)
; HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn -> Bool -> RnM (TyClDecl GhcRn, NameSet))
-> RnM (TyClDecl GhcRn, NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn -> Bool -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindHsQTyVars HsDocContext
doc Maybe SDoc
forall a. Maybe a
Nothing Maybe Any
forall a. Maybe a
Nothing [GenLocated SrcSpan RdrName]
kvs LHsQTyVars GhcPs
tyvars ((LHsQTyVars GhcRn -> Bool -> RnM (TyClDecl GhcRn, NameSet))
-> RnM (TyClDecl GhcRn, NameSet))
-> (LHsQTyVars GhcRn -> Bool -> RnM (TyClDecl GhcRn, NameSet))
-> RnM (TyClDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ LHsQTyVars GhcRn
tyvars' Bool
_ ->
do { (LHsType GhcRn
rhs', NameSet
fvs) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnTySyn HsDocContext
doc LHsType GhcPs
rhs
; (TyClDecl GhcRn, NameSet) -> RnM (TyClDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (SynDecl :: forall pass.
XSynDecl pass
-> Located (IdP pass)
-> LHsQTyVars pass
-> LexicalFixity
-> LHsType pass
-> TyClDecl pass
SynDecl { tcdLName :: Located (IdP GhcRn)
tcdLName = Located Name
Located (IdP GhcRn)
tycon', tcdTyVars :: LHsQTyVars GhcRn
tcdTyVars = LHsQTyVars GhcRn
tyvars'
, tcdFixity :: LexicalFixity
tcdFixity = LexicalFixity
fixity
, tcdRhs :: LHsType GhcRn
tcdRhs = LHsType GhcRn
rhs', tcdSExt :: XSynDecl GhcRn
tcdSExt = NameSet
XSynDecl GhcRn
fvs }, NameSet
fvs) } }
rnTyClDecl (DataDecl XDataDecl GhcPs
_ Located (IdP GhcPs)
_ LHsQTyVars GhcPs
_ LexicalFixity
_ (XHsDataDefn XXHsDataDefn GhcPs
nec)) = NoExtCon -> RnM (TyClDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXHsDataDefn GhcPs
NoExtCon
nec
rnTyClDecl (DataDecl
{ tcdLName :: forall pass. TyClDecl pass -> Located (IdP pass)
tcdLName = Located (IdP 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_ND :: forall pass. HsDataDefn pass -> NewOrData
dd_ND = NewOrData
new_or_data
, dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_kindSig = Maybe (LHsType GhcPs)
kind_sig} })
= do { Located Name
tycon' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; let kvs :: [GenLocated SrcSpan RdrName]
kvs = HsDataDefn GhcPs -> [GenLocated SrcSpan RdrName]
extractDataDefnKindVars HsDataDefn GhcPs
defn
doc :: HsDocContext
doc = GenLocated SrcSpan RdrName -> HsDocContext
TyDataCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; String -> SDoc -> TcRn ()
traceRn String
"rntycl-data" (GenLocated SrcSpan RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon SDoc -> SDoc -> SDoc
<+> [GenLocated SrcSpan RdrName] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated SrcSpan RdrName]
kvs)
; HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn -> Bool -> RnM (TyClDecl GhcRn, NameSet))
-> RnM (TyClDecl GhcRn, NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn -> Bool -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindHsQTyVars HsDocContext
doc Maybe SDoc
forall a. Maybe a
Nothing Maybe Any
forall a. Maybe a
Nothing [GenLocated SrcSpan RdrName]
kvs LHsQTyVars GhcPs
tyvars ((LHsQTyVars GhcRn -> Bool -> RnM (TyClDecl GhcRn, NameSet))
-> RnM (TyClDecl GhcRn, NameSet))
-> (LHsQTyVars GhcRn -> Bool -> RnM (TyClDecl GhcRn, NameSet))
-> RnM (TyClDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ LHsQTyVars GhcRn
tyvars' Bool
no_rhs_kvs ->
do { (HsDataDefn GhcRn
defn', NameSet
fvs) <- HsDocContext -> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, NameSet)
rnDataDefn HsDocContext
doc HsDataDefn GhcPs
defn
; Bool
cusk <- LHsQTyVars GhcRn
-> NewOrData -> Bool -> Maybe (LHsType GhcPs) -> TcRn Bool
forall pass pass'.
LHsQTyVars pass
-> NewOrData -> Bool -> Maybe (LHsKind pass') -> TcRn Bool
data_decl_has_cusk LHsQTyVars GhcRn
tyvars' NewOrData
new_or_data Bool
no_rhs_kvs Maybe (LHsType GhcPs)
kind_sig
; let rn_info :: DataDeclRn
rn_info = DataDeclRn :: Bool -> NameSet -> DataDeclRn
DataDeclRn { tcdDataCusk :: Bool
tcdDataCusk = Bool
cusk
, tcdFVs :: NameSet
tcdFVs = NameSet
fvs }
; String -> SDoc -> TcRn ()
traceRn String
"rndata" (GenLocated SrcSpan RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon SDoc -> SDoc -> SDoc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
cusk SDoc -> SDoc -> SDoc
<+> Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
no_rhs_kvs)
; (TyClDecl GhcRn, NameSet) -> RnM (TyClDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (DataDecl :: forall pass.
XDataDecl pass
-> Located (IdP pass)
-> LHsQTyVars pass
-> LexicalFixity
-> HsDataDefn pass
-> TyClDecl pass
DataDecl { tcdLName :: Located (IdP GhcRn)
tcdLName = Located Name
Located (IdP GhcRn)
tycon'
, tcdTyVars :: LHsQTyVars GhcRn
tcdTyVars = LHsQTyVars GhcRn
tyvars'
, tcdFixity :: LexicalFixity
tcdFixity = LexicalFixity
fixity
, tcdDataDefn :: HsDataDefn GhcRn
tcdDataDefn = HsDataDefn GhcRn
defn'
, tcdDExt :: XDataDecl GhcRn
tcdDExt = XDataDecl GhcRn
DataDeclRn
rn_info }, NameSet
fvs) } }
rnTyClDecl (ClassDecl { tcdCtxt :: forall pass. TyClDecl pass -> LHsContext pass
tcdCtxt = LHsContext GhcPs
context, tcdLName :: forall pass. TyClDecl pass -> Located (IdP pass)
tcdLName = Located (IdP 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]
tcdDocs = [LDocDecl]
docs})
= do { Located Name
lcls' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
lcls
; let cls' :: SrcSpanLess (Located Name)
cls' = Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
lcls'
kvs :: [a]
kvs = []
; ((LHsQTyVars GhcRn
tyvars', LHsContext GhcRn
context', [Located (FunDep (Located Name))]
fds', [LFamilyDecl GhcRn]
ats'), NameSet
stuff_fvs)
<- HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn
-> Bool
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet))
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn -> Bool -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindHsQTyVars HsDocContext
cls_doc Maybe SDoc
forall a. Maybe a
Nothing Maybe Any
forall a. Maybe a
Nothing [GenLocated SrcSpan RdrName]
forall a. [a]
kvs LHsQTyVars GhcPs
tyvars ((LHsQTyVars GhcRn
-> Bool
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet))
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet))
-> (LHsQTyVars GhcRn
-> Bool
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet))
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet)
forall a b. (a -> b) -> a -> b
$ \ LHsQTyVars GhcRn
tyvars' Bool
_ -> do
{ (LHsContext GhcRn
context', NameSet
cxt_fvs) <- HsDocContext -> LHsContext GhcPs -> RnM (LHsContext GhcRn, NameSet)
rnContext HsDocContext
cls_doc LHsContext GhcPs
context
; [Located (FunDep (Located Name))]
fds' <- [LHsFunDep GhcPs] -> RnM [LHsFunDep GhcRn]
rnFds [LHsFunDep GhcPs]
fds
; ([LFamilyDecl GhcRn]
ats', NameSet
fv_ats) <- Name -> [LFamilyDecl GhcPs] -> RnM ([LFamilyDecl GhcRn], NameSet)
rnATDecls Name
SrcSpanLess (Located Name)
cls' [LFamilyDecl GhcPs]
ats
; let fvs :: NameSet
fvs = NameSet
cxt_fvs NameSet -> NameSet -> NameSet
`plusFV`
NameSet
fv_ats
; ((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet)
-> RnM
((LHsQTyVars GhcRn, LHsContext GhcRn,
[Located (FunDep (Located Name))], [LFamilyDecl GhcRn]),
NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ((LHsQTyVars GhcRn
tyvars', LHsContext GhcRn
context', [Located (FunDep (Located Name))]
fds', [LFamilyDecl GhcRn]
ats'), NameSet
fvs) }
; ([Located (TyFamInstDecl GhcRn)]
at_defs', NameSet
fv_at_defs) <- (TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet))
-> [LTyFamInstDecl GhcPs]
-> RnM ([Located (TyFamInstDecl GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList (Name -> TyFamInstDecl GhcPs -> RnM (TyFamInstDecl GhcRn, NameSet)
rnTyFamDefltDecl Name
SrcSpanLess (Located Name)
cls') [LTyFamInstDecl GhcPs]
at_defs
; let sig_rdr_names_w_locs :: [GenLocated SrcSpan RdrName]
sig_rdr_names_w_locs =
[GenLocated SrcSpan RdrName
op | (LSig GhcPs -> Located (SrcSpanLess (LSig GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (ClassOpSig _ False ops _)) <- [LSig GhcPs]
sigs
, GenLocated SrcSpan RdrName
op <- [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
ops]
; [GenLocated SrcSpan RdrName] -> TcRn ()
checkDupRdrNames [GenLocated SrcSpan RdrName]
sig_rdr_names_w_locs
; (LHsBinds GhcRn
mbinds', [LSig GhcRn]
sigs', NameSet
meth_fvs)
<- Bool
-> Name
-> [Name]
-> LHsBinds GhcPs
-> [LSig GhcPs]
-> RnM (LHsBinds GhcRn, [LSig GhcRn], NameSet)
rnMethodBinds Bool
True Name
SrcSpanLess (Located Name)
cls' (LHsQTyVars GhcRn -> [Name]
hsAllLTyVarNames LHsQTyVars GhcRn
tyvars') LHsBinds GhcPs
mbinds [LSig GhcPs]
sigs
; [LDocDecl]
docs' <- (LDocDecl -> IOEnv (Env TcGblEnv TcLclEnv) LDocDecl)
-> [LDocDecl] -> IOEnv (Env TcGblEnv TcLclEnv) [LDocDecl]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess LDocDecl -> TcM (SrcSpanLess LDocDecl))
-> LDocDecl -> IOEnv (Env TcGblEnv TcLclEnv) LDocDecl
forall a b.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b)) -> a -> TcM b
wrapLocM SrcSpanLess LDocDecl -> TcM (SrcSpanLess LDocDecl)
DocDecl -> RnM DocDecl
rnDocDecl) [LDocDecl]
docs
; let all_fvs :: NameSet
all_fvs = NameSet
meth_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
stuff_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
fv_at_defs
; (TyClDecl GhcRn, NameSet) -> RnM (TyClDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ClassDecl :: forall pass.
XClassDecl pass
-> LHsContext pass
-> Located (IdP pass)
-> LHsQTyVars pass
-> LexicalFixity
-> [LHsFunDep pass]
-> [LSig pass]
-> LHsBinds pass
-> [LFamilyDecl pass]
-> [LTyFamDefltDecl pass]
-> [LDocDecl]
-> TyClDecl pass
ClassDecl { tcdCtxt :: LHsContext GhcRn
tcdCtxt = LHsContext GhcRn
context', tcdLName :: Located (IdP GhcRn)
tcdLName = Located Name
Located (IdP GhcRn)
lcls',
tcdTyVars :: LHsQTyVars GhcRn
tcdTyVars = LHsQTyVars GhcRn
tyvars', tcdFixity :: LexicalFixity
tcdFixity = LexicalFixity
fixity,
tcdFDs :: [LHsFunDep GhcRn]
tcdFDs = [Located (FunDep (Located Name))]
[LHsFunDep GhcRn]
fds', tcdSigs :: [LSig GhcRn]
tcdSigs = [LSig GhcRn]
sigs',
tcdMeths :: LHsBinds GhcRn
tcdMeths = LHsBinds GhcRn
mbinds', tcdATs :: [LFamilyDecl GhcRn]
tcdATs = [LFamilyDecl GhcRn]
ats', tcdATDefs :: [Located (TyFamInstDecl GhcRn)]
tcdATDefs = [Located (TyFamInstDecl GhcRn)]
at_defs',
tcdDocs :: [LDocDecl]
tcdDocs = [LDocDecl]
docs', tcdCExt :: XClassDecl GhcRn
tcdCExt = NameSet
XClassDecl GhcRn
all_fvs },
NameSet
all_fvs ) }
where
cls_doc :: HsDocContext
cls_doc = GenLocated SrcSpan RdrName -> HsDocContext
ClassDeclCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
lcls
rnTyClDecl (XTyClDecl XXTyClDecl GhcPs
nec) = NoExtCon -> RnM (TyClDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXTyClDecl GhcPs
NoExtCon
nec
data_decl_has_cusk :: LHsQTyVars pass -> NewOrData -> Bool -> Maybe (LHsKind pass') -> RnM Bool
data_decl_has_cusk :: LHsQTyVars pass
-> NewOrData -> Bool -> Maybe (LHsKind pass') -> TcRn Bool
data_decl_has_cusk LHsQTyVars pass
tyvars NewOrData
new_or_data Bool
no_rhs_kvs Maybe (LHsKind pass')
kind_sig = do
{
; Bool
unlifted_newtypes <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.UnliftedNewtypes
; let non_cusk_newtype :: Bool
non_cusk_newtype
| NewOrData
NewType <- NewOrData
new_or_data =
Bool
unlifted_newtypes Bool -> Bool -> Bool
&& Maybe (LHsKind pass') -> Bool
forall a. Maybe a -> Bool
isNothing Maybe (LHsKind pass')
kind_sig
| Bool
otherwise = Bool
False
; Bool -> TcRn Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> TcRn Bool) -> Bool -> TcRn Bool
forall a b. (a -> b) -> a -> b
$ LHsQTyVars pass -> Bool
forall pass. LHsQTyVars pass -> Bool
hsTvbAllKinded LHsQTyVars pass
tyvars Bool -> Bool -> Bool
&& Bool
no_rhs_kvs Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
non_cusk_newtype
}
rnTySyn :: HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, FreeVars)
rnTySyn :: HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnTySyn HsDocContext
doc LHsType GhcPs
rhs = HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnLHsType HsDocContext
doc LHsType GhcPs
rhs
rnDataDefn :: HsDocContext -> HsDataDefn GhcPs
-> RnM (HsDataDefn GhcRn, FreeVars)
rnDataDefn :: HsDocContext -> HsDataDefn GhcPs -> RnM (HsDataDefn GhcRn, NameSet)
rnDataDefn HsDocContext
doc (HsDataDefn { dd_ND :: forall pass. HsDataDefn pass -> NewOrData
dd_ND = NewOrData
new_or_data, dd_cType :: forall pass. HsDataDefn pass -> Maybe (Located CType)
dd_cType = Maybe (Located CType)
cType
, dd_ctxt :: forall pass. HsDataDefn pass -> LHsContext pass
dd_ctxt = LHsContext GhcPs
context, dd_cons :: forall pass. HsDataDefn pass -> [LConDecl pass]
dd_cons = [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 -> SDoc -> TcRn ()
checkTc (Bool
h98_style Bool -> Bool -> Bool
|| [LHsType GhcPs] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (LHsContext GhcPs -> SrcSpanLess (LHsContext GhcPs)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc LHsContext GhcPs
context))
(HsDocContext -> SDoc
badGadtStupidTheta HsDocContext
doc)
; (Maybe (LHsType GhcRn)
m_sig', NameSet
sig_fvs) <- case Maybe (LHsType GhcPs)
m_sig of
Just LHsType GhcPs
sig -> (LHsType GhcRn -> Maybe (LHsType GhcRn))
-> (LHsType GhcRn, NameSet) -> (Maybe (LHsType GhcRn), NameSet)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first LHsType GhcRn -> Maybe (LHsType GhcRn)
forall a. a -> Maybe a
Just ((LHsType GhcRn, NameSet) -> (Maybe (LHsType GhcRn), NameSet))
-> RnM (LHsType GhcRn, NameSet)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe (LHsType GhcRn), NameSet)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnLHsKind HsDocContext
doc LHsType GhcPs
sig
Maybe (LHsType GhcPs)
Nothing -> (Maybe (LHsType GhcRn), NameSet)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe (LHsType GhcRn), NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (LHsType GhcRn)
forall a. Maybe a
Nothing, NameSet
emptyFVs)
; (LHsContext GhcRn
context', NameSet
fvs1) <- HsDocContext -> LHsContext GhcPs -> RnM (LHsContext GhcRn, NameSet)
rnContext HsDocContext
doc LHsContext GhcPs
context
; (HsDeriving GhcRn
derivs', NameSet
fvs3) <- HsDeriving GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (HsDeriving GhcRn, NameSet)
rn_derivs HsDeriving GhcPs
derivs
; let { zap_lcl_env :: RnM ([LConDecl GhcRn], NameSet) -> RnM ([LConDecl GhcRn], NameSet)
zap_lcl_env | Bool
h98_style = \ RnM ([LConDecl GhcRn], NameSet)
thing -> RnM ([LConDecl GhcRn], NameSet)
thing
| Bool
otherwise = LocalRdrEnv
-> RnM ([LConDecl GhcRn], NameSet)
-> RnM ([LConDecl GhcRn], NameSet)
forall a. LocalRdrEnv -> RnM a -> RnM a
setLocalRdrEnv LocalRdrEnv
emptyLocalRdrEnv }
; ([LConDecl GhcRn]
condecls', NameSet
con_fvs) <- RnM ([LConDecl GhcRn], NameSet) -> RnM ([LConDecl GhcRn], NameSet)
zap_lcl_env (RnM ([LConDecl GhcRn], NameSet)
-> RnM ([LConDecl GhcRn], NameSet))
-> RnM ([LConDecl GhcRn], NameSet)
-> RnM ([LConDecl GhcRn], NameSet)
forall a b. (a -> b) -> a -> b
$ [LConDecl GhcPs] -> RnM ([LConDecl GhcRn], NameSet)
rnConDecls [LConDecl GhcPs]
condecls
; let all_fvs :: NameSet
all_fvs = NameSet
fvs1 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fvs3 NameSet -> NameSet -> NameSet
`plusFV`
NameSet
con_fvs NameSet -> NameSet -> NameSet
`plusFV` NameSet
sig_fvs
; (HsDataDefn GhcRn, NameSet) -> RnM (HsDataDefn GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ( HsDataDefn :: forall pass.
XCHsDataDefn pass
-> NewOrData
-> LHsContext pass
-> Maybe (Located CType)
-> Maybe (LHsKind pass)
-> [LConDecl pass]
-> HsDeriving pass
-> HsDataDefn pass
HsDataDefn { dd_ext :: XCHsDataDefn GhcRn
dd_ext = XCHsDataDefn GhcRn
NoExtField
noExtField
, dd_ND :: NewOrData
dd_ND = NewOrData
new_or_data, dd_cType :: Maybe (Located CType)
dd_cType = Maybe (Located CType)
cType
, dd_ctxt :: LHsContext GhcRn
dd_ctxt = LHsContext GhcRn
context', dd_kindSig :: Maybe (LHsType GhcRn)
dd_kindSig = Maybe (LHsType GhcRn)
m_sig'
, dd_cons :: [LConDecl GhcRn]
dd_cons = [LConDecl GhcRn]
condecls'
, dd_derivs :: HsDeriving GhcRn
dd_derivs = HsDeriving GhcRn
derivs' }
, NameSet
all_fvs )
}
where
h98_style :: Bool
h98_style = case [LConDecl GhcPs]
condecls of
(LConDecl GhcPs -> Located (SrcSpanLess (LConDecl GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (ConDeclGADT {})) : [LConDecl GhcPs]
_ -> Bool
False
[LConDecl GhcPs]
_ -> Bool
True
rn_derivs :: HsDeriving GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (HsDeriving GhcRn, NameSet)
rn_derivs (HsDeriving GhcPs -> Located (SrcSpanLess (HsDeriving GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (HsDeriving GhcPs)
ds)
= do { Bool
deriv_strats_ok <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.DerivingStrategies
; Bool -> SDoc -> TcRn ()
failIfTc ([LHsDerivingClause GhcPs] -> Int -> Bool
forall a. [a] -> Int -> Bool
lengthExceeds [LHsDerivingClause GhcPs]
SrcSpanLess (HsDeriving GhcPs)
ds Int
1 Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
deriv_strats_ok)
SDoc
multipleDerivClausesErr
; ([LHsDerivingClause GhcRn]
ds', NameSet
fvs) <- (LHsDerivingClause GhcPs -> RnM (LHsDerivingClause GhcRn, NameSet))
-> [LHsDerivingClause GhcPs]
-> RnM ([LHsDerivingClause GhcRn], NameSet)
forall a b. (a -> RnM (b, NameSet)) -> [a] -> RnM ([b], NameSet)
mapFvRn (HsDocContext
-> LHsDerivingClause GhcPs
-> RnM (LHsDerivingClause GhcRn, NameSet)
rnLHsDerivingClause HsDocContext
doc) [LHsDerivingClause GhcPs]
SrcSpanLess (HsDeriving GhcPs)
ds
; (HsDeriving GhcRn, NameSet)
-> IOEnv (Env TcGblEnv TcLclEnv) (HsDeriving GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpan -> SrcSpanLess (HsDeriving GhcRn) -> HsDeriving GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc [LHsDerivingClause GhcRn]
SrcSpanLess (HsDeriving GhcRn)
ds', NameSet
fvs) }
rnDataDefn HsDocContext
_ (XHsDataDefn XXHsDataDefn GhcPs
nec) = NoExtCon -> RnM (HsDataDefn GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXHsDataDefn GhcPs
NoExtCon
nec
warnNoDerivStrat :: Maybe (LDerivStrategy GhcRn)
-> SrcSpan
-> RnM ()
warnNoDerivStrat :: Maybe (LDerivStrategy GhcRn) -> SrcSpan -> TcRn ()
warnNoDerivStrat Maybe (LDerivStrategy GhcRn)
mds SrcSpan
loc
= do { DynFlags
dyn_flags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
forall (m :: * -> *). HasDynFlags m => m DynFlags
getDynFlags
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (WarningFlag -> DynFlags -> Bool
wopt WarningFlag
Opt_WarnMissingDerivingStrategies DynFlags
dyn_flags) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
case Maybe (LDerivStrategy GhcRn)
mds of
Maybe (LDerivStrategy GhcRn)
Nothing -> WarnReason -> SrcSpan -> SDoc -> TcRn ()
addWarnAt
(WarningFlag -> WarnReason
Reason WarningFlag
Opt_WarnMissingDerivingStrategies)
SrcSpan
loc
(if Extension -> DynFlags -> Bool
xopt Extension
LangExt.DerivingStrategies DynFlags
dyn_flags
then SDoc
no_strat_warning
else SDoc
no_strat_warning SDoc -> SDoc -> SDoc
$+$ SDoc
deriv_strat_nenabled
)
Maybe (LDerivStrategy GhcRn)
_ -> () -> TcRn ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
}
where
no_strat_warning :: SDoc
no_strat_warning :: SDoc
no_strat_warning = String -> SDoc
text String
"No deriving strategy specified. Did you want stock"
SDoc -> SDoc -> SDoc
<> String -> SDoc
text String
", newtype, or anyclass?"
deriv_strat_nenabled :: SDoc
deriv_strat_nenabled :: SDoc
deriv_strat_nenabled = String -> SDoc
text String
"Use DerivingStrategies to specify a strategy."
rnLHsDerivingClause :: HsDocContext -> LHsDerivingClause GhcPs
-> RnM (LHsDerivingClause GhcRn, FreeVars)
rnLHsDerivingClause :: HsDocContext
-> LHsDerivingClause GhcPs
-> RnM (LHsDerivingClause GhcRn, NameSet)
rnLHsDerivingClause HsDocContext
doc
(LHsDerivingClause GhcPs
-> Located (SrcSpanLess (LHsDerivingClause GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc (HsDerivingClause
{ deriv_clause_ext = noExtField
, deriv_clause_strategy = dcs
, deriv_clause_tys = (dL->L loc' dct) }))
= do { (Maybe (LDerivStrategy GhcRn)
dcs', [LHsSigType GhcRn]
dct', NameSet
fvs)
<- HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM ([LHsSigType GhcRn], NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), [LHsSigType GhcRn], NameSet)
forall a.
HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
rnLDerivStrategy HsDocContext
doc Maybe (LDerivStrategy GhcPs)
dcs (RnM ([LHsSigType GhcRn], NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), [LHsSigType GhcRn], NameSet))
-> RnM ([LHsSigType GhcRn], NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), [LHsSigType GhcRn], NameSet)
forall a b. (a -> b) -> a -> b
$ (LHsSigType GhcPs -> RnM (LHsSigType GhcRn, NameSet))
-> [LHsSigType GhcPs] -> RnM ([LHsSigType GhcRn], NameSet)
forall a b. (a -> RnM (b, NameSet)) -> [a] -> RnM ([b], NameSet)
mapFvRn (HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, NameSet)
rnHsSigType HsDocContext
doc TypeOrKind
TypeLevel) [LHsSigType GhcPs]
SrcSpanLess (Located [LHsSigType GhcPs])
dct
; Maybe (LDerivStrategy GhcRn) -> SrcSpan -> TcRn ()
warnNoDerivStrat Maybe (LDerivStrategy GhcRn)
dcs' SrcSpan
loc
; (LHsDerivingClause GhcRn, NameSet)
-> RnM (LHsDerivingClause GhcRn, NameSet)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ( SrcSpan
-> SrcSpanLess (LHsDerivingClause GhcRn) -> LHsDerivingClause GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc (HsDerivingClause :: forall pass.
XCHsDerivingClause pass
-> Maybe (LDerivStrategy pass)
-> Located [LHsSigType pass]
-> HsDerivingClause pass
HsDerivingClause { deriv_clause_ext :: XCHsDerivingClause GhcRn
deriv_clause_ext = XCHsDerivingClause GhcPs
XCHsDerivingClause GhcRn
noExtField
, deriv_clause_strategy :: Maybe (LDerivStrategy GhcRn)
deriv_clause_strategy = Maybe (LDerivStrategy GhcRn)
dcs'
, deriv_clause_tys :: Located [LHsSigType GhcRn]
deriv_clause_tys = SrcSpan
-> SrcSpanLess (Located [LHsSigType GhcRn])
-> Located [LHsSigType GhcRn]
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc' [LHsSigType GhcRn]
SrcSpanLess (Located [LHsSigType GhcRn])
dct' })
, NameSet
fvs ) }
rnLHsDerivingClause HsDocContext
_ (LHsDerivingClause GhcPs
-> Located (SrcSpanLess (LHsDerivingClause GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (XHsDerivingClause nec))
= NoExtCon -> RnM (LHsDerivingClause GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXHsDerivingClause GhcPs
NoExtCon
nec
rnLHsDerivingClause HsDocContext
_ LHsDerivingClause GhcPs
_ = String -> RnM (LHsDerivingClause GhcRn, NameSet)
forall a. String -> a
panic String
"rnLHsDerivingClause: Impossible Match"
rnLDerivStrategy :: forall a.
HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, FreeVars)
-> RnM (Maybe (LDerivStrategy GhcRn), a, FreeVars)
rnLDerivStrategy :: HsDocContext
-> Maybe (LDerivStrategy GhcPs)
-> RnM (a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
rnLDerivStrategy HsDocContext
doc Maybe (LDerivStrategy GhcPs)
mds RnM (a, NameSet)
thing_inside
= case Maybe (LDerivStrategy GhcPs)
mds of
Maybe (LDerivStrategy GhcPs)
Nothing -> Maybe (LDerivStrategy GhcRn)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
forall ds. ds -> RnM (ds, a, NameSet)
boring_case Maybe (LDerivStrategy GhcRn)
forall a. Maybe a
Nothing
Just (LDerivStrategy GhcPs
-> Located (SrcSpanLess (LDerivStrategy GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
loc SrcSpanLess (LDerivStrategy GhcPs)
ds) ->
SrcSpan
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet))
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
forall a b. (a -> b) -> a -> b
$ do
(DerivStrategy GhcRn
ds', a
thing, NameSet
fvs) <- DerivStrategy GhcPs -> RnM (DerivStrategy GhcRn, a, NameSet)
rn_deriv_strat SrcSpanLess (LDerivStrategy GhcPs)
DerivStrategy GhcPs
ds
(Maybe (LDerivStrategy GhcRn), a, NameSet)
-> RnM (Maybe (LDerivStrategy GhcRn), a, NameSet)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (LDerivStrategy GhcRn -> Maybe (LDerivStrategy GhcRn)
forall a. a -> Maybe a
Just (SrcSpan
-> SrcSpanLess (LDerivStrategy GhcRn) -> LDerivStrategy GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
loc SrcSpanLess (LDerivStrategy GhcRn)
DerivStrategy GhcRn
ds'), a
thing, NameSet
fvs)
where
rn_deriv_strat :: DerivStrategy GhcPs
-> RnM (DerivStrategy GhcRn, a, FreeVars)
rn_deriv_strat :: DerivStrategy GhcPs -> RnM (DerivStrategy GhcRn, a, NameSet)
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
$
SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWith (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ DerivStrategy GhcPs -> SDoc
illegalDerivStrategyErr DerivStrategy GhcPs
ds
case DerivStrategy GhcPs
ds of
DerivStrategy GhcPs
StockStrategy -> DerivStrategy GhcRn -> RnM (DerivStrategy GhcRn, a, NameSet)
forall ds. ds -> RnM (ds, a, NameSet)
boring_case DerivStrategy GhcRn
forall pass. DerivStrategy pass
StockStrategy
DerivStrategy GhcPs
AnyclassStrategy -> DerivStrategy GhcRn -> RnM (DerivStrategy GhcRn, a, NameSet)
forall ds. ds -> RnM (ds, a, NameSet)
boring_case DerivStrategy GhcRn
forall pass. DerivStrategy pass
AnyclassStrategy
DerivStrategy GhcPs
NewtypeStrategy -> DerivStrategy GhcRn -> RnM (DerivStrategy GhcRn, a, NameSet)
forall ds. ds -> RnM (ds, a, NameSet)
boring_case DerivStrategy GhcRn
forall pass. DerivStrategy pass
NewtypeStrategy
ViaStrategy XViaStrategy GhcPs
via_ty ->
do (LHsSigType GhcRn
via_ty', NameSet
fvs1) <- HsDocContext
-> TypeOrKind
-> LHsSigType GhcPs
-> RnM (LHsSigType GhcRn, NameSet)
rnHsSigType HsDocContext
doc TypeOrKind
TypeLevel XViaStrategy GhcPs
LHsSigType GhcPs
via_ty
let HsIB { hsib_ext :: forall pass thing. HsImplicitBndrs pass thing -> XHsIB pass thing
hsib_ext = XHsIB GhcRn (LHsType GhcRn)
via_imp_tvs
, hsib_body :: forall pass thing. HsImplicitBndrs pass thing -> thing
hsib_body = LHsType GhcRn
via_body } = LHsSigType GhcRn
via_ty'
([LHsTyVarBndr GhcRn]
via_exp_tv_bndrs, LHsContext GhcRn
_, LHsType GhcRn
_) = LHsType GhcRn
-> ([LHsTyVarBndr GhcRn], LHsContext GhcRn, LHsType GhcRn)
forall pass.
LHsType pass
-> ([LHsTyVarBndr pass], LHsContext pass, LHsType pass)
splitLHsSigmaTyInvis LHsType GhcRn
via_body
via_exp_tvs :: [IdP GhcRn]
via_exp_tvs = [LHsTyVarBndr GhcRn] -> [IdP GhcRn]
forall (p :: Pass). [LHsTyVarBndr (GhcPass p)] -> [IdP (GhcPass p)]
hsLTyVarNames [LHsTyVarBndr GhcRn]
via_exp_tv_bndrs
via_tvs :: [Name]
via_tvs = [Name]
XHsIB GhcRn (LHsType GhcRn)
via_imp_tvs [Name] -> [Name] -> [Name]
forall a. [a] -> [a] -> [a]
++ [Name]
[IdP GhcRn]
via_exp_tvs
(a
thing, NameSet
fvs2) <- [Name] -> RnM (a, NameSet) -> RnM (a, NameSet)
forall a. [Name] -> RnM (a, NameSet) -> RnM (a, NameSet)
extendTyVarEnvFVRn [Name]
via_tvs RnM (a, NameSet)
thing_inside
(DerivStrategy GhcRn, a, NameSet)
-> RnM (DerivStrategy GhcRn, a, NameSet)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (XViaStrategy GhcRn -> DerivStrategy GhcRn
forall pass. XViaStrategy pass -> DerivStrategy pass
ViaStrategy XViaStrategy GhcRn
LHsSigType GhcRn
via_ty', a
thing, NameSet
fvs1 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fvs2)
boring_case :: ds -> RnM (ds, a, FreeVars)
boring_case :: ds -> RnM (ds, a, NameSet)
boring_case ds
ds = do
(a
thing, NameSet
fvs) <- RnM (a, NameSet)
thing_inside
(ds, a, NameSet) -> RnM (ds, a, NameSet)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ds
ds, a
thing, NameSet
fvs)
badGadtStupidTheta :: HsDocContext -> SDoc
badGadtStupidTheta :: HsDocContext -> SDoc
badGadtStupidTheta HsDocContext
_
= [SDoc] -> SDoc
vcat [String -> SDoc
text String
"No context is allowed on a GADT-style data declaration",
String -> SDoc
text String
"(You can put a context on each constructor, though.)"]
illegalDerivStrategyErr :: DerivStrategy GhcPs -> SDoc
illegalDerivStrategyErr :: DerivStrategy GhcPs -> SDoc
illegalDerivStrategyErr DerivStrategy GhcPs
ds
= [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Illegal deriving strategy" SDoc -> SDoc -> SDoc
<> SDoc
colon SDoc -> SDoc -> SDoc
<+> DerivStrategy GhcPs -> SDoc
forall a. DerivStrategy a -> SDoc
derivStrategyName DerivStrategy GhcPs
ds
, String -> SDoc
text String
enableStrategy ]
where
enableStrategy :: String
enableStrategy :: String
enableStrategy
| ViaStrategy{} <- DerivStrategy GhcPs
ds
= String
"Use DerivingVia to enable this extension"
| Bool
otherwise
= String
"Use DerivingStrategies to enable this extension"
multipleDerivClausesErr :: SDoc
multipleDerivClausesErr :: SDoc
multipleDerivClausesErr
= [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Illegal use of multiple, consecutive deriving clauses"
, String -> SDoc
text String
"Use DerivingStrategies to allow this" ]
rnFamDecl :: Maybe Name
-> FamilyDecl GhcPs
-> RnM (FamilyDecl GhcRn, FreeVars)
rnFamDecl :: Maybe Name -> FamilyDecl GhcPs -> RnM (FamilyDecl GhcRn, NameSet)
rnFamDecl Maybe Name
mb_cls (FamilyDecl { fdLName :: forall pass. FamilyDecl pass -> Located (IdP pass)
fdLName = Located (IdP GhcPs)
tycon, fdTyVars :: forall pass. FamilyDecl pass -> LHsQTyVars pass
fdTyVars = LHsQTyVars GhcPs
tyvars
, 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 { Located Name
tycon' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
; ((LHsQTyVars GhcRn
tyvars', LFamilyResultSig GhcRn
res_sig', Maybe (LInjectivityAnn GhcRn)
injectivity'), NameSet
fv1) <-
HsDocContext
-> Maybe SDoc
-> Maybe Name
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn
-> Bool
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet))
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [GenLocated SrcSpan RdrName]
-> LHsQTyVars GhcPs
-> (LHsQTyVars GhcRn -> Bool -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindHsQTyVars HsDocContext
doc Maybe SDoc
forall a. Maybe a
Nothing Maybe Name
mb_cls [GenLocated SrcSpan RdrName]
kvs LHsQTyVars GhcPs
tyvars ((LHsQTyVars GhcRn
-> Bool
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet))
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet))
-> (LHsQTyVars GhcRn
-> Bool
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet))
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet)
forall a b. (a -> b) -> a -> b
$ \ LHsQTyVars GhcRn
tyvars' Bool
_ ->
do { let rn_sig :: FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, NameSet)
rn_sig = HsDocContext
-> FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, NameSet)
rnFamResultSig HsDocContext
doc
; (LFamilyResultSig GhcRn
res_sig', NameSet
fv_kind) <- (SrcSpanLess (LFamilyResultSig GhcPs)
-> TcM (SrcSpanLess (LFamilyResultSig GhcRn), NameSet))
-> LFamilyResultSig GhcPs -> TcM (LFamilyResultSig GhcRn, NameSet)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LFamilyResultSig GhcPs)
-> TcM (SrcSpanLess (LFamilyResultSig GhcRn), NameSet)
FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, NameSet)
rn_sig LFamilyResultSig GhcPs
res_sig
; Maybe (LInjectivityAnn GhcRn)
injectivity' <- (LInjectivityAnn GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn))
-> Maybe (LInjectivityAnn GhcPs)
-> IOEnv (Env TcGblEnv TcLclEnv) (Maybe (LInjectivityAnn GhcRn))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (LHsQTyVars GhcRn
-> LFamilyResultSig GhcRn
-> LInjectivityAnn GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
rnInjectivityAnn LHsQTyVars GhcRn
tyvars' LFamilyResultSig GhcRn
res_sig')
Maybe (LInjectivityAnn GhcPs)
injectivity
; ((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet)
-> RnM
((LHsQTyVars GhcRn, LFamilyResultSig GhcRn,
Maybe (LInjectivityAnn GhcRn)),
NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ( (LHsQTyVars GhcRn
tyvars', LFamilyResultSig GhcRn
res_sig', Maybe (LInjectivityAnn GhcRn)
injectivity') , NameSet
fv_kind ) }
; (FamilyInfo GhcRn
info', NameSet
fv2) <- Located Name -> FamilyInfo GhcPs -> RnM (FamilyInfo GhcRn, NameSet)
rn_info Located Name
tycon' FamilyInfo GhcPs
info
; (FamilyDecl GhcRn, NameSet) -> RnM (FamilyDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (FamilyDecl :: forall pass.
XCFamilyDecl pass
-> FamilyInfo pass
-> Located (IdP pass)
-> LHsQTyVars pass
-> LexicalFixity
-> LFamilyResultSig pass
-> Maybe (LInjectivityAnn pass)
-> FamilyDecl pass
FamilyDecl { fdExt :: XCFamilyDecl GhcRn
fdExt = XCFamilyDecl GhcRn
NoExtField
noExtField
, fdLName :: Located (IdP GhcRn)
fdLName = Located Name
Located (IdP GhcRn)
tycon', fdTyVars :: LHsQTyVars GhcRn
fdTyVars = LHsQTyVars GhcRn
tyvars'
, fdFixity :: LexicalFixity
fdFixity = LexicalFixity
fixity
, fdInfo :: FamilyInfo GhcRn
fdInfo = FamilyInfo GhcRn
info', fdResultSig :: LFamilyResultSig GhcRn
fdResultSig = LFamilyResultSig GhcRn
res_sig'
, fdInjectivityAnn :: Maybe (LInjectivityAnn GhcRn)
fdInjectivityAnn = Maybe (LInjectivityAnn GhcRn)
injectivity' }
, NameSet
fv1 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fv2) }
where
doc :: HsDocContext
doc = GenLocated SrcSpan RdrName -> HsDocContext
TyFamilyCtx GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon
kvs :: [GenLocated SrcSpan RdrName]
kvs = LFamilyResultSig GhcPs -> [GenLocated SrcSpan RdrName]
extractRdrKindSigVars LFamilyResultSig GhcPs
res_sig
rn_info :: Located Name
-> FamilyInfo GhcPs -> RnM (FamilyInfo GhcRn, FreeVars)
rn_info :: Located Name -> FamilyInfo GhcPs -> RnM (FamilyInfo GhcRn, NameSet)
rn_info (Located Name -> Located (SrcSpanLess (Located Name))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ SrcSpanLess (Located Name)
fam_name) (ClosedTypeFamily (Just [LTyFamInstEqn GhcPs]
eqns))
= do { ([Located (TyFamInstEqn GhcRn)]
eqns', NameSet
fvs)
<- (TyFamInstEqn GhcPs -> RnM (TyFamInstEqn GhcRn, NameSet))
-> [LTyFamInstEqn GhcPs]
-> RnM ([Located (TyFamInstEqn GhcRn)], NameSet)
forall a b.
(a -> RnM (b, NameSet))
-> [Located a] -> RnM ([Located b], NameSet)
rnList (AssocTyFamInfo
-> ClosedTyFamInfo
-> TyFamInstEqn GhcPs
-> RnM (TyFamInstEqn GhcRn, NameSet)
rnTyFamInstEqn AssocTyFamInfo
NonAssocTyFamEqn (GenLocated SrcSpan RdrName -> Name -> ClosedTyFamInfo
ClosedTyFam GenLocated SrcSpan RdrName
Located (IdP GhcPs)
tycon Name
SrcSpanLess (Located Name)
fam_name))
[LTyFamInstEqn GhcPs]
eqns
; (FamilyInfo GhcRn, NameSet) -> RnM (FamilyInfo GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe [Located (TyFamInstEqn GhcRn)] -> FamilyInfo GhcRn
forall pass. Maybe [LTyFamInstEqn pass] -> FamilyInfo pass
ClosedTypeFamily ([Located (TyFamInstEqn GhcRn)]
-> Maybe [Located (TyFamInstEqn GhcRn)]
forall a. a -> Maybe a
Just [Located (TyFamInstEqn GhcRn)]
eqns'), NameSet
fvs) }
rn_info Located Name
_ (ClosedTypeFamily Maybe [LTyFamInstEqn GhcPs]
Nothing)
= (FamilyInfo GhcRn, NameSet) -> RnM (FamilyInfo GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe [Located (TyFamInstEqn GhcRn)] -> FamilyInfo GhcRn
forall pass. Maybe [LTyFamInstEqn pass] -> FamilyInfo pass
ClosedTypeFamily Maybe [Located (TyFamInstEqn GhcRn)]
forall a. Maybe a
Nothing, NameSet
emptyFVs)
rn_info Located Name
_ FamilyInfo GhcPs
OpenTypeFamily = (FamilyInfo GhcRn, NameSet) -> RnM (FamilyInfo GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (FamilyInfo GhcRn
forall pass. FamilyInfo pass
OpenTypeFamily, NameSet
emptyFVs)
rn_info Located Name
_ FamilyInfo GhcPs
DataFamily = (FamilyInfo GhcRn, NameSet) -> RnM (FamilyInfo GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (FamilyInfo GhcRn
forall pass. FamilyInfo pass
DataFamily, NameSet
emptyFVs)
rnFamDecl Maybe Name
_ (XFamilyDecl XXFamilyDecl GhcPs
nec) = NoExtCon -> RnM (FamilyDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXFamilyDecl GhcPs
NoExtCon
nec
rnFamResultSig :: HsDocContext
-> FamilyResultSig GhcPs
-> RnM (FamilyResultSig GhcRn, FreeVars)
rnFamResultSig :: HsDocContext
-> FamilyResultSig GhcPs -> RnM (FamilyResultSig GhcRn, NameSet)
rnFamResultSig HsDocContext
_ (NoSig XNoSig GhcPs
_)
= (FamilyResultSig GhcRn, NameSet)
-> RnM (FamilyResultSig GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XNoSig GhcRn -> FamilyResultSig GhcRn
forall pass. XNoSig pass -> FamilyResultSig pass
NoSig XNoSig GhcRn
NoExtField
noExtField, NameSet
emptyFVs)
rnFamResultSig HsDocContext
doc (KindSig XCKindSig GhcPs
_ LHsType GhcPs
kind)
= do { (LHsType GhcRn
rndKind, NameSet
ftvs) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnLHsKind HsDocContext
doc LHsType GhcPs
kind
; (FamilyResultSig GhcRn, NameSet)
-> RnM (FamilyResultSig GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (XCKindSig GhcRn -> LHsType GhcRn -> FamilyResultSig GhcRn
forall pass. XCKindSig pass -> LHsKind pass -> FamilyResultSig pass
KindSig XCKindSig GhcRn
NoExtField
noExtField LHsType GhcRn
rndKind, NameSet
ftvs) }
rnFamResultSig HsDocContext
doc (TyVarSig XTyVarSig GhcPs
_ LHsTyVarBndr GhcPs
tvbndr)
= do {
LocalRdrEnv
rdr_env <- RnM LocalRdrEnv
getLocalRdrEnv
; let resName :: IdP GhcPs
resName = LHsTyVarBndr GhcPs -> IdP GhcPs
forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> IdP (GhcPass p)
hsLTyVarName LHsTyVarBndr GhcPs
tvbndr
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (RdrName
IdP GhcPs
resName RdrName -> LocalRdrEnv -> Bool
`elemLocalRdrEnv` LocalRdrEnv
rdr_env) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SrcSpan -> SDoc -> TcRn ()
addErrAt (LHsTyVarBndr GhcPs -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc LHsTyVarBndr GhcPs
tvbndr) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$
([SDoc] -> SDoc
hsep [ String -> SDoc
text String
"Type variable", SDoc -> SDoc
quotes (RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr RdrName
IdP GhcPs
resName) SDoc -> SDoc -> SDoc
<> SDoc
comma
, String -> SDoc
text String
"naming a type family result,"
] SDoc -> SDoc -> SDoc
$$
String -> SDoc
text String
"shadows an already bound type variable")
; HsDocContext
-> Maybe Any
-> LHsTyVarBndr GhcPs
-> (LHsTyVarBndr GhcRn -> RnM (FamilyResultSig GhcRn, NameSet))
-> RnM (FamilyResultSig GhcRn, NameSet)
forall a b.
HsDocContext
-> Maybe a
-> LHsTyVarBndr GhcPs
-> (LHsTyVarBndr GhcRn -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindLHsTyVarBndr HsDocContext
doc Maybe Any
forall a. Maybe a
Nothing
LHsTyVarBndr GhcPs
tvbndr ((LHsTyVarBndr GhcRn -> RnM (FamilyResultSig GhcRn, NameSet))
-> RnM (FamilyResultSig GhcRn, NameSet))
-> (LHsTyVarBndr GhcRn -> RnM (FamilyResultSig GhcRn, NameSet))
-> RnM (FamilyResultSig GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ LHsTyVarBndr GhcRn
tvbndr' ->
(FamilyResultSig GhcRn, NameSet)
-> RnM (FamilyResultSig GhcRn, NameSet)
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', Name -> NameSet
unitFV (LHsTyVarBndr GhcRn -> IdP GhcRn
forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> IdP (GhcPass p)
hsLTyVarName LHsTyVarBndr GhcRn
tvbndr')) }
rnFamResultSig HsDocContext
_ (XFamilyResultSig XXFamilyResultSig GhcPs
nec) = NoExtCon -> RnM (FamilyResultSig GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXFamilyResultSig GhcPs
NoExtCon
nec
rnInjectivityAnn :: LHsQTyVars GhcRn
-> LFamilyResultSig GhcRn
-> LInjectivityAnn GhcPs
-> RnM (LInjectivityAnn GhcRn)
rnInjectivityAnn :: LHsQTyVars GhcRn
-> LFamilyResultSig GhcRn
-> LInjectivityAnn GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
rnInjectivityAnn LHsQTyVars GhcRn
tvBndrs (LFamilyResultSig GhcRn
-> Located (SrcSpanLess (LFamilyResultSig GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (TyVarSig _ resTv))
(LInjectivityAnn GhcPs
-> Located (SrcSpanLess (LInjectivityAnn GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
srcSpan (InjectivityAnn injFrom injTo))
= do
{ (injDecl' :: LInjectivityAnn GhcRn
injDecl'@(LInjectivityAnn GhcRn
-> Located (SrcSpanLess (LInjectivityAnn GhcRn))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ (InjectivityAnn injFrom' injTo')), Bool
noRnErrors)
<- IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> TcRn (LInjectivityAnn GhcRn, Bool)
forall a. TcRn a -> TcRn (a, Bool)
askNoErrs (IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> TcRn (LInjectivityAnn GhcRn, Bool))
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> TcRn (LInjectivityAnn GhcRn, Bool)
forall a b. (a -> b) -> a -> b
$
[Name]
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a. [Name] -> RnM a -> RnM a
bindLocalNames [LHsTyVarBndr GhcRn -> IdP GhcRn
forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> IdP (GhcPass p)
hsLTyVarName LHsTyVarBndr GhcRn
resTv] (IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn))
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a b. (a -> b) -> a -> b
$
do { Located Name
injFrom' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
rnLTyVar GenLocated SrcSpan RdrName
Located (IdP GhcPs)
injFrom
; [Located Name]
injTo' <- (GenLocated SrcSpan RdrName -> RnM (Located Name))
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM GenLocated SrcSpan RdrName -> RnM (Located Name)
rnLTyVar [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
injTo
; LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn))
-> LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a b. (a -> b) -> a -> b
$ SrcSpan
-> SrcSpanLess (LInjectivityAnn GhcRn) -> LInjectivityAnn GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
srcSpan (Located (IdP GhcRn)
-> [Located (IdP GhcRn)] -> InjectivityAnn GhcRn
forall pass.
Located (IdP pass) -> [Located (IdP pass)] -> InjectivityAnn pass
InjectivityAnn Located Name
Located (IdP GhcRn)
injFrom' [Located Name]
[Located (IdP GhcRn)]
injTo') }
; let tvNames :: Set Name
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
resName :: IdP GhcRn
resName = LHsTyVarBndr GhcRn -> IdP GhcRn
forall (p :: Pass). LHsTyVarBndr (GhcPass p) -> IdP (GhcPass p)
hsLTyVarName LHsTyVarBndr GhcRn
resTv
lhsValid :: Bool
lhsValid = Ordering
EQ Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== (Name -> Name -> Ordering
stableNameCmp Name
IdP GhcRn
resName (Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
Located (IdP GhcRn)
injFrom'))
rhsValid :: Set Name
rhsValid = [Name] -> Set Name
forall a. Ord a => [a] -> Set a
Set.fromList ((Located Name -> Name) -> [Located Name] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Located Name -> Name
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc [Located Name]
[Located (IdP GhcRn)]
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 -> SDoc -> TcRn ()
addErrAt (GenLocated SrcSpan RdrName -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
getLoc GenLocated SrcSpan RdrName
Located (IdP GhcPs)
injFrom)
( [SDoc] -> SDoc
vcat [ String -> SDoc
text (String -> SDoc) -> String -> SDoc
forall a b. (a -> b) -> a -> b
$ String
"Incorrect type variable on the LHS of "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"injectivity condition"
, Int -> SDoc -> SDoc
nest Int
5
( [SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Expected :" SDoc -> SDoc -> SDoc
<+> Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
IdP GhcRn
resName
, String -> SDoc
text String
"Actual :" SDoc -> SDoc -> SDoc
<+> GenLocated SrcSpan RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenLocated SrcSpan RdrName
Located (IdP 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 -> SDoc -> TcRn ()
addErrAt SrcSpan
srcSpan (SDoc -> TcRn ()) -> SDoc -> TcRn ()
forall a b. (a -> b) -> a -> b
$ ( [SDoc] -> SDoc
hsep
[ String -> SDoc
text String
"Unknown type variable" SDoc -> SDoc -> SDoc
<> [Name] -> SDoc
forall a. [a] -> SDoc
plural [Name]
errorVars
, String -> SDoc
text String
"on the RHS of injectivity condition:"
, [Name] -> SDoc
forall a. Outputable a => [a] -> SDoc
interpp'SP [Name]
errorVars ] ) }
; LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return LInjectivityAnn GhcRn
injDecl' }
rnInjectivityAnn LHsQTyVars GhcRn
_ LFamilyResultSig GhcRn
_ (LInjectivityAnn GhcPs
-> Located (SrcSpanLess (LInjectivityAnn GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
srcSpan (InjectivityAnn injFrom injTo)) =
SrcSpan
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
srcSpan (IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn))
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a b. (a -> b) -> a -> b
$ do
(LInjectivityAnn GhcRn
injDecl', Bool
_) <- IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> TcRn (LInjectivityAnn GhcRn, Bool)
forall a. TcRn a -> TcRn (a, Bool)
askNoErrs (IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> TcRn (LInjectivityAnn GhcRn, Bool))
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
-> TcRn (LInjectivityAnn GhcRn, Bool)
forall a b. (a -> b) -> a -> b
$ do
Located Name
injFrom' <- GenLocated SrcSpan RdrName -> RnM (Located Name)
rnLTyVar GenLocated SrcSpan RdrName
Located (IdP GhcPs)
injFrom
[Located Name]
injTo' <- (GenLocated SrcSpan RdrName -> RnM (Located Name))
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM GenLocated SrcSpan RdrName -> RnM (Located Name)
rnLTyVar [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
injTo
LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn))
-> LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a b. (a -> b) -> a -> b
$ SrcSpan
-> SrcSpanLess (LInjectivityAnn GhcRn) -> LInjectivityAnn GhcRn
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
srcSpan (Located (IdP GhcRn)
-> [Located (IdP GhcRn)] -> InjectivityAnn GhcRn
forall pass.
Located (IdP pass) -> [Located (IdP pass)] -> InjectivityAnn pass
InjectivityAnn Located Name
Located (IdP GhcRn)
injFrom' [Located Name]
[Located (IdP GhcRn)]
injTo')
LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall (m :: * -> *) a. Monad m => a -> m a
return (LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn))
-> LInjectivityAnn GhcRn
-> IOEnv (Env TcGblEnv TcLclEnv) (LInjectivityAnn GhcRn)
forall a b. (a -> b) -> a -> b
$ LInjectivityAnn GhcRn
injDecl'
wrongTyFamName :: Name -> Name -> SDoc
wrongTyFamName :: Name -> Name -> SDoc
wrongTyFamName Name
fam_tc_name Name
eqn_tc_name
= SDoc -> Int -> SDoc -> SDoc
hang (String -> SDoc
text String
"Mismatched type name in type family instance.")
Int
2 ([SDoc] -> SDoc
vcat [ String -> SDoc
text String
"Expected:" SDoc -> SDoc -> SDoc
<+> Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
fam_tc_name
, String -> SDoc
text String
" Actual:" SDoc -> SDoc -> SDoc
<+> Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr Name
eqn_tc_name ])
rnConDecls :: [LConDecl GhcPs] -> RnM ([LConDecl GhcRn], FreeVars)
rnConDecls :: [LConDecl GhcPs] -> RnM ([LConDecl GhcRn], NameSet)
rnConDecls = (LConDecl GhcPs -> RnM (LConDecl GhcRn, NameSet))
-> [LConDecl GhcPs] -> RnM ([LConDecl GhcRn], NameSet)
forall a b. (a -> RnM (b, NameSet)) -> [a] -> RnM ([b], NameSet)
mapFvRn ((SrcSpanLess (LConDecl GhcPs)
-> TcM (SrcSpanLess (LConDecl GhcRn), NameSet))
-> LConDecl GhcPs -> RnM (LConDecl GhcRn, NameSet)
forall a b c.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b, c)) -> a -> TcM (b, c)
wrapLocFstM SrcSpanLess (LConDecl GhcPs)
-> TcM (SrcSpanLess (LConDecl GhcRn), NameSet)
ConDecl GhcPs -> RnM (ConDecl GhcRn, NameSet)
rnConDecl)
rnConDecl :: ConDecl GhcPs -> RnM (ConDecl GhcRn, FreeVars)
rnConDecl :: ConDecl GhcPs -> RnM (ConDecl GhcRn, NameSet)
rnConDecl decl :: ConDecl GhcPs
decl@(ConDeclH98 { con_name :: forall pass. ConDecl pass -> Located (IdP pass)
con_name = Located (IdP GhcPs)
name, con_ex_tvs :: forall pass. ConDecl pass -> [LHsTyVarBndr pass]
con_ex_tvs = [LHsTyVarBndr 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 -> HsConDeclDetails pass
con_args = HsConDeclDetails GhcPs
args
, con_doc :: forall pass. ConDecl pass -> Maybe LHsDocString
con_doc = Maybe LHsDocString
mb_doc })
= do { ()
_ <- (SrcSpanLess (GenLocated SrcSpan RdrName) -> TcRn ())
-> GenLocated SrcSpan RdrName -> TcRn ()
forall a b. HasSrcSpan a => (SrcSpanLess a -> TcM b) -> a -> TcM b
addLocM SrcSpanLess (GenLocated SrcSpan RdrName) -> TcRn ()
RdrName -> TcRn ()
checkConName GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name
; Located Name
new_name <- GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name
; Maybe LHsDocString
mb_doc' <- Maybe LHsDocString -> RnM (Maybe LHsDocString)
rnMbLHsDoc Maybe LHsDocString
mb_doc
; let ctxt :: HsDocContext
ctxt = [Located Name] -> HsDocContext
ConDeclCtx [Located Name
new_name]
; HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindLHsTyVarBndrs HsDocContext
ctxt (SDoc -> Maybe SDoc
forall a. a -> Maybe a
Just (HsDocContext -> SDoc
inHsDocContext HsDocContext
ctxt))
Maybe Any
forall a. Maybe a
Nothing [LHsTyVarBndr GhcPs]
ex_tvs (([LHsTyVarBndr GhcRn] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet))
-> ([LHsTyVarBndr GhcRn] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [LHsTyVarBndr GhcRn]
new_ex_tvs ->
do { (Maybe (LHsContext GhcRn)
new_context, NameSet
fvs1) <- HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), NameSet)
rnMbContext HsDocContext
ctxt Maybe (LHsContext GhcPs)
mcxt
; (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
new_args, NameSet
fvs2) <- Name
-> HsDocContext
-> HsConDeclDetails GhcPs
-> RnM
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
rnConDeclDetails (Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc Located Name
new_name) HsDocContext
ctxt HsConDeclDetails GhcPs
args
; let all_fvs :: NameSet
all_fvs = NameSet
fvs1 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fvs2
; String -> SDoc -> TcRn ()
traceRn String
"rnConDecl" (GenLocated SrcSpan RdrName -> SDoc
forall a. Outputable a => a -> SDoc
ppr GenLocated SrcSpan RdrName
Located (IdP GhcPs)
name SDoc -> SDoc -> SDoc
<+> [SDoc] -> SDoc
vcat
[ String -> SDoc
text String
"ex_tvs:" SDoc -> SDoc -> SDoc
<+> [LHsTyVarBndr GhcPs] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LHsTyVarBndr GhcPs]
ex_tvs
, String -> SDoc
text String
"new_ex_dqtvs':" SDoc -> SDoc -> SDoc
<+> [LHsTyVarBndr GhcRn] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LHsTyVarBndr GhcRn]
new_ex_tvs ])
; (ConDecl GhcRn, NameSet) -> RnM (ConDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ConDecl GhcPs
decl { con_ext :: XConDeclH98 GhcRn
con_ext = XConDeclH98 GhcRn
NoExtField
noExtField
, con_name :: Located (IdP GhcRn)
con_name = Located Name
Located (IdP GhcRn)
new_name, con_ex_tvs :: [LHsTyVarBndr GhcRn]
con_ex_tvs = [LHsTyVarBndr GhcRn]
new_ex_tvs
, con_mb_cxt :: Maybe (LHsContext GhcRn)
con_mb_cxt = Maybe (LHsContext GhcRn)
new_context, con_args :: HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
con_args = HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
new_args
, con_doc :: Maybe LHsDocString
con_doc = Maybe LHsDocString
mb_doc' },
NameSet
all_fvs) }}
rnConDecl decl :: ConDecl GhcPs
decl@(ConDeclGADT { con_names :: forall pass. ConDecl pass -> [Located (IdP pass)]
con_names = [Located (IdP GhcPs)]
names
, con_forall :: forall pass. ConDecl pass -> Located Bool
con_forall = (Located Bool -> Located (SrcSpanLess (Located Bool))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ SrcSpanLess (Located Bool)
explicit_forall)
, con_qvars :: forall pass. ConDecl pass -> LHsQTyVars pass
con_qvars = LHsQTyVars GhcPs
qtvs
, con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
con_mb_cxt = Maybe (LHsContext GhcPs)
mcxt
, con_args :: forall pass. ConDecl pass -> HsConDeclDetails pass
con_args = HsConDeclDetails 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 LHsDocString
con_doc = Maybe LHsDocString
mb_doc })
= do { (GenLocated SrcSpan RdrName -> TcRn ())
-> [GenLocated SrcSpan RdrName] -> TcRn ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ ((SrcSpanLess (GenLocated SrcSpan RdrName) -> TcRn ())
-> GenLocated SrcSpan RdrName -> TcRn ()
forall a b. HasSrcSpan a => (SrcSpanLess a -> TcM b) -> a -> TcM b
addLocM SrcSpanLess (GenLocated SrcSpan RdrName) -> TcRn ()
RdrName -> TcRn ()
checkConName) [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
names
; [Located Name]
new_names <- (GenLocated SrcSpan RdrName -> RnM (Located Name))
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM GenLocated SrcSpan RdrName -> RnM (Located Name)
lookupLocatedTopBndrRn [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
names
; Maybe LHsDocString
mb_doc' <- Maybe LHsDocString -> RnM (Maybe LHsDocString)
rnMbLHsDoc Maybe LHsDocString
mb_doc
; let explicit_tkvs :: [LHsTyVarBndr GhcPs]
explicit_tkvs = LHsQTyVars GhcPs -> [LHsTyVarBndr GhcPs]
forall pass. LHsQTyVars pass -> [LHsTyVarBndr pass]
hsQTvExplicit LHsQTyVars GhcPs
qtvs
theta :: [LHsType GhcPs]
theta = Maybe (LHsContext GhcPs) -> [LHsType GhcPs]
forall pass. Maybe (LHsContext pass) -> [LHsType pass]
hsConDeclTheta Maybe (LHsContext GhcPs)
mcxt
arg_tys :: [LHsType GhcPs]
arg_tys = HsConDeclDetails GhcPs -> [LHsType GhcPs]
forall pass. HsConDeclDetails pass -> [LBangType pass]
hsConDeclArgTys HsConDeclDetails GhcPs
args
free_tkvs :: [GenLocated SrcSpan RdrName]
free_tkvs = [LHsTyVarBndr GhcPs]
-> [GenLocated SrcSpan RdrName] -> [GenLocated SrcSpan RdrName]
extractHsTvBndrs [LHsTyVarBndr GhcPs]
explicit_tkvs ([GenLocated SrcSpan RdrName] -> [GenLocated SrcSpan RdrName])
-> [GenLocated SrcSpan RdrName] -> [GenLocated SrcSpan RdrName]
forall a b. (a -> b) -> a -> b
$
[LHsType GhcPs] -> [GenLocated SrcSpan RdrName]
extractHsTysRdrTyVarsDups ([LHsType GhcPs]
theta [LHsType GhcPs] -> [LHsType GhcPs] -> [LHsType GhcPs]
forall a. [a] -> [a] -> [a]
++ [LHsType GhcPs]
arg_tys [LHsType GhcPs] -> [LHsType GhcPs] -> [LHsType GhcPs]
forall a. [a] -> [a] -> [a]
++ [LHsType GhcPs
res_ty])
ctxt :: HsDocContext
ctxt = [Located Name] -> HsDocContext
ConDeclCtx [Located Name]
new_names
mb_ctxt :: Maybe SDoc
mb_ctxt = SDoc -> Maybe SDoc
forall a. a -> Maybe a
Just (HsDocContext -> SDoc
inHsDocContext HsDocContext
ctxt)
; String -> SDoc -> TcRn ()
traceRn String
"rnConDecl" ([GenLocated SrcSpan RdrName] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
names SDoc -> SDoc -> SDoc
$$ [GenLocated SrcSpan RdrName] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated SrcSpan RdrName]
free_tkvs SDoc -> SDoc -> SDoc
$$ Bool -> SDoc
forall a. Outputable a => a -> SDoc
ppr Bool
SrcSpanLess (Located Bool)
explicit_forall )
; Bool
-> [GenLocated SrcSpan RdrName]
-> ([Name] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet)
forall a.
Bool
-> [GenLocated SrcSpan RdrName]
-> ([Name] -> RnM (a, NameSet))
-> RnM (a, NameSet)
rnImplicitBndrs (Bool -> Bool
not Bool
SrcSpanLess (Located Bool)
explicit_forall) [GenLocated SrcSpan RdrName]
free_tkvs (([Name] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet))
-> ([Name] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [Name]
implicit_tkvs ->
HsDocContext
-> Maybe SDoc
-> Maybe Any
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet)
forall a b.
HsDocContext
-> Maybe SDoc
-> Maybe a
-> [LHsTyVarBndr GhcPs]
-> ([LHsTyVarBndr GhcRn] -> RnM (b, NameSet))
-> RnM (b, NameSet)
bindLHsTyVarBndrs HsDocContext
ctxt Maybe SDoc
mb_ctxt Maybe Any
forall a. Maybe a
Nothing [LHsTyVarBndr GhcPs]
explicit_tkvs (([LHsTyVarBndr GhcRn] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet))
-> ([LHsTyVarBndr GhcRn] -> RnM (ConDecl GhcRn, NameSet))
-> RnM (ConDecl GhcRn, NameSet)
forall a b. (a -> b) -> a -> b
$ \ [LHsTyVarBndr GhcRn]
explicit_tkvs ->
do { (Maybe (LHsContext GhcRn)
new_cxt, NameSet
fvs1) <- HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), NameSet)
rnMbContext HsDocContext
ctxt Maybe (LHsContext GhcPs)
mcxt
; (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
new_args, NameSet
fvs2) <- Name
-> HsDocContext
-> HsConDeclDetails GhcPs
-> RnM
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
rnConDeclDetails (Located Name -> SrcSpanLess (Located Name)
forall a. HasSrcSpan a => a -> SrcSpanLess a
unLoc ([Located Name] -> Located Name
forall a. [a] -> a
head [Located Name]
new_names)) HsDocContext
ctxt HsConDeclDetails GhcPs
args
; (LHsType GhcRn
new_res_ty, NameSet
fvs3) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnLHsType HsDocContext
ctxt LHsType GhcPs
res_ty
; let all_fvs :: NameSet
all_fvs = NameSet
fvs1 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fvs2 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fvs3
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
args', LHsType GhcRn
res_ty')
= case HsConDeclDetails GhcPs
args of
InfixCon {} -> String
-> SDoc
-> (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
LHsType GhcRn)
forall a. HasCallStack => String -> SDoc -> a
pprPanic String
"rnConDecl" ([GenLocated SrcSpan RdrName] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
names)
RecCon {} -> (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
new_args, LHsType GhcRn
new_res_ty)
PrefixCon [LHsType GhcPs]
as | ([LHsType GhcRn]
arg_tys, LHsType GhcRn
final_res_ty) <- LHsType GhcRn -> ([LHsType GhcRn], LHsType GhcRn)
splitHsFunType LHsType GhcRn
new_res_ty
-> ASSERT( null as )
([LHsType GhcRn]
-> HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
forall arg rec. [arg] -> HsConDetails arg rec
PrefixCon [LHsType GhcRn]
arg_tys, LHsType GhcRn
final_res_ty)
new_qtvs :: LHsQTyVars GhcRn
new_qtvs = HsQTvs :: forall pass. XHsQTvs pass -> [LHsTyVarBndr pass] -> LHsQTyVars pass
HsQTvs { hsq_ext :: XHsQTvs GhcRn
hsq_ext = [Name]
XHsQTvs GhcRn
implicit_tkvs
, hsq_explicit :: [LHsTyVarBndr GhcRn]
hsq_explicit = [LHsTyVarBndr GhcRn]
explicit_tkvs }
; String -> SDoc -> TcRn ()
traceRn String
"rnConDecl2" ([GenLocated SrcSpan RdrName] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [GenLocated SrcSpan RdrName]
[Located (IdP GhcPs)]
names SDoc -> SDoc -> SDoc
$$ [Name] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [Name]
implicit_tkvs SDoc -> SDoc -> SDoc
$$ [LHsTyVarBndr GhcRn] -> SDoc
forall a. Outputable a => a -> SDoc
ppr [LHsTyVarBndr GhcRn]
explicit_tkvs)
; (ConDecl GhcRn, NameSet) -> RnM (ConDecl GhcRn, NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (ConDecl GhcPs
decl { con_g_ext :: XConDeclGADT GhcRn
con_g_ext = XConDeclGADT GhcRn
NoExtField
noExtField, con_names :: [Located (IdP GhcRn)]
con_names = [Located Name]
[Located (IdP GhcRn)]
new_names
, con_qvars :: LHsQTyVars GhcRn
con_qvars = LHsQTyVars GhcRn
new_qtvs, con_mb_cxt :: Maybe (LHsContext GhcRn)
con_mb_cxt = Maybe (LHsContext GhcRn)
new_cxt
, con_args :: HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
con_args = HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
args', con_res_ty :: LHsType GhcRn
con_res_ty = LHsType GhcRn
res_ty'
, con_doc :: Maybe LHsDocString
con_doc = Maybe LHsDocString
mb_doc' },
NameSet
all_fvs) } }
rnConDecl (XConDecl XXConDecl GhcPs
nec) = NoExtCon -> RnM (ConDecl GhcRn, NameSet)
forall a. NoExtCon -> a
noExtCon XXConDecl GhcPs
NoExtCon
nec
rnMbContext :: HsDocContext -> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), FreeVars)
rnMbContext :: HsDocContext
-> Maybe (LHsContext GhcPs)
-> RnM (Maybe (LHsContext GhcRn), NameSet)
rnMbContext HsDocContext
_ Maybe (LHsContext GhcPs)
Nothing = (Maybe (LHsContext GhcRn), NameSet)
-> RnM (Maybe (LHsContext GhcRn), NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe (LHsContext GhcRn)
forall a. Maybe a
Nothing, NameSet
emptyFVs)
rnMbContext HsDocContext
doc (Just LHsContext GhcPs
cxt) = do { (LHsContext GhcRn
ctx',NameSet
fvs) <- HsDocContext -> LHsContext GhcPs -> RnM (LHsContext GhcRn, NameSet)
rnContext HsDocContext
doc LHsContext GhcPs
cxt
; (Maybe (LHsContext GhcRn), NameSet)
-> RnM (Maybe (LHsContext GhcRn), NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsContext GhcRn -> Maybe (LHsContext GhcRn)
forall a. a -> Maybe a
Just LHsContext GhcRn
ctx',NameSet
fvs) }
rnConDeclDetails
:: Name
-> HsDocContext
-> HsConDetails (LHsType GhcPs) (Located [LConDeclField GhcPs])
-> RnM (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
FreeVars)
rnConDeclDetails :: Name
-> HsDocContext
-> HsConDeclDetails GhcPs
-> RnM
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
rnConDeclDetails Name
_ HsDocContext
doc (PrefixCon [LHsType GhcPs]
tys)
= do { ([LHsType GhcRn]
new_tys, NameSet
fvs) <- HsDocContext -> [LHsType GhcPs] -> RnM ([LHsType GhcRn], NameSet)
rnLHsTypes HsDocContext
doc [LHsType GhcPs]
tys
; (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
-> RnM
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return ([LHsType GhcRn]
-> HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
forall arg rec. [arg] -> HsConDetails arg rec
PrefixCon [LHsType GhcRn]
new_tys, NameSet
fvs) }
rnConDeclDetails Name
_ HsDocContext
doc (InfixCon LHsType GhcPs
ty1 LHsType GhcPs
ty2)
= do { (LHsType GhcRn
new_ty1, NameSet
fvs1) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnLHsType HsDocContext
doc LHsType GhcPs
ty1
; (LHsType GhcRn
new_ty2, NameSet
fvs2) <- HsDocContext -> LHsType GhcPs -> RnM (LHsType GhcRn, NameSet)
rnLHsType HsDocContext
doc LHsType GhcPs
ty2
; (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
-> RnM
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (LHsType GhcRn
-> LHsType GhcRn
-> HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
forall arg rec. arg -> arg -> HsConDetails arg rec
InfixCon LHsType GhcRn
new_ty1 LHsType GhcRn
new_ty2, NameSet
fvs1 NameSet -> NameSet -> NameSet
`plusFV` NameSet
fvs2) }
rnConDeclDetails Name
con HsDocContext
doc (RecCon (Located [LConDeclField GhcPs]
-> Located (SrcSpanLess (Located [LConDeclField GhcPs]))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l SrcSpanLess (Located [LConDeclField GhcPs])
fields))
= do { [FieldLabel]
fls <- Name -> RnM [FieldLabel]
lookupConstructorFields Name
con
; ([LConDeclField GhcRn]
new_fields, NameSet
fvs) <- HsDocContext
-> [FieldLabel]
-> [LConDeclField GhcPs]
-> RnM ([LConDeclField GhcRn], NameSet)
rnConDeclFields HsDocContext
doc [FieldLabel]
fls [LConDeclField GhcPs]
SrcSpanLess (Located [LConDeclField GhcPs])
fields
; (HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
-> RnM
(HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn]),
NameSet)
forall (m :: * -> *) a. Monad m => a -> m a
return (Located [LConDeclField GhcRn]
-> HsConDetails (LHsType GhcRn) (Located [LConDeclField GhcRn])
forall arg rec. rec -> HsConDetails arg rec
RecCon (SrcSpan
-> SrcSpanLess (Located [LConDeclField GhcRn])
-> Located [LConDeclField GhcRn]
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l [LConDeclField GhcRn]
SrcSpanLess (Located [LConDeclField GhcRn])
new_fields), NameSet
fvs) }
extendPatSynEnv :: HsValBinds GhcPs -> MiniFixityEnv
-> ([Name] -> TcRnIf TcGblEnv TcLclEnv a) -> TcM a
extendPatSynEnv :: HsValBinds GhcPs
-> MiniFixityEnv
-> ([Name] -> TcRnIf TcGblEnv TcLclEnv a)
-> TcRnIf TcGblEnv TcLclEnv a
extendPatSynEnv HsValBinds GhcPs
val_decls MiniFixityEnv
local_fix_env [Name] -> TcRnIf TcGblEnv TcLclEnv a
thing = do {
[(Name, [FieldLabel])]
names_with_fls <- HsValBinds GhcPs -> TcM [(Name, [FieldLabel])]
new_ps HsValBinds GhcPs
val_decls
; let pat_syn_bndrs :: [Name]
pat_syn_bndrs = [[Name]] -> [Name]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat [ Name
nameName -> [Name] -> [Name]
forall a. a -> [a] -> [a]
: (FieldLabel -> Name) -> [FieldLabel] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map FieldLabel -> Name
forall a. FieldLbl a -> a
flSelector [FieldLabel]
fields
| (Name
name, [FieldLabel]
fields) <- [(Name, [FieldLabel])]
names_with_fls ]
; let avails :: [AvailInfo]
avails = (Name -> AvailInfo) -> [Name] -> [AvailInfo]
forall a b. (a -> b) -> [a] -> [b]
map Name -> AvailInfo
avail [Name]
pat_syn_bndrs
; (TcGblEnv
gbl_env, TcLclEnv
lcl_env) <- [AvailInfo] -> MiniFixityEnv -> RnM (TcGblEnv, TcLclEnv)
extendGlobalRdrEnvRn [AvailInfo]
avails MiniFixityEnv
local_fix_env
; let field_env' :: NameEnv [FieldLabel]
field_env' = NameEnv [FieldLabel]
-> [(Name, [FieldLabel])] -> NameEnv [FieldLabel]
forall a. NameEnv a -> [(Name, a)] -> NameEnv a
extendNameEnvList (TcGblEnv -> NameEnv [FieldLabel]
tcg_field_env TcGblEnv
gbl_env) [(Name, [FieldLabel])]
names_with_fls
final_gbl_env :: TcGblEnv
final_gbl_env = TcGblEnv
gbl_env { tcg_field_env :: NameEnv [FieldLabel]
tcg_field_env = NameEnv [FieldLabel]
field_env' }
; (TcGblEnv, TcLclEnv)
-> TcRnIf TcGblEnv TcLclEnv a -> TcRnIf TcGblEnv TcLclEnv a
forall gbl' lcl' a gbl lcl.
(gbl', lcl') -> TcRnIf gbl' lcl' a -> TcRnIf gbl lcl a
setEnvs (TcGblEnv
final_gbl_env, TcLclEnv
lcl_env) ([Name] -> TcRnIf TcGblEnv TcLclEnv a
thing [Name]
pat_syn_bndrs) }
where
new_ps :: HsValBinds GhcPs -> TcM [(Name, [FieldLabel])]
new_ps :: HsValBinds GhcPs -> TcM [(Name, [FieldLabel])]
new_ps (ValBinds XValBinds GhcPs GhcPs
_ LHsBinds GhcPs
binds [LSig GhcPs]
_) = (LHsBindLR GhcPs GhcPs
-> [(Name, [FieldLabel])] -> TcM [(Name, [FieldLabel])])
-> [(Name, [FieldLabel])]
-> LHsBinds GhcPs
-> TcM [(Name, [FieldLabel])]
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> b -> m b) -> b -> t a -> m b
foldrM LHsBindLR GhcPs GhcPs
-> [(Name, [FieldLabel])] -> TcM [(Name, [FieldLabel])]
new_ps' [] LHsBinds GhcPs
binds
new_ps HsValBinds GhcPs
_ = String -> TcM [(Name, [FieldLabel])]
forall a. String -> a
panic String
"new_ps"
new_ps' :: LHsBindLR GhcPs GhcPs
-> [(Name, [FieldLabel])]
-> TcM [(Name, [FieldLabel])]
new_ps' :: LHsBindLR GhcPs GhcPs
-> [(Name, [FieldLabel])] -> TcM [(Name, [FieldLabel])]
new_ps' LHsBindLR GhcPs GhcPs
bind [(Name, [FieldLabel])]
names
| (LHsBindLR GhcPs GhcPs
-> Located (SrcSpanLess (LHsBindLR GhcPs GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
bind_loc (PatSynBind _ (PSB { psb_id = (dL->L _ n)
, psb_args = RecCon as }))) <- LHsBindLR GhcPs GhcPs
bind
= do
Name
bnd_name <- GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
newTopSrcBinder (SrcSpan
-> SrcSpanLess (GenLocated SrcSpan RdrName)
-> GenLocated SrcSpan RdrName
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
bind_loc SrcSpanLess (GenLocated SrcSpan RdrName)
n)
let rnames :: [GenLocated SrcSpan RdrName]
rnames = (RecordPatSynField (GenLocated SrcSpan RdrName)
-> GenLocated SrcSpan RdrName)
-> [RecordPatSynField (GenLocated SrcSpan RdrName)]
-> [GenLocated SrcSpan RdrName]
forall a b. (a -> b) -> [a] -> [b]
map RecordPatSynField (GenLocated SrcSpan RdrName)
-> GenLocated SrcSpan RdrName
forall a. RecordPatSynField a -> a
recordPatSynSelectorId [RecordPatSynField (GenLocated SrcSpan RdrName)]
[RecordPatSynField (Located (IdP GhcPs))]
as
mkFieldOcc :: Located RdrName -> LFieldOcc GhcPs
mkFieldOcc :: GenLocated SrcSpan RdrName -> LFieldOcc GhcPs
mkFieldOcc (GenLocated SrcSpan RdrName
-> Located (SrcSpanLess (GenLocated SrcSpan RdrName))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l SrcSpanLess (GenLocated SrcSpan RdrName)
name) = SrcSpan -> SrcSpanLess (LFieldOcc GhcPs) -> LFieldOcc GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l (XCFieldOcc GhcPs -> GenLocated SrcSpan RdrName -> FieldOcc GhcPs
forall pass.
XCFieldOcc pass -> GenLocated SrcSpan RdrName -> FieldOcc pass
FieldOcc XCFieldOcc GhcPs
NoExtField
noExtField (SrcSpan
-> SrcSpanLess (GenLocated SrcSpan RdrName)
-> GenLocated SrcSpan RdrName
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (GenLocated SrcSpan RdrName)
name))
field_occs :: [LFieldOcc GhcPs]
field_occs = (GenLocated SrcSpan RdrName -> LFieldOcc GhcPs)
-> [GenLocated SrcSpan RdrName] -> [LFieldOcc GhcPs]
forall a b. (a -> b) -> [a] -> [b]
map GenLocated SrcSpan RdrName -> LFieldOcc GhcPs
mkFieldOcc [GenLocated SrcSpan RdrName]
rnames
[FieldLabel]
flds <- (LFieldOcc GhcPs -> IOEnv (Env TcGblEnv TcLclEnv) FieldLabel)
-> [LFieldOcc GhcPs] -> RnM [FieldLabel]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (Bool
-> [Name]
-> LFieldOcc GhcPs
-> IOEnv (Env TcGblEnv TcLclEnv) FieldLabel
newRecordSelector Bool
False [Name
bnd_name]) [LFieldOcc GhcPs]
field_occs
[(Name, [FieldLabel])] -> TcM [(Name, [FieldLabel])]
forall (m :: * -> *) a. Monad m => a -> m a
return ((Name
bnd_name, [FieldLabel]
flds)(Name, [FieldLabel])
-> [(Name, [FieldLabel])] -> [(Name, [FieldLabel])]
forall a. a -> [a] -> [a]
: [(Name, [FieldLabel])]
names)
| (LHsBindLR GhcPs GhcPs
-> Located (SrcSpanLess (LHsBindLR GhcPs GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
bind_loc (PatSynBind _
(PSB { psb_id = (dL->L _ n)}))) <- LHsBindLR GhcPs GhcPs
bind
= do
Name
bnd_name <- GenLocated SrcSpan RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
newTopSrcBinder (SrcSpan
-> SrcSpanLess (GenLocated SrcSpan RdrName)
-> GenLocated SrcSpan RdrName
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
bind_loc SrcSpanLess (GenLocated SrcSpan RdrName)
n)
[(Name, [FieldLabel])] -> TcM [(Name, [FieldLabel])]
forall (m :: * -> *) a. Monad m => a -> m a
return ((Name
bnd_name, [])(Name, [FieldLabel])
-> [(Name, [FieldLabel])] -> [(Name, [FieldLabel])]
forall a. a -> [a] -> [a]
: [(Name, [FieldLabel])]
names)
| Bool
otherwise
= [(Name, [FieldLabel])] -> TcM [(Name, [FieldLabel])]
forall (m :: * -> *) a. Monad m => a -> m a
return [(Name, [FieldLabel])]
names
rnFds :: [LHsFunDep GhcPs] -> RnM [LHsFunDep GhcRn]
rnFds :: [LHsFunDep GhcPs] -> RnM [LHsFunDep GhcRn]
rnFds [LHsFunDep GhcPs]
fds
= (Located (FunDep (GenLocated SrcSpan RdrName))
-> IOEnv (Env TcGblEnv TcLclEnv) (Located (FunDep (Located Name))))
-> [Located (FunDep (GenLocated SrcSpan RdrName))]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located (FunDep (Located Name))]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ((SrcSpanLess (Located (FunDep (GenLocated SrcSpan RdrName)))
-> TcM (SrcSpanLess (Located (FunDep (Located Name)))))
-> Located (FunDep (GenLocated SrcSpan RdrName))
-> IOEnv (Env TcGblEnv TcLclEnv) (Located (FunDep (Located Name)))
forall a b.
(HasSrcSpan a, HasSrcSpan b) =>
(SrcSpanLess a -> TcM (SrcSpanLess b)) -> a -> TcM b
wrapLocM FunDep (GenLocated SrcSpan RdrName)
-> IOEnv (Env TcGblEnv TcLclEnv) (FunDep (Located Name))
SrcSpanLess (Located (FunDep (GenLocated SrcSpan RdrName)))
-> TcM (SrcSpanLess (Located (FunDep (Located Name))))
rn_fds) [Located (FunDep (GenLocated SrcSpan RdrName))]
[LHsFunDep GhcPs]
fds
where
rn_fds :: FunDep (GenLocated SrcSpan RdrName)
-> IOEnv (Env TcGblEnv TcLclEnv) (FunDep (Located Name))
rn_fds ([GenLocated SrcSpan RdrName]
tys1, [GenLocated SrcSpan RdrName]
tys2)
= do { [Located Name]
tys1' <- [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
rnHsTyVars [GenLocated SrcSpan RdrName]
tys1
; [Located Name]
tys2' <- [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
rnHsTyVars [GenLocated SrcSpan RdrName]
tys2
; FunDep (Located Name)
-> IOEnv (Env TcGblEnv TcLclEnv) (FunDep (Located Name))
forall (m :: * -> *) a. Monad m => a -> m a
return ([Located Name]
tys1', [Located Name]
tys2') }
rnHsTyVars :: [Located RdrName] -> RnM [Located Name]
rnHsTyVars :: [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
rnHsTyVars [GenLocated SrcSpan RdrName]
tvs = (GenLocated SrcSpan RdrName -> RnM (Located Name))
-> [GenLocated SrcSpan RdrName]
-> IOEnv (Env TcGblEnv TcLclEnv) [Located Name]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM GenLocated SrcSpan RdrName -> RnM (Located Name)
rnHsTyVar [GenLocated SrcSpan RdrName]
tvs
rnHsTyVar :: Located RdrName -> RnM (Located Name)
rnHsTyVar :: GenLocated SrcSpan RdrName -> RnM (Located Name)
rnHsTyVar (GenLocated SrcSpan RdrName
-> Located (SrcSpanLess (GenLocated SrcSpan RdrName))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l SrcSpanLess (GenLocated SrcSpan RdrName)
tyvar) = do
Name
tyvar' <- RdrName -> IOEnv (Env TcGblEnv TcLclEnv) Name
lookupOccRn SrcSpanLess (GenLocated SrcSpan RdrName)
RdrName
tyvar
Located Name -> RnM (Located Name)
forall (m :: * -> *) a. Monad m => a -> m a
return (SrcSpan -> SrcSpanLess (Located Name) -> Located Name
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l Name
SrcSpanLess (Located Name)
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, [LHsDecl GhcPs]))
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
forall (m :: * -> *) a. Monad m => a -> m a
return (HsGroup GhcPs
gp, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs])
forall a. Maybe a
Nothing)
addl HsGroup GhcPs
gp ((LHsDecl GhcPs -> Located (SrcSpanLess (LHsDecl GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l SrcSpanLess (LHsDecl GhcPs)
d) : [LHsDecl GhcPs]
ds) = HsGroup GhcPs
-> SrcSpan
-> HsDecl GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
add HsGroup GhcPs
gp SrcSpan
l SrcSpanLess (LHsDecl GhcPs)
HsDecl GhcPs
d [LHsDecl GhcPs]
ds
add :: HsGroup GhcPs -> SrcSpan -> HsDecl GhcPs -> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
add :: HsGroup GhcPs
-> SrcSpan
-> HsDecl GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
add HsGroup GhcPs
gp SrcSpan
_ (SpliceD XSpliceD GhcPs
_ (SpliceDecl XSpliceDecl GhcPs
_ (Located (HsSplice GhcPs)
-> Located (SrcSpanLess (Located (HsSplice GhcPs)))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
_ qq :: SrcSpanLess (Located (HsSplice GhcPs))
qq@HsQuasiQuote{}) SpliceExplicitFlag
_)) [LHsDecl GhcPs]
ds
= do { ([LHsDecl GhcPs]
ds', NameSet
_) <- HsSplice GhcPs -> RnM ([LHsDecl GhcPs], NameSet)
rnTopSpliceDecls SrcSpanLess (Located (HsSplice GhcPs))
HsSplice GhcPs
qq
; HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl HsGroup GhcPs
gp ([LHsDecl GhcPs]
ds' [LHsDecl GhcPs] -> [LHsDecl GhcPs] -> [LHsDecl GhcPs]
forall a. [a] -> [a] -> [a]
++ [LHsDecl GhcPs]
ds)
}
add HsGroup GhcPs
gp SrcSpan
loc (SpliceD XSpliceD GhcPs
_ splice :: SpliceDecl GhcPs
splice@(SpliceDecl XSpliceDecl GhcPs
_ Located (HsSplice GhcPs)
_ SpliceExplicitFlag
flag)) [LHsDecl GhcPs]
ds
= do {
case SpliceExplicitFlag
flag of
SpliceExplicitFlag
ExplicitSplice -> () -> TcRn ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
SpliceExplicitFlag
ImplicitSplice -> do { Bool
th_on <- Extension -> TcRn Bool
forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
xoptM Extension
LangExt.TemplateHaskell
; Bool -> TcRn () -> TcRn ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
th_on (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$ SrcSpan -> TcRn () -> TcRn ()
forall a. SrcSpan -> TcRn a -> TcRn a
setSrcSpan SrcSpan
loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
forall a b. (a -> b) -> a -> b
$
SDoc -> TcRn ()
forall a. SDoc -> TcM a
failWith SDoc
badImplicitSplice }
; (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
forall (m :: * -> *) a. Monad m => a -> m a
return (HsGroup GhcPs
gp, (SpliceDecl GhcPs, [LHsDecl GhcPs])
-> Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs])
forall a. a -> Maybe a
Just (SpliceDecl GhcPs
splice, [LHsDecl GhcPs]
ds)) }
where
badImplicitSplice :: SDoc
badImplicitSplice = String -> SDoc
text String
"Parse error: module header, import declaration"
SDoc -> SDoc -> SDoc
$$ String -> SDoc
text String
"or top-level declaration expected."
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts, hs_fixds :: forall p. HsGroup p -> [LFixitySig p]
hs_fixds = [LFixitySig GhcPs]
fs}) SrcSpan
l (TyClD XTyClD GhcPs
_ TyClDecl GhcPs
d) [LHsDecl GhcPs]
ds
| TyClDecl GhcPs -> Bool
forall pass. TyClDecl pass -> Bool
isClassDecl TyClDecl GhcPs
d
= let fsigs :: [LFixitySig GhcPs]
fsigs = [ SrcSpan -> SrcSpanLess (LFixitySig GhcPs) -> LFixitySig GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LFixitySig GhcPs)
FixitySig GhcPs
f
| (LSig GhcPs -> Located (SrcSpanLess (LSig GhcPs))
forall a. HasSrcSpan a => a -> Located (SrcSpanLess a)
dL->L SrcSpan
l (FixSig _ f)) <- TyClDecl GhcPs -> [LSig GhcPs]
forall pass. TyClDecl pass -> [LSig pass]
tcdSigs TyClDecl GhcPs
d ] in
HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_tyclds :: [TyClGroup GhcPs]
hs_tyclds = LTyClDecl GhcPs -> [TyClGroup GhcPs] -> [TyClGroup GhcPs]
forall (p :: Pass).
LTyClDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_tycld (SrcSpan -> SrcSpanLess (LTyClDecl GhcPs) -> LTyClDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LTyClDecl GhcPs)
TyClDecl GhcPs
d) [TyClGroup GhcPs]
ts, hs_fixds :: [LFixitySig GhcPs]
hs_fixds = [LFixitySig GhcPs]
fsigs [LFixitySig GhcPs] -> [LFixitySig GhcPs] -> [LFixitySig GhcPs]
forall a. [a] -> [a] -> [a]
++ [LFixitySig GhcPs]
fs}) [LHsDecl GhcPs]
ds
| Bool
otherwise
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_tyclds :: [TyClGroup GhcPs]
hs_tyclds = LTyClDecl GhcPs -> [TyClGroup GhcPs] -> [TyClGroup GhcPs]
forall (p :: Pass).
LTyClDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_tycld (SrcSpan -> SrcSpanLess (LTyClDecl GhcPs) -> LTyClDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LTyClDecl GhcPs)
TyClDecl GhcPs
d) [TyClGroup GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_fixds :: forall p. HsGroup p -> [LFixitySig p]
hs_fixds = [LFixitySig GhcPs]
ts}) SrcSpan
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 :: [LFixitySig GhcPs]
hs_fixds = SrcSpan -> SrcSpanLess (LFixitySig GhcPs) -> LFixitySig GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LFixitySig GhcPs)
FixitySig GhcPs
f LFixitySig GhcPs -> [LFixitySig GhcPs] -> [LFixitySig GhcPs]
forall a. a -> [a] -> [a]
: [LFixitySig GhcPs]
ts}) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpan
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 :: [TyClGroup GhcPs]
hs_tyclds = LStandaloneKindSig GhcPs -> [TyClGroup GhcPs] -> [TyClGroup GhcPs]
forall (p :: Pass).
LStandaloneKindSig (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_kisig (SrcSpan
-> SrcSpanLess (LStandaloneKindSig GhcPs)
-> LStandaloneKindSig GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LStandaloneKindSig GhcPs)
StandaloneKindSig GhcPs
s) [TyClGroup GhcPs]
ts}) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_valds :: forall p. HsGroup p -> HsValBinds p
hs_valds = HsValBinds GhcPs
ts}) SrcSpan
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 :: HsValBinds GhcPs
hs_valds = LSig GhcPs -> HsValBinds GhcPs -> HsValBinds GhcPs
forall (a :: Pass).
LSig (GhcPass a)
-> HsValBinds (GhcPass a) -> HsValBinds (GhcPass a)
add_sig (SrcSpan -> SrcSpanLess (LSig GhcPs) -> LSig GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LSig GhcPs)
Sig GhcPs
d) HsValBinds GhcPs
ts}) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_valds :: forall p. HsGroup p -> HsValBinds p
hs_valds = HsValBinds GhcPs
ts}) SrcSpan
l (ValD XValD GhcPs
_ HsBind GhcPs
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_valds :: HsValBinds GhcPs
hs_valds = LHsBindLR GhcPs GhcPs -> HsValBinds GhcPs -> HsValBinds GhcPs
forall a. LHsBind a -> HsValBinds a -> HsValBinds a
add_bind (SrcSpan
-> SrcSpanLess (LHsBindLR GhcPs GhcPs) -> LHsBindLR GhcPs GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LHsBindLR GhcPs GhcPs)
HsBind GhcPs
d) HsValBinds GhcPs
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpan
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 :: [TyClGroup GhcPs]
hs_tyclds = LRoleAnnotDecl GhcPs -> [TyClGroup GhcPs] -> [TyClGroup GhcPs]
forall (p :: Pass).
LRoleAnnotDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_role_annot (SrcSpan
-> SrcSpanLess (LRoleAnnotDecl GhcPs) -> LRoleAnnotDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LRoleAnnotDecl GhcPs)
RoleAnnotDecl GhcPs
d) [TyClGroup GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_tyclds :: forall p. HsGroup p -> [TyClGroup p]
hs_tyclds = [TyClGroup GhcPs]
ts}) SrcSpan
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 :: [TyClGroup GhcPs]
hs_tyclds = LInstDecl GhcPs -> [TyClGroup GhcPs] -> [TyClGroup GhcPs]
forall (p :: Pass).
LInstDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_instd (SrcSpan -> SrcSpanLess (LInstDecl GhcPs) -> LInstDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LInstDecl GhcPs)
InstDecl GhcPs
d) [TyClGroup GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_derivds :: forall p. HsGroup p -> [LDerivDecl p]
hs_derivds = [LDerivDecl GhcPs]
ts}) SrcSpan
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 :: [LDerivDecl GhcPs]
hs_derivds = SrcSpan -> SrcSpanLess (LDerivDecl GhcPs) -> LDerivDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LDerivDecl GhcPs)
DerivDecl GhcPs
d LDerivDecl GhcPs -> [LDerivDecl GhcPs] -> [LDerivDecl GhcPs]
forall a. a -> [a] -> [a]
: [LDerivDecl GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_defds :: forall p. HsGroup p -> [LDefaultDecl p]
hs_defds = [LDefaultDecl GhcPs]
ts}) SrcSpan
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 :: [LDefaultDecl GhcPs]
hs_defds = SrcSpan -> SrcSpanLess (LDefaultDecl GhcPs) -> LDefaultDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LDefaultDecl GhcPs)
DefaultDecl GhcPs
d LDefaultDecl GhcPs -> [LDefaultDecl GhcPs] -> [LDefaultDecl GhcPs]
forall a. a -> [a] -> [a]
: [LDefaultDecl GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_fords :: forall p. HsGroup p -> [LForeignDecl p]
hs_fords = [LForeignDecl GhcPs]
ts}) SrcSpan
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 :: [LForeignDecl GhcPs]
hs_fords = SrcSpan -> SrcSpanLess (LForeignDecl GhcPs) -> LForeignDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LForeignDecl GhcPs)
ForeignDecl GhcPs
d LForeignDecl GhcPs -> [LForeignDecl GhcPs] -> [LForeignDecl GhcPs]
forall a. a -> [a] -> [a]
: [LForeignDecl GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_warnds :: forall p. HsGroup p -> [LWarnDecls p]
hs_warnds = [LWarnDecls GhcPs]
ts}) SrcSpan
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 :: [LWarnDecls GhcPs]
hs_warnds = SrcSpan -> SrcSpanLess (LWarnDecls GhcPs) -> LWarnDecls GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LWarnDecls GhcPs)
WarnDecls GhcPs
d LWarnDecls GhcPs -> [LWarnDecls GhcPs] -> [LWarnDecls GhcPs]
forall a. a -> [a] -> [a]
: [LWarnDecls GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_annds :: forall p. HsGroup p -> [LAnnDecl p]
hs_annds = [LAnnDecl GhcPs]
ts}) SrcSpan
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 :: [LAnnDecl GhcPs]
hs_annds = SrcSpan -> SrcSpanLess (LAnnDecl GhcPs) -> LAnnDecl GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LAnnDecl GhcPs)
AnnDecl GhcPs
d LAnnDecl GhcPs -> [LAnnDecl GhcPs] -> [LAnnDecl GhcPs]
forall a. a -> [a] -> [a]
: [LAnnDecl GhcPs]
ts }) [LHsDecl GhcPs]
ds
add gp :: HsGroup GhcPs
gp@(HsGroup {hs_ruleds :: forall p. HsGroup p -> [LRuleDecls p]
hs_ruleds = [LRuleDecls GhcPs]
ts}) SrcSpan
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 :: [LRuleDecls GhcPs]
hs_ruleds = SrcSpan -> SrcSpanLess (LRuleDecls GhcPs) -> LRuleDecls GhcPs
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess (LRuleDecls GhcPs)
RuleDecls GhcPs
d LRuleDecls GhcPs -> [LRuleDecls GhcPs] -> [LRuleDecls GhcPs]
forall a. a -> [a] -> [a]
: [LRuleDecls GhcPs]
ts }) [LHsDecl GhcPs]
ds
add HsGroup GhcPs
gp SrcSpan
l (DocD XDocD GhcPs
_ DocDecl
d) [LHsDecl GhcPs]
ds
= HsGroup GhcPs
-> [LHsDecl GhcPs]
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
addl (HsGroup GhcPs
gp { hs_docs :: [LDocDecl]
hs_docs = (SrcSpan -> SrcSpanLess LDocDecl -> LDocDecl
forall a. HasSrcSpan a => SrcSpan -> SrcSpanLess a -> a
cL SrcSpan
l SrcSpanLess LDocDecl
DocDecl
d) LDocDecl -> [LDocDecl] -> [LDocDecl]
forall a. a -> [a] -> [a]
: (HsGroup GhcPs -> [LDocDecl]
forall p. HsGroup p -> [LDocDecl]
hs_docs HsGroup GhcPs
gp) }) [LHsDecl GhcPs]
ds
add (HsGroup {}) SrcSpan
_ (SpliceD XSpliceD GhcPs
_ (XSpliceDecl XXSpliceDecl GhcPs
nec)) [LHsDecl GhcPs]
_ = NoExtCon
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
forall a. NoExtCon -> a
noExtCon XXSpliceDecl GhcPs
NoExtCon
nec
add (HsGroup {}) SrcSpan
_ (XHsDecl XXHsDecl GhcPs
nec) [LHsDecl GhcPs]
_ = NoExtCon
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
forall a. NoExtCon -> a
noExtCon XXHsDecl GhcPs
NoExtCon
nec
add (XHsGroup XXHsGroup GhcPs
nec) SrcSpan
_ HsDecl GhcPs
_ [LHsDecl GhcPs]
_ = NoExtCon
-> RnM (HsGroup GhcPs, Maybe (SpliceDecl GhcPs, [LHsDecl GhcPs]))
forall a. NoExtCon -> a
noExtCon XXHsGroup GhcPs
NoExtCon
nec
add_tycld :: LTyClDecl (GhcPass p) -> [TyClGroup (GhcPass p)]
-> [TyClGroup (GhcPass p)]
add_tycld :: LTyClDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_tycld LTyClDecl (GhcPass p)
d [] = [TyClGroup :: forall pass.
XCTyClGroup pass
-> [LTyClDecl pass]
-> [LRoleAnnotDecl pass]
-> [LStandaloneKindSig pass]
-> [LInstDecl pass]
-> TyClGroup pass
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 :: [LTyClDecl (GhcPass p)]
group_tyclds = LTyClDecl (GhcPass p)
d LTyClDecl (GhcPass p)
-> [LTyClDecl (GhcPass p)] -> [LTyClDecl (GhcPass p)]
forall a. a -> [a] -> [a]
: [LTyClDecl (GhcPass p)]
tyclds } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
dss
add_tycld LTyClDecl (GhcPass p)
_ (XTyClGroup XXTyClGroup (GhcPass p)
nec: [TyClGroup (GhcPass p)]
_) = NoExtCon -> [TyClGroup (GhcPass p)]
forall a. NoExtCon -> a
noExtCon XXTyClGroup (GhcPass p)
NoExtCon
nec
add_instd :: LInstDecl (GhcPass p) -> [TyClGroup (GhcPass p)]
-> [TyClGroup (GhcPass p)]
add_instd :: LInstDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_instd LInstDecl (GhcPass p)
d [] = [TyClGroup :: forall pass.
XCTyClGroup pass
-> [LTyClDecl pass]
-> [LRoleAnnotDecl pass]
-> [LStandaloneKindSig pass]
-> [LInstDecl pass]
-> TyClGroup pass
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 :: [LInstDecl (GhcPass p)]
group_instds = LInstDecl (GhcPass p)
d LInstDecl (GhcPass p)
-> [LInstDecl (GhcPass p)] -> [LInstDecl (GhcPass p)]
forall a. a -> [a] -> [a]
: [LInstDecl (GhcPass p)]
instds } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
dss
add_instd LInstDecl (GhcPass p)
_ (XTyClGroup XXTyClGroup (GhcPass p)
nec: [TyClGroup (GhcPass p)]
_) = NoExtCon -> [TyClGroup (GhcPass p)]
forall a. NoExtCon -> a
noExtCon XXTyClGroup (GhcPass p)
NoExtCon
nec
add_role_annot :: LRoleAnnotDecl (GhcPass p) -> [TyClGroup (GhcPass p)]
-> [TyClGroup (GhcPass p)]
add_role_annot :: LRoleAnnotDecl (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_role_annot LRoleAnnotDecl (GhcPass p)
d [] = [TyClGroup :: forall pass.
XCTyClGroup pass
-> [LTyClDecl pass]
-> [LRoleAnnotDecl pass]
-> [LStandaloneKindSig pass]
-> [LInstDecl pass]
-> TyClGroup pass
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 :: [LRoleAnnotDecl (GhcPass p)]
group_roles = LRoleAnnotDecl (GhcPass p)
d LRoleAnnotDecl (GhcPass p)
-> [LRoleAnnotDecl (GhcPass p)] -> [LRoleAnnotDecl (GhcPass p)]
forall a. a -> [a] -> [a]
: [LRoleAnnotDecl (GhcPass p)]
roles } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
rest
add_role_annot LRoleAnnotDecl (GhcPass p)
_ (XTyClGroup XXTyClGroup (GhcPass p)
nec: [TyClGroup (GhcPass p)]
_) = NoExtCon -> [TyClGroup (GhcPass p)]
forall a. NoExtCon -> a
noExtCon XXTyClGroup (GhcPass p)
NoExtCon
nec
add_kisig :: LStandaloneKindSig (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_kisig :: LStandaloneKindSig (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
add_kisig LStandaloneKindSig (GhcPass p)
d [] = [TyClGroup :: forall pass.
XCTyClGroup pass
-> [LTyClDecl pass]
-> [LRoleAnnotDecl pass]
-> [LStandaloneKindSig pass]
-> [LInstDecl pass]
-> TyClGroup pass
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 :: [LStandaloneKindSig (GhcPass p)]
group_kisigs = LStandaloneKindSig (GhcPass p)
d LStandaloneKindSig (GhcPass p)
-> [LStandaloneKindSig (GhcPass p)]
-> [LStandaloneKindSig (GhcPass p)]
forall a. a -> [a] -> [a]
: [LStandaloneKindSig (GhcPass p)]
kisigs } TyClGroup (GhcPass p)
-> [TyClGroup (GhcPass p)] -> [TyClGroup (GhcPass p)]
forall a. a -> [a] -> [a]
: [TyClGroup (GhcPass p)]
rest
add_kisig LStandaloneKindSig (GhcPass p)
_ (XTyClGroup XXTyClGroup (GhcPass p)
nec : [TyClGroup (GhcPass p)]
_) = NoExtCon -> [TyClGroup (GhcPass p)]
forall a. NoExtCon -> a
noExtCon XXTyClGroup (GhcPass p)
NoExtCon
nec
add_bind :: LHsBind a -> HsValBinds a -> HsValBinds a
add_bind :: 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] -> HsValBinds 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 -> LHsBind a -> LHsBindsLR a a
forall a. Bag a -> a -> Bag a
`snocBag` LHsBind a
b) [LSig a]
sigs
add_bind LHsBind a
_ (XValBindsLR {}) = String -> HsValBinds a
forall a. String -> a
panic String
"RdrHsSyn:add_bind"
add_sig :: LSig (GhcPass a) -> HsValBinds (GhcPass a) -> HsValBinds (GhcPass a)
add_sig :: 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)]
-> HsValBinds (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)
sLSig (GhcPass a) -> [LSig (GhcPass a)] -> [LSig (GhcPass a)]
forall a. a -> [a] -> [a]
:[LSig (GhcPass a)]
sigs)
add_sig LSig (GhcPass a)
_ (XValBindsLR {}) = String -> HsValBinds (GhcPass a)
forall a. String -> a
panic String
"RdrHsSyn:add_sig"