diff options
Diffstat (limited to 'compiler/GHC/Rename')
-rw-r--r-- | compiler/GHC/Rename/HsType.hs | 29 | ||||
-rw-r--r-- | compiler/GHC/Rename/Module.hs | 66 | ||||
-rw-r--r-- | compiler/GHC/Rename/Names.hs | 2 | ||||
-rw-r--r-- | compiler/GHC/Rename/Utils.hs | 2 |
4 files changed, 60 insertions, 39 deletions
diff --git a/compiler/GHC/Rename/HsType.hs b/compiler/GHC/Rename/HsType.hs index bbcd5244af..5d1da01b37 100644 --- a/compiler/GHC/Rename/HsType.hs +++ b/compiler/GHC/Rename/HsType.hs @@ -35,7 +35,7 @@ module GHC.Rename.HsType ( FreeKiTyVars, filterInScopeM, extractHsTyRdrTyVars, extractHsTyRdrTyVarsKindVars, extractHsTysRdrTyVars, extractRdrKindSigVars, - extractConDeclGADTDetailsTyVars, extractDataDefnKindVars, + extractConGadtSigBodyTyVars, extractDataDefnKindVars, extractHsOuterTvBndrs, extractHsTyArgRdrKiTyVars, nubL, nubN ) where @@ -1903,14 +1903,21 @@ extractRdrKindSigVars (L _ resultSig) = case resultSig of TyVarSig _ (L _ (KindedTyVar _ _ _ k)) -> extractHsTyRdrTyVars k _ -> [] --- | Extracts free type and kind variables from an argument in a GADT --- constructor, returning variable occurrences in left-to-right order. --- See @Note [Ordering of implicit variables]@. -extractConDeclGADTDetailsTyVars :: - HsConDeclGADTDetails GhcPs -> FreeKiTyVars -> FreeKiTyVars -extractConDeclGADTDetailsTyVars con_args = case con_args of - PrefixConGADT args -> extract_scaled_ltys args - RecConGADT (L _ flds) _ -> extract_ltys $ map (cd_fld_type . unLoc) $ flds +-- | Extracts free type and kind variables from the argument and result types +-- in a GADT constructor, returning variable occurrences in left-to-right +-- order. See @Note [Ordering of implicit variables]@. +extractConGadtSigBodyTyVars :: ConGadtSigBody GhcPs -> FreeKiTyVars +extractConGadtSigBodyTyVars body = case body of + PrefixConGADT body' -> extract_prefix_con_gadt_sig_body body' + RecConGADT (L _ flds) _ res -> extract_ltys (map (cd_fld_type . unLoc) flds) $ + extractHsTyRdrTyVars res + +extract_prefix_con_gadt_sig_body :: PrefixConGadtSigBody GhcPs -> FreeKiTyVars +extract_prefix_con_gadt_sig_body prefix_body = go prefix_body [] + where + go :: PrefixConGadtSigBody GhcPs -> FreeKiTyVars -> FreeKiTyVars + go (PCGSRes res_ty) acc = extract_lty res_ty acc + go (PCGSAnonArg arg body) acc = extract_scaled_lty arg (go body acc) -- | Get type/kind variables mentioned in the kind signature, preserving -- left-to-right order: @@ -1926,10 +1933,6 @@ extractDataDefnKindVars (HsDataDefn { dd_kindSig = ksig }) extract_lctxt :: LHsContext GhcPs -> FreeKiTyVars -> FreeKiTyVars extract_lctxt ctxt = extract_ltys (unLoc ctxt) -extract_scaled_ltys :: [HsScaled GhcPs (LHsType GhcPs)] - -> FreeKiTyVars -> FreeKiTyVars -extract_scaled_ltys args acc = foldr extract_scaled_lty acc args - extract_scaled_lty :: HsScaled GhcPs (LHsType GhcPs) -> FreeKiTyVars -> FreeKiTyVars extract_scaled_lty (HsScaled m ty) acc = extract_lty ty $ extract_hs_arrow m acc diff --git a/compiler/GHC/Rename/Module.hs b/compiler/GHC/Rename/Module.hs index 29937ea5f0..6b152bcb57 100644 --- a/compiler/GHC/Rename/Module.hs +++ b/compiler/GHC/Rename/Module.hs @@ -2352,8 +2352,7 @@ rnConDecl decl@(ConDeclH98 { con_name = name, con_ex_tvs = ex_tvs rnConDecl (ConDeclGADT { con_names = names , con_bndrs = L l outer_bndrs , con_mb_cxt = mcxt - , con_g_args = args - , con_res_ty = res_ty + , con_body = body , con_doc = mb_doc }) = do { mapM_ (addLocMA checkConName) names ; new_names <- mapM (lookupLocatedTopConstructorRnN) names @@ -2366,31 +2365,22 @@ rnConDecl (ConDeclGADT { con_names = names implicit_bndrs = extractHsOuterTvBndrs outer_bndrs $ extractHsTysRdrTyVars (hsConDeclTheta mcxt) $ - extractConDeclGADTDetailsTyVars args $ - extractHsTysRdrTyVars [res_ty] [] + extractConGadtSigBodyTyVars body ; let ctxt = ConDeclCtx new_names ; bindHsOuterTyVarBndrs ctxt Nothing implicit_bndrs outer_bndrs $ \outer_bndrs' -> do { (new_cxt, fvs1) <- rnMbContext ctxt mcxt - ; (new_args, fvs2) <- rnConDeclGADTDetails (unLoc (head new_names)) ctxt args - ; (new_res_ty, fvs3) <- rnLHsType ctxt res_ty + ; (new_body, fvs2) <- rnConGadtSigBody (unLoc (head new_names)) ctxt body - -- Ensure that there are no nested `forall`s or contexts, per - -- Note [GADT abstract syntax] (Wrinkle: No nested foralls or contexts) - -- in GHC.Hs.Type. - ; addNoNestedForallsContextsErr ctxt - (text "GADT constructor type signature") new_res_ty - - ; let all_fvs = fvs1 `plusFV` fvs2 `plusFV` fvs3 + ; let all_fvs = fvs1 `plusFV` fvs2 ; traceRn "rnConDecl (ConDeclGADT)" (ppr names $$ ppr outer_bndrs') ; new_mb_doc <- traverse rnLHsDoc mb_doc ; return (ConDeclGADT { con_g_ext = noAnn, con_names = new_names , con_bndrs = L l outer_bndrs', con_mb_cxt = new_cxt - , con_g_args = new_args, con_res_ty = new_res_ty - , con_doc = new_mb_doc }, + , con_body = new_body, con_doc = new_mb_doc }, all_fvs) } } rnMbContext :: HsDocContext -> Maybe (LHsContext GhcPs) @@ -2415,17 +2405,32 @@ rnConDeclH98Details con doc (RecCon flds) = do { (new_flds, fvs) <- rnRecConDeclFields con doc flds ; return (RecCon new_flds, fvs) } -rnConDeclGADTDetails :: +rnConGadtSigBody :: Name -> HsDocContext - -> HsConDeclGADTDetails GhcPs - -> RnM (HsConDeclGADTDetails GhcRn, FreeVars) -rnConDeclGADTDetails _ doc (PrefixConGADT tys) - = do { (new_tys, fvs) <- mapFvRn (rnScaledLHsType doc) tys - ; return (PrefixConGADT new_tys, fvs) } -rnConDeclGADTDetails con doc (RecConGADT flds arr) - = do { (new_flds, fvs) <- rnRecConDeclFields con doc flds - ; return (RecConGADT new_flds arr, fvs) } + -> ConGadtSigBody GhcPs + -> RnM (ConGadtSigBody GhcRn, FreeVars) +rnConGadtSigBody _ doc (PrefixConGADT body) + = do { (new_body, fvs) <- rnPrefixConGadtSigBody doc body + ; return (PrefixConGADT new_body, fvs) } +rnConGadtSigBody con doc (RecConGADT flds arr res_ty) + = do { (new_flds, fvs1) <- rnRecConDeclFields con doc flds + ; (new_res_ty, fvs2) <- rnGADTResultTy doc res_ty + ; return (RecConGADT new_flds arr new_res_ty, fvs1 `plusFV` fvs2) } + +rnPrefixConGadtSigBody :: + HsDocContext + -> PrefixConGadtSigBody GhcPs + -> RnM (PrefixConGadtSigBody GhcRn, FreeVars) +rnPrefixConGadtSigBody doc = go + where + go (PCGSRes res_ty) = do + (new_res_ty, fvs) <- rnGADTResultTy doc res_ty + pure (PCGSRes new_res_ty, fvs) + go (PCGSAnonArg arg_ty body) = do + (new_arg_ty, fvs1) <- rnScaledLHsType doc arg_ty + (new_body, fvs2) <- go body + pure (PCGSAnonArg new_arg_ty new_body, fvs1 `plusFV` fvs2) rnRecConDeclFields :: Name @@ -2439,6 +2444,19 @@ rnRecConDeclFields con doc (L l fields) -- since that is done by GHC.Rename.Names.extendGlobalRdrEnvRn ; pure (L l new_fields, fvs) } +rnGADTResultTy :: + HsDocContext + -> LHsType GhcPs + -> RnM (LHsType GhcRn, FreeVars) +rnGADTResultTy doc res_ty + = do { (new_res_ty, fvs) <- rnLHsType doc res_ty + -- Ensure that there are no nested `forall`s or contexts, per + -- Note [GADT abstract syntax] (Wrinkle: No nested foralls or contexts) + -- in Language.Haskell.Syntax.Decls. + ; addNoNestedForallsContextsErr doc + (text "GADT constructor type signature") new_res_ty + ; pure (new_res_ty, fvs) } + ------------------------------------------------- -- | Brings pattern synonym names and also pattern synonym selectors diff --git a/compiler/GHC/Rename/Names.hs b/compiler/GHC/Rename/Names.hs index 3a4cb78820..7b473a532e 100644 --- a/compiler/GHC/Rename/Names.hs +++ b/compiler/GHC/Rename/Names.hs @@ -978,7 +978,7 @@ getLocalNonValBinders fixity_env = [( find_con_name rdr , concatMap find_con_decl_flds (unLoc cdflds) )] find_con_flds (L _ (ConDeclGADT { con_names = rdrs - , con_g_args = RecConGADT flds _ })) + , con_body = RecConGADT flds _ _ })) = [ ( find_con_name rdr , concatMap find_con_decl_flds (unLoc flds)) | L _ rdr <- rdrs ] diff --git a/compiler/GHC/Rename/Utils.hs b/compiler/GHC/Rename/Utils.hs index 597af3d778..796853ae82 100644 --- a/compiler/GHC/Rename/Utils.hs +++ b/compiler/GHC/Rename/Utils.hs @@ -278,7 +278,7 @@ Note [No nested foralls or contexts in instance types] in GHC.Hs.Type). -- -- * In GADT constructor types (in 'rnConDecl'). -- See @Note [GADT abstract syntax] (Wrinkle: No nested foralls or contexts)@ --- in "GHC.Hs.Type". +-- in "Language.Haskell.Syntax.Decls". -- -- * In instance declaration types (in 'rnClsIntDecl' and 'rnSrcDerivDecl' in -- "GHC.Rename.Module" and 'renameSig' in "GHC.Rename.Bind"). |