[Git][ghc/ghc][wip/T18462] Unannotated multiplicity based on type
Sjoerd Visscher (@trac-sjoerd_visscher)
gitlab at gitlab.haskell.org
Thu Jan 23 16:46:39 UTC 2025
Sjoerd Visscher pushed to branch wip/T18462 at Glasgow Haskell Compiler / GHC
Commits:
6e6533de by Sjoerd Visscher at 2025-01-23T17:46:14+01:00
Unannotated multiplicity based on type
- - - - -
28 changed files:
- compiler/GHC/Hs/Instances.hs
- compiler/GHC/Hs/Type.hs
- compiler/GHC/HsToCore/Quote.hs
- compiler/GHC/Iface/Ext/Ast.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Rename/HsType.hs
- compiler/GHC/Rename/Module.hs
- compiler/GHC/Rename/Pat.hs
- compiler/GHC/Tc/Gen/App.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/TyCl.hs
- compiler/GHC/ThToHs.hs
- compiler/Language/Haskell/Syntax/Decls.hs
- compiler/Language/Haskell/Syntax/Type.hs
- testsuite/tests/ghc-api/exactprint/Test20239.stderr
- testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
- testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr
- testsuite/tests/parser/should_compile/DumpParsedAst.stderr
- testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
- testsuite/tests/parser/should_compile/T14189.stderr
- testsuite/tests/printer/T18791.stderr
- utils/check-exact/ExactPrint.hs
- utils/haddock/haddock-api/src/Haddock/Backends/LaTeX.hs
- utils/haddock/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
- utils/haddock/haddock-api/src/Haddock/Convert.hs
- utils/haddock/haddock-api/src/Haddock/GhcUtils.hs
- utils/haddock/haddock-api/src/Haddock/Interface/Rename.hs
Changes:
=====================================
compiler/GHC/Hs/Instances.hs
=====================================
@@ -539,11 +539,11 @@ deriving instance Data (HsTyLit GhcTc)
-- deriving instance (Data mult, DataIdLR p p, Typeable on) => Data (HsMultAnnOn on mult p)
deriving instance Data (HsMultAnnOn OnArrow (LocatedA (HsType GhcPs)) GhcPs)
-deriving instance Data (HsMultAnnOn OnRecField (LocatedA (HsType GhcPs)) GhcPs)
+deriving instance Data (HsMultAnnOn OnConField (LocatedA (HsType GhcPs)) GhcPs)
deriving instance Typeable on => Data (HsMultAnnOn on (LocatedA (HsType GhcRn)) GhcRn)
deriving instance Typeable on => Data (HsMultAnnOn on (LocatedA (HsType GhcTc)) GhcTc)
deriving instance Data (HsMultAnnOn OnArrow (LocatedA (HsExpr GhcPs)) GhcPs)
-deriving instance Data (HsMultAnnOn OnRecField (LocatedA (HsExpr GhcPs)) GhcPs)
+deriving instance Data (HsMultAnnOn OnConField (LocatedA (HsExpr GhcPs)) GhcPs)
deriving instance Typeable on => Data (HsMultAnnOn on (LocatedA (HsExpr GhcRn)) GhcRn)
deriving instance Typeable on => Data (HsMultAnnOn on (LocatedA (HsExpr GhcTc)) GhcTc)
@@ -559,7 +559,7 @@ deriving instance Data (ConDeclField GhcTc)
-- deriving instance (DataIdLR p p, Typeable on) => Data (HsConFieldSpec on p)
deriving instance Data (HsConFieldSpec OnArrow GhcPs)
-deriving instance Data (HsConFieldSpec OnRecField GhcPs)
+deriving instance Data (HsConFieldSpec OnConField GhcPs)
deriving instance Typeable on => Data (HsConFieldSpec on GhcRn)
deriving instance Typeable on => Data (HsConFieldSpec on GhcTc)
=====================================
compiler/GHC/Hs/Type.hs
=====================================
@@ -26,9 +26,9 @@ GHC.Hs.Type: Abstract syntax: user-defined types
module GHC.Hs.Type (
Mult,
HsArrow, HsArrowOf, HsMultAnnOn(..), HsMultAnnOnWhat(..),
- HsUnannotatedMult(..), pattern HsUnrestrictedArrow, multAnnToHsType, expandHsMultAnnOn,
+ pattern HsUnrestrictedArrow, multAnnToHsType, expandHsMultAnnOn,
EpLinearArrow(..),
- hsNoMultAnn, isUnrestricted, hsMultIsLinear,
+ hsNoMultAnn, isUnrestricted,
pprHsArrow,
HsType(..), HsCoreTy, LHsType, HsKind, LHsKind,
@@ -129,7 +129,7 @@ import GHC.Utils.Outputable
import GHC.Utils.Misc (count)
import Data.Maybe
-import Data.Data (Data)
+import Data.Data (Data, Proxy (..))
import qualified Data.Semigroup as S
import GHC.Data.Bag
@@ -531,39 +531,46 @@ instance NoAnn EpLinearArrow where
noAnn = EpPct1 noAnn noAnn
type instance XUnannotated OnArrow _ GhcPs = TokRarrow
-type instance XUnannotated OnRecField _ GhcPs = TokDcolon
+type instance XUnannotated OnConField _ GhcPs = TokDcolon
type instance XUnannotated _ _ GhcRn = NoExtField
type instance XUnannotated _ _ GhcTc = NoExtField
type instance XLinearAnn OnArrow _ GhcPs = EpLinearArrow
-type instance XLinearAnn OnRecField _ GhcPs = (EpToken "%1", TokDcolon)
+type instance XLinearAnn OnConField _ GhcPs = (EpToken "%1", TokDcolon)
type instance XLinearAnn _ _ GhcRn = NoExtField
type instance XLinearAnn _ _ GhcTc = NoExtField
type instance XExplicitMult OnArrow _ GhcPs = (EpToken "%", TokRarrow)
-type instance XExplicitMult OnRecField _ GhcPs = (EpToken "%", TokDcolon)
+type instance XExplicitMult OnConField _ GhcPs = (EpToken "%", TokDcolon)
type instance XExplicitMult _ _ GhcRn = NoExtField
type instance XExplicitMult _ _ GhcTc = NoExtField
type instance XXMultAnnOn _ _ (GhcPass _) = DataConCantHappen
-hsNoMultAnn :: NoAnn (XUnannotated on (LHsType GhcPs) GhcPs) => HsMultAnnOn on (LHsType GhcPs) GhcPs
-hsNoMultAnn = HsUnannotated HsUnannOne noAnn
+hsNoMultAnn :: NoAnn (XUnannotated on (LHsType GhcPs) GhcPs)
+ => HsMultAnnOn on (LHsType GhcPs) GhcPs
+hsNoMultAnn = HsUnannotated noAnn
isUnrestricted :: HsArrow GhcRn -> Bool
isUnrestricted (multAnnToHsType -> L _ (HsTyVar _ _ (L _ n))) = n == manyDataConName
isUnrestricted _ = False
-multAnnToHsType :: HsMultAnnOn on (LHsType GhcRn) GhcRn -> LHsType GhcRn
+multAnnToHsType :: IsHsMultAnnOnWhat on => HsMultAnnOn on (LHsType GhcRn) GhcRn -> LHsType GhcRn
multAnnToHsType = expandHsMultAnnOn (HsTyVar noAnn NotPromoted)
-- | Convert an multiplicity annotation into its corresponding multiplicity.
-- In essence this erases the information of whether the programmer wrote an explicit
-- multiplicity or a shorthand.
-- In this polymorphic function, `t` can be `HsType` or `HsExpr`
-expandHsMultAnnOn :: (LocatedN Name -> t GhcRn) -> HsMultAnnOn on (LocatedA (t GhcRn)) GhcRn -> LocatedA (t GhcRn)
-expandHsMultAnnOn mk_var (HsUnannotated HsUnannOne _) = noLocA (mk_var (noLocA oneDataConName))
-expandHsMultAnnOn mk_var (HsUnannotated HsUnannMany _) = noLocA (mk_var (noLocA manyDataConName))
+expandHsMultAnnOn :: forall on t. IsHsMultAnnOnWhat on
+ => (LocatedN Name -> t GhcRn)
+ -> HsMultAnnOn on (LocatedA (t GhcRn)) GhcRn
+ -> LocatedA (t GhcRn)
+expandHsMultAnnOn mk_var (HsUnannotated _) = noLocA (mk_var (noLocA mult))
+ where
+ mult = case hsMultAnnOnWhat (Proxy :: Proxy on) of
+ OnArrow -> manyDataConName
+ OnConField -> oneDataConName
expandHsMultAnnOn mk_var (HsLinearAnn _) = noLocA (mk_var (noLocA oneDataConName))
expandHsMultAnnOn _mk_var (HsExplicitMult _ p) = p
@@ -574,7 +581,7 @@ instance
-- See #18846
pprHsArrow :: (Outputable mult, OutputableBndrId pass) => HsArrowOf mult (GhcPass pass) -> SDoc
-pprHsArrow (HsUnannotated _ _) = pprArrowWithMultiplicity visArgTypeLike (Left False)
+pprHsArrow (HsUnannotated _) = pprArrowWithMultiplicity visArgTypeLike (Left False)
pprHsArrow (HsLinearAnn _) = pprArrowWithMultiplicity visArgTypeLike (Left True)
pprHsArrow (HsExplicitMult _ p) = pprArrowWithMultiplicity visArgTypeLike (Right (ppr p))
@@ -591,7 +598,7 @@ instance OutputableBndrId p
ppr_mult :: HsMultAnnOn on (LHsType (GhcPass p)) (GhcPass p) -> SDoc -> SDoc
ppr_mult mult tyDoc = case mult of
- HsUnannotated _ _ -> dcolon <+> tyDoc
+ HsUnannotated _ -> dcolon <+> tyDoc
HsLinearAnn _ -> text "%1" <+> dcolon <+> tyDoc
HsExplicitMult _ p -> text "%" <> ppr p <+> dcolon <+> tyDoc
@@ -1308,7 +1315,7 @@ pprHsConFieldSpecWith ppr_mult (CFS _ prag mark mult ty doc) =
pprHsConFieldSpecNoMult :: (OutputableBndrId p) => HsConFieldSpec on (GhcPass p) -> SDoc
pprHsConFieldSpecNoMult = pprHsConFieldSpecWith (\_ d -> d)
-hsPlainTypeField :: LHsType GhcPs -> HsConFieldSpec OnArrow GhcPs
+hsPlainTypeField :: NoAnn (XLinearAnn on (LHsType GhcPs) GhcPs) => LHsType GhcPs -> HsConFieldSpec on GhcPs
hsPlainTypeField = mkConFieldSpec (HsLinearAnn noAnn)
mkConFieldSpec :: HsMultAnnOn on (LHsType GhcPs) GhcPs -> LHsType GhcPs -> HsConFieldSpec on GhcPs
=====================================
compiler/GHC/HsToCore/Quote.hs
=====================================
@@ -86,6 +86,7 @@ import GHC.Types.Name.Env
import GHC.TypeLits
import Data.Kind (Constraint)
+import Data.Proxy
import qualified GHC.LanguageExtensions as LangExt
@@ -2861,14 +2862,22 @@ repGadtDataCons cons details res_ty
-- TH currently only supports linear constructors.
-- We also accept the (->) arrow when -XLinearTypes is off, because this
-- denotes a linear field.
-verifyLinearFields :: [HsConFieldSpec on GhcRn] -> MetaM ()
+verifyLinearFields :: forall on. IsHsMultAnnOnWhat on => [HsConFieldSpec on GhcRn] -> MetaM ()
verifyLinearFields ps = do
linear <- lift $ xoptM LangExt.LinearTypes
let allGood = all (hsMultIsLinear linear . cfs_multiplicity) ps
unless allGood $ notHandled ThNonLinearDataCon
+ where
+ hsMultIsLinear linearTypesEnabled (HsUnannotated _) =
+ case hsMultAnnOnWhat (Proxy :: Proxy on) of
+ OnArrow -> not linearTypesEnabled
+ OnConField -> True
+ hsMultIsLinear _ HsLinearAnn{} = True
+ hsMultIsLinear _ _ = False
-- Desugar the arguments in a data constructor declared with prefix syntax.
-repPrefixConArgs :: [HsConFieldSpec OnArrow GhcRn]
+repPrefixConArgs :: IsHsMultAnnOnWhat on
+ => [HsConFieldSpec on GhcRn]
-> MetaM (Core [M TH.BangType])
repPrefixConArgs ps = do
verifyLinearFields ps
@@ -2885,7 +2894,7 @@ repRecConArgs lips = do
where
rep_ip ip = mapM (rep_one_ip (cd_fld_spec ip)) (cd_fld_names ip)
- rep_one_ip :: HsConFieldSpec OnRecField GhcRn -> LFieldOcc GhcRn -> MetaM (Core (M TH.VarBangType))
+ rep_one_ip :: HsConFieldSpec OnConField GhcRn -> LFieldOcc GhcRn -> MetaM (Core (M TH.VarBangType))
rep_one_ip t n = do { MkC v <- lookupOcc (unLoc . foLabel $ unLoc n)
; MkC ty <- repConFieldSpec t
; rep2 varBangTypeName [v,ty] }
=====================================
compiler/GHC/Iface/Ext/Ast.hs
=====================================
@@ -1795,7 +1795,7 @@ instance ToHie (LocatedL [LocatedA (ConDeclField GhcRn)]) where
, toHie decls
]
-instance ToHie (HsConFieldSpec on GhcRn) where
+instance IsHsMultAnnOnWhat on => ToHie (HsConFieldSpec on GhcRn) where
toHie (CFS _ _ _ w t doc) = concatM
[ toHie (multAnnToHsType w)
, toHie t
=====================================
compiler/GHC/Parser.y
=====================================
@@ -2601,7 +2601,7 @@ fielddecl :: { LConDeclField GhcPs }
(ConDeclField noExtField
(reverse (map (\ln@(L l n)
-> L (fromTrailingN l) $ FieldOcc noExtField (L (noTrailingN l) n)) (unLoc $1)))
- (mkConFieldSpec (HsUnannotated HsUnannOne (epUniTok $2)) $3)))}
+ (mkConFieldSpec (HsUnannotated (epUniTok $2)) $3)))}
| sig_vars PREFIX_PERCENT atype '::' ctype
{% amsA' (L (comb4 $1 $2 $3 $5)
(ConDeclField noExtField
=====================================
compiler/GHC/Parser/PostProcess.hs
=====================================
@@ -3520,7 +3520,7 @@ mkMultAnn pct t@(L _ (HsTyLit _ (HsNumTy (SourceText (unpackFS -> "1")) 1)))
pct1 = epTokenWidenR pct (locA (getLoc t))
mkMultAnn pct t = HsMultAnn pct t
-mkMultField :: EpToken "%" -> LHsType GhcPs -> TokDcolon -> LHsType GhcPs -> HsConFieldSpec OnRecField GhcPs
+mkMultField :: EpToken "%" -> LHsType GhcPs -> TokDcolon -> LHsType GhcPs -> HsConFieldSpec OnConField GhcPs
mkMultField pct (L _ (HsTyLit _ (HsNumTy (SourceText (unpackFS -> "1")) 1))) col t
-- See #18888 for the use of (SourceText "1") above
= mkConFieldSpec (HsLinearAnn (pct1, col)) t
=====================================
compiler/GHC/Rename/HsType.hs
=====================================
@@ -706,7 +706,7 @@ rnHsMultAnnOn env = rnHsMultAnnOnWith (rnLHsTyKi env)
rnHsMultAnnOnWith :: (LocatedA (mult GhcPs) -> RnM (LocatedA (mult GhcRn), FreeVars))
-> HsMultAnnOn on (LocatedA (mult GhcPs)) GhcPs
-> RnM (HsMultAnnOn on (LocatedA (mult GhcRn)) GhcRn, FreeVars)
-rnHsMultAnnOnWith _rn (HsUnannotated mult _) = pure (HsUnannotated mult noExtField, emptyFVs)
+rnHsMultAnnOnWith _rn (HsUnannotated _) = pure (HsUnannotated noExtField, emptyFVs)
rnHsMultAnnOnWith _rn (HsLinearAnn _) = pure (HsLinearAnn noExtField, emptyFVs)
rnHsMultAnnOnWith rn (HsExplicitMult _ p)
= (\(mult, fvs) -> (HsExplicitMult noExtField mult, fvs)) <$> rn p
=====================================
compiler/GHC/Rename/Module.hs
=====================================
@@ -1927,12 +1927,12 @@ rnDataDefn doc (HsDataDefn { dd_cType = cType, dd_ctxt = context, dd_cons = cond
has_labelled_fields _ = False
has_strictness_flags condecl
- = any (isSrcStrict . cfs_bang) (con_args condecl)
+ = any isSrcStrict (con_arg_bangs condecl)
- con_args (ConDeclGADT { con_g_args = PrefixConGADT _ args }) = args
- con_args (ConDeclH98 { con_args = PrefixCon _ args }) = args
- con_args (ConDeclH98 { con_args = InfixCon arg1 arg2 }) = [arg1, arg2]
- con_args _ = []
+ con_arg_bangs (ConDeclGADT { con_g_args = PrefixConGADT _ args }) = map cfs_bang args
+ con_arg_bangs (ConDeclH98 { con_args = PrefixCon _ args }) = map cfs_bang args
+ con_arg_bangs (ConDeclH98 { con_args = InfixCon arg1 arg2 }) = [cfs_bang arg1, cfs_bang arg2]
+ con_arg_bangs _ = []
{-
Note [Type data declarations]
=====================================
compiler/GHC/Rename/Pat.hs
=====================================
@@ -1387,7 +1387,7 @@ rn_ty_pat ty@(XHsType{}) = do
liftRnFV $ rnHsType ctxt ty
rn_ty_pat_arrow :: HsArrow GhcPs -> TPRnM (HsArrow GhcRn)
-rn_ty_pat_arrow (HsUnannotated mult _) = pure (HsUnannotated mult noExtField)
+rn_ty_pat_arrow (HsUnannotated _) = pure (HsUnannotated noExtField)
rn_ty_pat_arrow (HsLinearAnn _) = pure (HsLinearAnn noExtField)
rn_ty_pat_arrow (HsExplicitMult _ p)
= rn_lty_pat p <&> (\mult -> HsExplicitMult noExtField mult)
=====================================
compiler/GHC/Tc/Gen/App.hs
=====================================
@@ -991,7 +991,7 @@ expr_to_type earg =
; return (L l (HsFunTy noExtField mult' arg' res'))}
where
go_arrow :: HsArrowOf (LHsExpr GhcRn) GhcRn -> TcM (HsArrow GhcRn)
- go_arrow (HsUnannotated mult _) = pure (HsUnannotated mult noExtField)
+ go_arrow (HsUnannotated _) = pure (HsUnannotated noExtField)
go_arrow (HsLinearAnn{}) = pure (HsLinearAnn noExtField)
go_arrow (HsExplicitMult _ exp) = HsExplicitMult noExtField <$> go exp
go (L l (HsForAll _ tele expr)) =
=====================================
compiler/GHC/Tc/Gen/HsType.hs
=====================================
@@ -947,7 +947,7 @@ concern things that the renamer can't handle.
-}
-tcMult :: HsMultAnnOn on (LHsType GhcRn) GhcRn -> TcM Mult
+tcMult :: IsHsMultAnnOnWhat on => HsMultAnnOn on (LHsType GhcRn) GhcRn -> TcM Mult
tcMult hc = tc_mult typeLevelMode hc
-- | Info about the context in which we're checking a type. Currently,
@@ -1364,7 +1364,7 @@ Note [VarBndrs, ForAllTyBinders, TyConBinders, and visibility] in "GHC.Core.TyCo
-}
------------------------------------------
-tc_mult :: TcTyMode -> HsMultAnnOn on (LHsType GhcRn) GhcRn -> TcM Mult
+tc_mult :: IsHsMultAnnOnWhat on => TcTyMode -> HsMultAnnOn on (LHsType GhcRn) GhcRn -> TcM Mult
tc_mult mode ty = tc_check_lhs_type mode (multAnnToHsType ty) multiplicityTy
------------------------------------------
tc_fun_type :: TcTyMode -> HsArrow GhcRn -> LHsType GhcRn -> LHsType GhcRn -> ExpKind
=====================================
compiler/GHC/Tc/TyCl.hs
=====================================
@@ -1806,7 +1806,8 @@ kcTyClDecl (FamDecl _ (FamilyDecl { fdInfo = fd_info })) fam_tc
-- This includes doing kind unification if the type is a newtype.
-- See Note [Implementation of UnliftedNewtypes] for why we need
-- the first two arguments.
-kcConArgTys :: ConArgKind -- Expected kind of the argument(s)
+kcConArgTys :: IsHsMultAnnOnWhat on
+ => ConArgKind -- Expected kind of the argument(s)
-> [HsConFieldSpec on GhcRn] -- User-written argument types
-> TcM ()
kcConArgTys exp_kind arg_tys
@@ -3988,7 +3989,8 @@ tcConGADTArgs exp_kind (PrefixConGADT _ btys)
tcConGADTArgs exp_kind (RecConGADT _ fields)
= tcRecConDeclFields exp_kind fields
-tcConArg :: ConArgKind -- expected kind for args; always OpenKind for datatypes,
+tcConArg :: IsHsMultAnnOnWhat on
+ => ConArgKind -- expected kind for args; always OpenKind for datatypes,
-- but might be an unlifted type with UnliftedNewtypes
-> HsConFieldSpec on GhcRn -> TcM (Scaled TcType, HsSrcBang)
tcConArg exp_kind (CFS (_, src) unp str w bty _)
@@ -4011,7 +4013,7 @@ tcRecConDeclFields exp_kind fields
exploded = concatMap explode combined
(_,btys) = unzip exploded
-tcDataConMult :: HsMultAnnOn on (LHsType GhcRn) GhcRn -> TcM Mult
+tcDataConMult :: IsHsMultAnnOnWhat on => HsMultAnnOn on (LHsType GhcRn) GhcRn -> TcM Mult
tcDataConMult arr@(HsUnrestrictedArrow _) = do
-- See Note [Function arrows in GADT constructors]
linearEnabled <- xoptM LangExt.LinearTypes
=====================================
compiler/GHC/ThToHs.hs
=====================================
@@ -776,7 +776,8 @@ cvtSrcStrictness NoSourceStrictness = NoSrcStrict
cvtSrcStrictness SourceLazy = SrcLazy
cvtSrcStrictness SourceStrict = SrcStrict
-cvt_arg :: NoAnn (XUnannotated on (LHsType GhcPs) GhcPs) => (TH.Bang, TH.Type) -> CvtM (HsConFieldSpec on GhcPs)
+cvt_arg :: (NoAnn (XUnannotated on (LHsType GhcPs) GhcPs), IsHsMultAnnOnWhat on)
+ => (TH.Bang, TH.Type) -> CvtM (HsConFieldSpec on GhcPs)
cvt_arg (Bang su ss, ty)
= do { ty'' <- cvtType ty
; let ty' = parenthesizeHsType appPrec ty''
=====================================
compiler/Language/Haskell/Syntax/Decls.hs
=====================================
@@ -1116,7 +1116,7 @@ or contexts in two parts:
-- | The arguments in a Haskell98-style data constructor.
type HsConDeclH98Details pass
- = HsConDetails Void (HsConFieldSpec OnArrow pass) (XRec pass [LConDeclField pass])
+ = HsConDetails Void (HsConFieldSpec OnConField pass) (XRec pass [LConDeclField pass])
-- The Void argument to HsConDetails here is a reflection of the fact that
-- type applications are not allowed in data constructor declarations.
=====================================
compiler/Language/Haskell/Syntax/Type.hs
=====================================
@@ -22,10 +22,9 @@ GHC.Hs.Type: Abstract syntax: user-defined types
-- See Note [Language.Haskell.Syntax.* Hierarchy] for why not GHC.Hs.*
module Language.Haskell.Syntax.Type (
- HsArrow, HsArrowOf, HsMultAnnOn(..), HsMultAnnOnWhat(..), HsUnannotatedMult(..),
+ HsArrow, HsArrowOf, HsMultAnnOn(..), HsMultAnnOnWhat(..), IsHsMultAnnOnWhat(..),
pattern HsUnrestrictedArrow,
XUnannotated, XLinearAnn, XExplicitMult, XXMultAnnOn,
- hsMultIsLinear,
HsType(..), LHsType, HsKind, LHsKind,
HsBndrVis(..), XBndrRequired, XBndrInvisible, XXBndrVis,
@@ -919,28 +918,35 @@ data HsTyLit pass
type HsArrow pass = HsArrowOf (LHsType pass) pass
type HsArrowOf = HsMultAnnOn OnArrow
--- HsMultAnnOn is used both to represent function arrows and multiplicity annotations
--- in the record declaration syntax. But the default multiplicity is different
--- between the two uses. In record syntax, the default is One, but on arrows, the
--- default is Many. `HsUnannotatedMult` is used to distinguish between the two uses.
-data HsUnannotatedMult = HsUnannOne | HsUnannMany
- deriving (Eq, Ord, Data)
-
pattern HsUnrestrictedArrow :: XUnannotated on mult pass -> HsMultAnnOn on mult pass
-pattern HsUnrestrictedArrow a = HsUnannotated HsUnannMany a
-
-data HsMultAnnOnWhat = OnArrow | OnRecField
+pattern HsUnrestrictedArrow a = HsUnannotated a
--- | Denotes the type of arrows in the surface language
+-- HsMultAnnOn is used both to represent function arrows and multiplicity annotations
+-- in the data declaration syntax. But the default multiplicity is different
+-- between the two uses. In constructors, the default is One, but on arrows, the
+-- default is Many. (But note that non-record GADT syntax follows the default of arrows.)
+-- `HsMultAnnOnWhat` is used to distinguish between the two uses.
+data HsMultAnnOnWhat = OnArrow | OnConField
+
+-- Get a value level representation of the `HsMultAnnOnWhat` kind.
+class IsHsMultAnnOnWhat (on :: HsMultAnnOnWhat) where
+ hsMultAnnOnWhat :: proxy on -> HsMultAnnOnWhat
+instance IsHsMultAnnOnWhat OnArrow where
+ hsMultAnnOnWhat _ = OnArrow
+instance IsHsMultAnnOnWhat OnConField where
+ hsMultAnnOnWhat _ = OnConField
+
+-- | Denotes multiplicity annotations in the surface language
data HsMultAnnOn (on :: HsMultAnnOnWhat) mult pass
- = HsUnannotated HsUnannotatedMult !(XUnannotated on mult pass)
- -- ^ a -> b or a → b
+ = HsUnannotated !(XUnannotated on mult pass)
+ -- ^ a -> b or a → b or { nm :: a }
| HsLinearAnn !(XLinearAnn on mult pass)
- -- ^ a %1 -> b or a %1 → b, or a ⊸ b
+ -- ^ a %1 -> b or a %1 → b, or a ⊸ b, or { nm %1 :: a }
| HsExplicitMult !(XExplicitMult on mult pass) !mult
- -- ^ a %m -> b or a %m → b (very much including `a %Many -> b`!
+ -- ^ a %m -> b or a %m → b or { nm %m :: a }
+ -- (very much including `a %Many -> b`!
-- This is how the programmer wrote it). It is stored as an
-- `HsType` so as to preserve the syntax as written in the
-- program.
@@ -952,12 +958,6 @@ type family XLinearAnn (on :: HsMultAnnOnWhat) mult p
type family XExplicitMult (on :: HsMultAnnOnWhat) mult p
type family XXMultAnnOn (on :: HsMultAnnOnWhat) mult p
-hsMultIsLinear :: Bool -> HsMultAnnOn on mult pass -> Bool
-hsMultIsLinear _ (HsUnannotated HsUnannOne _) = True
-hsMultIsLinear linear (HsUnannotated HsUnannMany _) = not linear
-hsMultIsLinear _ HsLinearAnn{} = True
-hsMultIsLinear _ _ = False
-
{-
Note [Unit tuples]
~~~~~~~~~~~~~~~~~~
@@ -1061,7 +1061,7 @@ data ConDeclField pass
= ConDeclField { cd_fld_ext :: XConDeclField pass,
cd_fld_names :: [LFieldOcc pass],
-- ^ See Note [ConDeclField pass]
- cd_fld_spec :: HsConFieldSpec OnRecField pass }
+ cd_fld_spec :: HsConFieldSpec OnConField pass }
| XConDeclField !(XXConDeclField pass)
{- Note [ConDeclField pass]
=====================================
testsuite/tests/ghc-api/exactprint/Test20239.stderr
=====================================
@@ -257,7 +257,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { Test20239.hs:7:62-63 })
(NormalSyntax)))
=====================================
testsuite/tests/haddock/should_compile_flag_haddock/T17544_kw.stderr
=====================================
@@ -254,7 +254,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { T17544_kw.hs:19:21-22 })
(NormalSyntax)))
=====================================
testsuite/tests/haddock/should_compile_flag_haddock/T24221.stderr
=====================================
@@ -951,7 +951,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(EpUniTok
(EpaSpan { T24221.hs:28:15-16 })
(NormalSyntax)))
@@ -1024,7 +1023,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(EpUniTok
(EpaSpan { T24221.hs:29:15-16 })
(NormalSyntax)))
@@ -1184,7 +1182,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(EpUniTok
(EpaSpan { T24221.hs:33:10-11 })
(NormalSyntax)))
@@ -1257,7 +1254,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(EpUniTok
(EpaSpan { T24221.hs:34:10-11 })
(NormalSyntax)))
@@ -1429,7 +1425,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(EpUniTok
(EpaSpan { T24221.hs:40:8-9 })
(NormalSyntax)))
@@ -1502,7 +1497,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(EpUniTok
(EpaSpan { T24221.hs:42:8-9 })
(NormalSyntax)))
=====================================
testsuite/tests/parser/should_compile/DumpParsedAst.stderr
=====================================
@@ -254,7 +254,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:9:20-21 })
(NormalSyntax)))
@@ -960,7 +959,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:17:14-15 })
(NormalSyntax)))
@@ -993,7 +991,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:17:29-30 })
(NormalSyntax)))
@@ -1020,7 +1017,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:17:20-21 })
(NormalSyntax)))
@@ -1407,7 +1403,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:18:33-34 })
(NormalSyntax)))
@@ -1540,7 +1535,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:21:22-23 })
(NormalSyntax)))
@@ -1573,7 +1567,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:21:27-28 })
(NormalSyntax)))
@@ -1699,7 +1692,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:22:30-31 })
(NormalSyntax)))
@@ -1772,7 +1764,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:22:54-55 })
(NormalSyntax)))
@@ -1799,7 +1790,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:22:45-46 })
(NormalSyntax)))
@@ -1908,7 +1898,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:23:36-37 })
(NormalSyntax)))
@@ -1980,7 +1969,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { DumpParsedAst.hs:23:27-28 })
(NormalSyntax)))
=====================================
testsuite/tests/parser/should_compile/DumpRenamedAst.stderr
=====================================
@@ -648,7 +648,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -757,7 +756,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -787,7 +785,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -906,7 +903,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -971,7 +967,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -994,7 +989,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -1093,7 +1087,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -1159,7 +1152,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -1846,7 +1838,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -1951,7 +1942,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -1981,7 +1971,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
@@ -2004,7 +1993,6 @@
(HsFunTy
(NoExtField)
(HsUnannotated
- (HsUnannMany)
(NoExtField))
(L
(EpAnn
=====================================
testsuite/tests/parser/should_compile/T14189.stderr
=====================================
@@ -207,7 +207,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannOne)
(NoExtField))
(L
(EpAnn
=====================================
testsuite/tests/printer/T18791.stderr
=====================================
@@ -128,7 +128,6 @@
(NoSrcUnpack)
(NoSrcStrict)
(HsUnannotated
- (HsUnannMany)
(EpUniTok
(EpaSpan { T18791.hs:5:14-15 })
(NormalSyntax)))
=====================================
utils/check-exact/ExactPrint.hs
=====================================
@@ -834,9 +834,9 @@ markEpUniToken (EpUniTok aa isUnicode) = do
-- ---------------------------------------------------------------------
markArrow :: (Monad m, Monoid w, ExactPrint a) => HsArrowOf a GhcPs -> EP w m (HsArrowOf a GhcPs)
-markArrow (HsUnannotated t arr) = do
+markArrow (HsUnannotated arr) = do
arr' <- markEpUniToken arr
- return (HsUnannotated t arr')
+ return (HsUnannotated arr')
markArrow (HsLinearAnn (EpPct1 pct1 arr)) = do
pct1' <- markEpToken pct1
arr' <- markEpUniToken arr
@@ -850,11 +850,11 @@ markArrow (HsExplicitMult (pct, arr) t) = do
arr' <- markEpUniToken arr
return (HsExplicitMult (pct', arr') t')
-markRecFieldMult :: (Monad m, Monoid w, ExactPrint a) => HsMultAnnOn OnRecField a GhcPs -> EP w m (HsMultAnnOn OnRecField a GhcPs)
-markRecFieldMult (HsUnannotated t col) = do
+markRecFieldMult :: (Monad m, Monoid w, ExactPrint a) => HsMultAnnOn OnConField a GhcPs -> EP w m (HsMultAnnOn OnConField a GhcPs)
+markRecFieldMult (HsUnannotated col) = do
traceM $ "markRecFieldMult:HsUnannotated"
col' <- markEpUniToken col
- return (HsUnannotated t col')
+ return (HsUnannotated col')
markRecFieldMult (HsLinearAnn (pct1, col)) = do
traceM $ "markRecFieldMult:HsLinearAnn"
pct1' <- markEpToken pct1
@@ -4449,7 +4449,7 @@ instance ExactPrint (HsConFieldSpec OnArrow GhcPs) where
arr' <- markArrow arr
return (CFS an' unp str arr' t' doc)
-instance ExactPrint (HsConFieldSpec OnRecField GhcPs) where
+instance ExactPrint (HsConFieldSpec OnConField GhcPs) where
getAnnotationEntry = const NoEntryVal
setAnnotationAnchor a _ _ _ = a
exact (CFS an unp str mult t doc) = do
=====================================
utils/haddock/haddock-api/src/Haddock/Backends/LaTeX.hs
=====================================
@@ -1049,7 +1049,7 @@ ppSideBySideField subdocs unicode (ConDeclField _ names ltype) =
-- Where there is more than one name, they all have the same documentation
ppRecFieldMultAnn :: Bool -> HsConFieldSpec on DocNameI -> LaTeX -> LaTeX
ppRecFieldMultAnn unicode (CFS _ _ _ arr _ _) following = case arr of
- HsUnannotated _ _ -> following
+ HsUnannotated _ -> following
HsLinearAnn _ -> text "%1" <+> following
HsExplicitMult _ mult -> multAnnotation <> ppr_mono_lty mult unicode <+> following
@@ -1318,7 +1318,7 @@ ppr_mono_ty (HsFunTy _ mult ty1 ty2) u =
where
arr = case mult of
HsLinearAnn _ -> lollipop u
- HsUnannotated _ _ -> arrow u
+ HsUnannotated _ -> arrow u
HsExplicitMult _ m -> multAnnotation <> ppr_mono_lty m u <+> arrow u
ppr_mono_ty (HsTyVar _ NotPromoted (L _ name)) _ = ppDocName name
ppr_mono_ty (HsTyVar _ IsPromoted (L _ name)) _ = char '\'' <> ppDocName name
=====================================
utils/haddock/haddock-api/src/Haddock/Backends/Xhtml/Decl.hs
=====================================
@@ -1480,6 +1480,7 @@ ppSideBySideConstr subdocs fixities unicode pkg qual (L _ con) =
qual
(map (ppSideBySideField subdocs unicode qual) (map unLoc fields))
+ doConstrArgsWithDocs :: [HsConFieldSpec on DocNameI] -> Html
doConstrArgsWithDocs args = subFields pkg qual $ case con of
ConDeclH98{} ->
[ (ppLParendType unicode qual HideEmptyContexts arg, mdoc, [])
@@ -1557,7 +1558,7 @@ ppSideBySideField subdocs unicode qual (ConDeclField _ names ltype) =
-- Where there is more than one name, they all have the same documentation
ppRecFieldMultAnn :: Unicode -> Qualification -> HsConFieldSpec on DocNameI -> Html -> Html
ppRecFieldMultAnn unicode qual (CFS _ _ _ arr _ _) following = case arr of
- HsUnannotated _ _ -> following
+ HsUnannotated _ -> following
HsLinearAnn _ -> toHtml "%1" <+> following
HsExplicitMult _ mult -> multAnnotation <> ppr_mono_lty mult unicode qual HideEmptyContexts <+> following
@@ -1821,7 +1822,7 @@ ppr_mono_ty (HsFunTy _ mult ty1 ty2) u q e =
where
arr = case mult of
HsLinearAnn _ -> lollipop u
- HsUnannotated _ _ -> arrow u
+ HsUnannotated _ -> arrow u
HsExplicitMult _ m -> multAnnotation <> ppr_mono_lty m u q e <+> arrow u
ppr_mono_ty (HsTupleTy _ con tys) u q _ =
tupleParens con (map (ppLType u q HideEmptyContexts) tys)
=====================================
utils/haddock/haddock-api/src/Haddock/Convert.hs
=====================================
@@ -990,9 +990,9 @@ synifyMult vs t = case t of
ManyTy -> HsUnrestrictedArrow noExtField
ty -> HsExplicitMult noExtField (synifyType WithinType vs ty)
-synifyMultRec :: [TyVar] -> Mult -> HsMultAnnOn OnRecField (LHsType GhcRn) GhcRn
+synifyMultRec :: [TyVar] -> Mult -> HsMultAnnOn OnConField (LHsType GhcRn) GhcRn
synifyMultRec vs t = case t of
- OneTy -> HsUnannotated HsUnannOne noExtField
+ OneTy -> HsUnannotated noExtField
ty -> HsExplicitMult noExtField (synifyType WithinType vs ty)
synifyPatSynType :: PatSyn -> LHsType GhcRn
=====================================
utils/haddock/haddock-api/src/Haddock/GhcUtils.hs
=====================================
@@ -358,7 +358,7 @@ restrictCons names decls = [L p d | L p (Just d) <- fmap keep <$> decls]
PrefixCon{} -> Just d
RecCon fields
| all field_avail (unLoc fields) -> Just d
- | otherwise -> Just (d{con_args = PrefixCon [] (field_types $ unLoc fields)})
+ | otherwise -> Just (d{con_args = field_types (unLoc fields) (PrefixCon [])})
-- if we have *all* the field names available, then
-- keep the record declaration. Otherwise degrade to
-- a constructor declaration. This isn't quite right, but
@@ -368,7 +368,7 @@ restrictCons names decls = [L p d | L p (Just d) <- fmap keep <$> decls]
PrefixConGADT{} -> Just d
RecConGADT _ fields
| all field_avail (unLoc fields) -> Just d
- | otherwise -> Just (d{con_g_args = PrefixConGADT noExtField (field_types $ unLoc fields)})
+ | otherwise -> Just (d{con_g_args = field_types (unLoc fields) (PrefixConGADT noExtField)})
where
-- see above
@@ -376,8 +376,8 @@ restrictCons names decls = [L p d | L p (Just d) <- fmap keep <$> decls]
field_avail (L _ (ConDeclField _ fs _)) =
all (\f -> (unLoc . foLabel . unLoc $ f) `elem` names) fs
- field_types :: [LConDeclField GhcRn] -> [HsConFieldSpec OnArrow GhcRn]
- field_types flds = [hsConFieldSpecGeneralize t | L _ (ConDeclField _ _ t) <- flds]
+ field_types :: [LConDeclField GhcRn] -> ([HsConFieldSpec on GhcRn] -> r) -> r
+ field_types flds f = f [hsConFieldSpecGeneralize t | L _ (ConDeclField _ _ t) <- flds]
keep _ = Nothing
restrictDecls :: [Name] -> [LSig GhcRn] -> [LSig GhcRn]
=====================================
utils/haddock/haddock-api/src/Haddock/Interface/Rename.hs
=====================================
@@ -341,7 +341,7 @@ renameMaybeInjectivityAnn
renameMaybeInjectivityAnn = traverse renameInjectivityAnn
renameMultAnnOn :: HsMultAnnOn on (LHsType GhcRn) GhcRn -> RnM (HsMultAnnOn on (LHsType DocNameI) DocNameI)
-renameMultAnnOn (HsUnannotated mult _) = return (HsUnannotated mult noExtField)
+renameMultAnnOn (HsUnannotated _) = return (HsUnannotated noExtField)
renameMultAnnOn (HsLinearAnn _) = return (HsLinearAnn noExtField)
renameMultAnnOn (HsExplicitMult _ p) = HsExplicitMult noExtField <$> renameLType p
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/6e6533dec8bebc63109379a1a742906668bd8271
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/6e6533dec8bebc63109379a1a742906668bd8271
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20250123/3f1b5fc6/attachment-0001.html>
More information about the ghc-commits
mailing list