summaryrefslogtreecommitdiff
path: root/compiler/GHC/Hs/Pat.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/GHC/Hs/Pat.hs')
-rw-r--r--compiler/GHC/Hs/Pat.hs60
1 files changed, 53 insertions, 7 deletions
diff --git a/compiler/GHC/Hs/Pat.hs b/compiler/GHC/Hs/Pat.hs
index a4b3bed851..88bc223b7b 100644
--- a/compiler/GHC/Hs/Pat.hs
+++ b/compiler/GHC/Hs/Pat.hs
@@ -20,7 +20,7 @@
-}
module GHC.Hs.Pat (
- Pat(..), LPat,
+ Pat(..), LPat, MatchPat(..), LMatchPat,
EpAnnSumPat(..),
ConPatTc (..),
ConLikeP,
@@ -34,18 +34,18 @@ module GHC.Hs.Pat (
hsRecFields, hsRecFieldSel, hsRecFieldId, hsRecFieldsArgs,
hsRecUpdFieldId, hsRecUpdFieldOcc, hsRecUpdFieldRdr,
- mkPrefixConPat, mkCharLitPat, mkNilPat,
+ mkPrefixConPat, mkCharLitPat, mkNilPat, mkVisPat,
isSimplePat,
looksLazyPatBind,
- isBangedLPat,
- gParPat, patNeedsParens, parenthesizePat,
+ isBangedLPat, isBangedLMatchPat,
+ gParPat, patNeedsParens, parenthesizePat, parenthesizeLMatchPat,
isIrrefutableHsPat,
collectEvVarsPat, collectEvVarsPats,
- pprParendLPat, pprConArgs,
- pprLPat
+ pprParendLPat, pprParendLMatchPat, pprConArgs,
+ pprLPat, pprLMatchPat
) where
import GHC.Prelude
@@ -170,6 +170,27 @@ type instance ConLikeP GhcTc = ConLike
type instance XHsFieldBind _ = EpAnn [AddEpAnn]
+type instance XVisPat (GhcPass _) = NoExtField
+
+type instance XInvisTyVarPat GhcPs = EpAnn [AddEpAnn]
+type instance XInvisTyVarPat GhcRn = NoExtField
+type instance XInvisTyVarPat GhcTc = NoExtField
+
+type instance XInvisWildTyPat GhcPs = NoExtField
+type instance XInvisWildTyPat GhcRn = NoExtField
+type instance XInvisWildTyPat GhcTc = Type -- ?? perhaps, NoExtField, I'm not sure
+
+type instance XXMatchPat (GhcPass _) = NoExtCon
+
+mkVisPat :: forall pass. IsPass pass => LPat (GhcPass pass) -> LMatchPat (GhcPass pass)
+mkVisPat lpat =
+ case ghcPass @pass of
+ GhcPs -> L l (VisPat noExtField lpat)
+ GhcRn -> L l (VisPat noExtField lpat)
+ GhcTc -> L l (VisPat noExtField lpat)
+ where
+ l = getLoc lpat
+
-- ---------------------------------------------------------------------
-- API Annotations types
@@ -205,7 +226,6 @@ data XXPatGhcTc
-- See Note [Rebindable syntax and HsExpansion].
| ExpansionPat (Pat GhcRn) (Pat GhcTc)
-
-- See Note [Rebindable syntax and HsExpansion].
data HsPatExpansion a b
= HsPatExpanded a b
@@ -267,9 +287,17 @@ instance OutputableBndrId p => Outputable (Pat (GhcPass p)) where
instance (Outputable a, Outputable b) => Outputable (HsPatExpansion a b) where
ppr (HsPatExpanded a b) = ifPprDebug (vcat [ppr a, ppr b]) (ppr a)
+instance OutputableBndrId p => Outputable (MatchPat (GhcPass p)) where
+ ppr (VisPat _ lpat) = ppr (unLoc lpat)
+ ppr (InvisTyVarPat _ idp) = ppr idp
+ ppr (InvisWildTyPat _) = text "_@"
+
pprLPat :: (OutputableBndrId p) => LPat (GhcPass p) -> SDoc
pprLPat (L _ e) = pprPat e
+pprLMatchPat :: (OutputableBndrId p) => LMatchPat (GhcPass p) -> SDoc
+pprLMatchPat (L _ e) = ppr e
+
-- | Print with type info if -dppr-debug is on
pprPatBndr :: OutputableBndr name => name -> SDoc
pprPatBndr var
@@ -282,6 +310,12 @@ pprParendLPat :: (OutputableBndrId p)
=> PprPrec -> LPat (GhcPass p) -> SDoc
pprParendLPat p = pprParendPat p . unLoc
+pprParendLMatchPat :: (OutputableBndrId p)
+ => PprPrec -> LMatchPat (GhcPass p) -> SDoc
+pprParendLMatchPat p (L _ (VisPat _ pat)) = pprParendLPat p pat
+pprParendLMatchPat _ (L _ (InvisTyVarPat _ pat)) = char '@' <> (ppr (unLoc pat))
+pprParendLMatchPat _ (L _ (InvisWildTyPat _)) = text "@_"
+
pprParendPat :: forall p. OutputableBndrId p
=> PprPrec
-> Pat (GhcPass p)
@@ -444,6 +478,9 @@ patterns are treated specially, of course.
The 1.3 report defines what ``irrefutable'' and ``failure-free'' patterns are.
-}
+isBangedLMatchPat :: LMatchPat (GhcPass p) -> Bool
+isBangedLMatchPat (L _ (VisPat _ pat)) = isBangedLPat pat
+isBangedLMatchPat _ = False
isBangedLPat :: LPat (GhcPass p) -> Bool
isBangedLPat = isBangedPat . unLoc
@@ -680,6 +717,14 @@ parenthesizePat p lpat@(L loc pat)
| patNeedsParens p pat = L loc (gParPat lpat)
| otherwise = lpat
+parenthesizeLMatchPat :: IsPass p
+ => PprPrec
+ -> LMatchPat (GhcPass p)
+ -> LMatchPat (GhcPass p)
+parenthesizeLMatchPat p (L l (VisPat x lpat)) =
+ L l (VisPat x (parenthesizePat p lpat))
+parenthesizeLMatchPat _ invis = invis
+
{-
% Collect all EvVars from all constructor patterns
-}
@@ -726,6 +771,7 @@ collectEvVarsPat pat =
-}
type instance Anno (Pat (GhcPass p)) = SrcSpanAnnA
+type instance Anno (MatchPat (GhcPass p)) = SrcSpanAnnA
type instance Anno (HsOverLit (GhcPass p)) = SrcSpan
type instance Anno ConLike = SrcSpanAnnN
type instance Anno (HsFieldBind lhs rhs) = SrcSpanAnnA