summaryrefslogtreecommitdiff
path: root/compiler/parser/RdrHsSyn.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/parser/RdrHsSyn.hs')
-rw-r--r--compiler/parser/RdrHsSyn.hs307
1 files changed, 156 insertions, 151 deletions
diff --git a/compiler/parser/RdrHsSyn.hs b/compiler/parser/RdrHsSyn.hs
index 88217c27a2..95c01ed092 100644
--- a/compiler/parser/RdrHsSyn.hs
+++ b/compiler/parser/RdrHsSyn.hs
@@ -75,7 +75,10 @@ module RdrHsSyn (
warnStarIsType,
failOpFewArgs,
- SumOrTuple (..), mkSumOrTuple
+ SumOrTuple (..), mkSumOrTuple,
+
+ -- ExpPatFrame
+ module ExpPatFrame
) where
@@ -109,6 +112,7 @@ import Util
import ApiAnnotation
import Data.List
import DynFlags ( WarningFlag(..) )
+import ExpPatFrame
import Control.Monad
import Text.ParserCombinators.ReadP as ReadP
@@ -982,16 +986,16 @@ checkTyClHdr is_cls ty
-- | Yield a parse error if we have a function applied directly to a do block
-- etc. and BlockArguments is not enabled.
-checkBlockArguments :: LHsExpr GhcPs -> P ()
+checkBlockArguments :: LExpPatFrame -> P ()
checkBlockArguments expr = case unLoc expr of
- HsDo _ DoExpr _ -> check "do block"
- HsDo _ MDoExpr _ -> check "mdo block"
- HsLam {} -> check "lambda expression"
- HsCase {} -> check "case expression"
- HsLamCase {} -> check "lambda-case expression"
- HsLet {} -> check "let expression"
- HsIf {} -> check "if expression"
- HsProc {} -> check "proc expression"
+ FrameDo DoExpr _ -> check "do block"
+ FrameDo MDoExpr _ -> check "mdo block"
+ FrameLam {} -> check "lambda expression"
+ FrameCase {} -> check "case expression"
+ FrameLamCase {} -> check "lambda-case expression"
+ FrameLet {} -> check "let expression"
+ FrameIf {} -> check "if expression"
+ FrameProc {} -> check "proc expression"
_ -> return ()
where
check element = do
@@ -1050,18 +1054,18 @@ checkNoDocs msg ty = go ty
-- We parse patterns as expressions and check for valid patterns below,
-- converting the expression into a pattern at the same time.
-checkPattern :: SDoc -> LHsExpr GhcPs -> P (LPat GhcPs)
+checkPattern :: SDoc -> LExpPatFrame -> P (LPat GhcPs)
checkPattern msg e = checkLPat msg e
-checkPatterns :: SDoc -> [LHsExpr GhcPs] -> P [LPat GhcPs]
+checkPatterns :: SDoc -> [LExpPatFrame] -> P [LPat GhcPs]
checkPatterns msg es = mapM (checkPattern msg) es
-checkLPat :: SDoc -> LHsExpr GhcPs -> P (LPat GhcPs)
+checkLPat :: SDoc -> LExpPatFrame -> P (LPat GhcPs)
checkLPat msg e@(dL->L l _) = checkPat msg l e []
-checkPat :: SDoc -> SrcSpan -> LHsExpr GhcPs -> [LPat GhcPs]
+checkPat :: SDoc -> SrcSpan -> LExpPatFrame -> [LPat GhcPs]
-> P (LPat GhcPs)
-checkPat _ loc (dL->L l e@(HsVar _ (dL->L _ c))) args
+checkPat _ loc (dL->L l e@(FrameVar c)) args
| isRdrDataCon c = return (cL loc (ConPatIn (cL l c) (PrefixCon args)))
| not (null args) && patIsRec c =
patFail (text "Perhaps you intended to use RecursiveDo") l e
@@ -1071,103 +1075,104 @@ checkPat msg loc e args -- OK to let this happen even if bang-patterns
| Just (e', args') <- splitBang e
= do { args'' <- checkPatterns msg args'
; checkPat msg loc e' (args'' ++ args) }
-checkPat msg loc (dL->L _ (HsApp _ f e)) args
+checkPat msg loc (dL->L _ (FrameApp f e)) args
= do p <- checkLPat msg e
checkPat msg loc f (p : args)
-checkPat msg loc (dL->L _ e) []
+checkPat msg loc e []
= do p <- checkAPat msg loc e
return (cL loc p)
checkPat msg loc e _
= patFail msg loc (unLoc e)
-checkAPat :: SDoc -> SrcSpan -> HsExpr GhcPs -> P (Pat GhcPs)
-checkAPat msg loc e0 = do
+checkAPat :: SDoc -> SrcSpan -> LExpPatFrame -> P (Pat GhcPs)
+checkAPat msg loc (dL->L el e0) = do
nPlusKPatterns <- getBit NPlusKPatternsBit
case e0 of
- EWildPat _ -> return (WildPat noExt)
- HsVar _ x -> return (VarPat noExt x)
- HsLit _ (HsStringPrim _ _) -- (#13260)
+ FrameWild -> return (WildPat noExt)
+ FrameVar x -> return (VarPat noExt (cL el x))
+ FrameLit (HsStringPrim _ _) -- (#13260)
-> parseErrorSDoc loc (text "Illegal unboxed string literal in pattern:"
$$ ppr e0)
- HsLit _ l -> return (LitPat noExt l)
+ FrameLit l -> return (LitPat noExt l)
-- Overloaded numeric patterns (e.g. f 0 x = x)
-- Negation is recorded separately, so that the literal is zero or +ve
-- NB. Negative *primitive* literals are already handled by the lexer
- HsOverLit _ pos_lit -> return (mkNPat (cL loc pos_lit) Nothing)
- NegApp _ (dL->L l (HsOverLit _ pos_lit)) _
+ FrameOverLit pos_lit -> return (mkNPat (cL loc pos_lit) Nothing)
+ FrameNegApp (dL->L l (FrameOverLit pos_lit))
-> return (mkNPat (cL l pos_lit) (Just noSyntaxExpr))
- SectionR _ (dL->L lb (HsVar _ (dL->L _ bang))) e -- (! x)
+ FrameSectionR (dL->L lb (FrameVar bang)) e -- (! x)
| bang == bang_RDR
-> do { hintBangPat loc e0
; e' <- checkLPat msg e
; addAnnotation loc AnnBang lb
; return (BangPat noExt e') }
- ELazyPat _ e -> checkLPat msg e >>= (return . (LazyPat noExt))
- EAsPat _ n e -> checkLPat msg e >>= (return . (AsPat noExt) n)
+ FrameLazyPat e -> checkLPat msg e >>= (return . (LazyPat noExt))
+ FrameAsPat n e -> checkLPat msg e >>= (return . (AsPat noExt) n)
-- view pattern is well-formed if the pattern is
- EViewPat _ expr patE -> checkLPat msg patE >>=
- (return . (\p -> ViewPat noExt expr p))
- ExprWithTySig _ e t -> do e <- checkLPat msg e
- return (SigPat noExt e t)
+ FrameViewPat expr patE -> checkLPat msg patE >>=
+ (return . (\p -> ViewPat noExt (checkExpr expr) p))
+ FrameTySig e t -> do e <- checkLPat msg e
+ return (SigPat noExt e t)
-- n+k patterns
- OpApp _ (dL->L nloc (HsVar _ (dL->L _ n)))
- (dL->L _ (HsVar _ (dL->L _ plus)))
- (dL->L lloc (HsOverLit _ lit@(OverLit {ol_val = HsIntegral {}})))
+ FrameOpApp
+ (dL->L nloc (FrameVar n))
+ (dL->L _ (FrameVar plus))
+ (dL->L lloc (FrameOverLit lit@(OverLit {ol_val = HsIntegral {}})))
| nPlusKPatterns && (plus == plus_RDR)
-> return (mkNPlusKPat (cL nloc n) (cL lloc lit))
- OpApp _ l (dL->L cl (HsVar _ (dL->L _ c))) r
+ FrameOpApp l (dL->L cl (FrameVar c)) r
| isDataOcc (rdrNameOcc c) -> do
l <- checkLPat msg l
r <- checkLPat msg r
return (ConPatIn (cL cl c) (InfixCon l r))
- OpApp {} -> patFail msg loc e0
+ FrameOpApp {} -> patFail msg loc e0
- ExplicitList _ _ es -> do ps <- mapM (checkLPat msg) es
- return (ListPat noExt ps)
+ FrameList es -> do ps <- mapM (checkLPat msg) es
+ return (ListPat noExt ps)
- HsPar _ e -> checkLPat msg e >>= (return . (ParPat noExt))
+ FramePar e -> checkLPat msg e >>= (return . (ParPat noExt))
- ExplicitTuple _ es b
- | all tupArgPresent es -> do ps <- mapM (checkLPat msg)
- [e | (dL->L _ (Present _ e)) <- es]
- return (TuplePat noExt ps b)
+ FrameTuple es b
+ | Just es' <- traverse (fromTupArgPresent . unLoc) es ->
+ do ps <- mapM (checkLPat msg) es'
+ return (TuplePat noExt ps b)
| otherwise -> parseErrorSDoc loc (text "Illegal tuple section in pattern:"
$$ ppr e0)
- ExplicitSum _ alt arity expr -> do
+ FrameSum alt arity expr -> do
p <- checkLPat msg expr
return (SumPat noExt p alt arity)
- RecordCon { rcon_con_name = c, rcon_flds = HsRecFields fs dd }
+ FrameRecordCon c (HsRecFields fs dd)
-> do fs <- mapM (checkPatField msg) fs
return (ConPatIn c (RecCon (HsRecFields fs dd)))
- HsSpliceE _ s | not (isTypedSplice s)
+ FrameSplice s | not (isTypedSplice s)
-> return (SplicePat noExt s)
_ -> patFail msg loc e0
-placeHolderPunRhs :: LHsExpr GhcPs
+placeHolderPunRhs :: LExpPatFrame
-- The RHS of a punned record field will be filled in by the renamer
-- It's better not to make it an error, in case we want to print it when
-- debugging
-placeHolderPunRhs = noLoc (HsVar noExt (noLoc pun_RDR))
+placeHolderPunRhs = noLoc (FrameVar pun_RDR)
plus_RDR, bang_RDR, pun_RDR :: RdrName
plus_RDR = mkUnqual varName (fsLit "+") -- Hack
bang_RDR = mkUnqual varName (fsLit "!") -- Hack
pun_RDR = mkUnqual varName (fsLit "pun-right-hand-side")
-checkPatField :: SDoc -> LHsRecField GhcPs (LHsExpr GhcPs)
+checkPatField :: SDoc -> LHsRecField GhcPs LExpPatFrame
-> P (LHsRecField GhcPs (LPat GhcPs))
checkPatField msg (dL->L l fld) = do p <- checkLPat msg (hsRecFieldArg fld)
return (cL l (fld { hsRecFieldArg = p }))
-patFail :: SDoc -> SrcSpan -> HsExpr GhcPs -> P a
+patFail :: SDoc -> SrcSpan -> ExpPatFrame -> P a
patFail msg loc e = parseErrorSDoc loc err
where err = text "Parse error in pattern:" <+> ppr e
$$ msg
@@ -1181,15 +1186,15 @@ patIsRec e = e == mkUnqual varName (fsLit "rec")
checkValDef :: SDoc
-> SrcStrictness
- -> LHsExpr GhcPs
+ -> LExpPatFrame
-> Maybe (LHsType GhcPs)
- -> Located (a,GRHSs GhcPs (LHsExpr GhcPs))
+ -> Located (a,FrameGRHSs)
-> P ([AddAnn],HsBind GhcPs)
checkValDef msg _strictness lhs (Just sig) grhss
-- x :: ty = rhs parses as a *pattern* binding
= checkPatBind msg (cL (combineLocs lhs sig)
- (ExprWithTySig noExt lhs (mkLHsSigWcType sig))) grhss
+ (FrameTySig lhs (mkLHsSigWcType sig))) grhss
checkValDef msg strictness lhs Nothing g@(dL->L l (_,grhss))
= do { mb_fun <- isFunLhs lhs
@@ -1205,8 +1210,8 @@ checkFunBind :: SDoc
-> SrcSpan
-> Located RdrName
-> LexicalFixity
- -> [LHsExpr GhcPs]
- -> Located (GRHSs GhcPs (LHsExpr GhcPs))
+ -> [LExpPatFrame]
+ -> Located FrameGRHSs
-> P ([AddAnn],HsBind GhcPs)
checkFunBind msg strictness ann lhs_loc fun is_infix pats (dL->L rhs_span grhss)
= do ps <- checkPatterns msg pats
@@ -1220,7 +1225,7 @@ checkFunBind msg strictness ann lhs_loc fun is_infix pats (dL->L rhs_span grhss)
, mc_fixity = is_infix
, mc_strictness = strictness }
, m_pats = ps
- , m_grhss = grhss })])
+ , m_grhss = checkExprGRHSs grhss })])
-- The span of the match covers the entire equation.
-- That isn't quite right, but it'll do for now.
@@ -1235,19 +1240,19 @@ makeFunBind fn ms
fun_tick = [] }
checkPatBind :: SDoc
- -> LHsExpr GhcPs
- -> Located (a,GRHSs GhcPs (LHsExpr GhcPs))
+ -> LExpPatFrame
+ -> Located (a,FrameGRHSs)
-> P ([AddAnn],HsBind GhcPs)
checkPatBind msg lhs (dL->L _ (_,grhss))
= do { lhs <- checkPattern msg lhs
- ; return ([],PatBind noExt lhs grhss
+ ; return ([],PatBind noExt lhs (checkExprGRHSs grhss)
([],[])) }
-checkValSigLhs :: LHsExpr GhcPs -> P (Located RdrName)
-checkValSigLhs (dL->L _ (HsVar _ lrdr@(dL->L _ v)))
+checkValSigLhs :: LExpPatFrame -> P (Located RdrName)
+checkValSigLhs (dL->L l (FrameVar v))
| isUnqual v
, not (isDataOcc (rdrNameOcc v))
- = return lrdr
+ = return (cL l v)
checkValSigLhs lhs@(dL->L l _)
= parseErrorSDoc l ((text "Invalid type signature:" <+>
@@ -1267,8 +1272,8 @@ checkValSigLhs lhs@(dL->L l _)
-- so check for that, and suggest. cf Trac #3805
-- Sadly 'foreign import' still barfs 'parse error' because
-- 'import' is a keyword
- looks_like s (dL->L _ (HsVar _ (dL->L _ v))) = v == s
- looks_like s (dL->L _ (HsApp _ lhs _)) = looks_like s lhs
+ looks_like s (dL->L _ (FrameVar v)) = v == s
+ looks_like s (dL->L _ (FrameApp lhs _)) = looks_like s lhs
looks_like _ _ = False
foreign_RDR = mkUnqual varName (fsLit "foreign")
@@ -1276,11 +1281,11 @@ checkValSigLhs lhs@(dL->L l _)
pattern_RDR = mkUnqual varName (fsLit "pattern")
-checkDoAndIfThenElse :: LHsExpr GhcPs
+checkDoAndIfThenElse :: LExpPatFrame
-> Bool
- -> LHsExpr GhcPs
+ -> LExpPatFrame
-> Bool
- -> LHsExpr GhcPs
+ -> LExpPatFrame
-> P ()
checkDoAndIfThenElse guardExpr semiThen thenExpr semiElse elseExpr
| semiThen || semiElse
@@ -1300,20 +1305,20 @@ checkDoAndIfThenElse guardExpr semiThen thenExpr semiElse elseExpr
-- The parser left-associates, so there should
-- not be any OpApps inside the e's
-splitBang :: LHsExpr GhcPs -> Maybe (LHsExpr GhcPs, [LHsExpr GhcPs])
+splitBang :: LExpPatFrame -> Maybe (LExpPatFrame, [LExpPatFrame])
-- Splits (f ! g a b) into (f, [(! g), a, b])
-splitBang (dL->L _ (OpApp _ l_arg bang@(dL->L _ (HsVar _ (dL->L _ op))) r_arg))
- | op == bang_RDR = Just (l_arg, cL l' (SectionR noExt bang arg1) : argns)
+splitBang (dL->L _ (FrameOpApp l_arg bang@(dL->L _ (FrameVar op)) r_arg))
+ | op == bang_RDR = Just (l_arg, cL l' (FrameSectionR bang arg1) : argns)
where
l' = combineLocs bang arg1
(arg1,argns) = split_bang r_arg []
- split_bang (dL->L _ (HsApp _ f e)) es = split_bang f (e:es)
+ split_bang (dL->L _ (FrameApp f e)) es = split_bang f (e:es)
split_bang e es = (e,es)
splitBang _ = Nothing
-- See Note [isFunLhs vs mergeDataCon]
-isFunLhs :: LHsExpr GhcPs
- -> P (Maybe (Located RdrName, LexicalFixity, [LHsExpr GhcPs],[AddAnn]))
+isFunLhs :: LExpPatFrame
+ -> P (Maybe (Located RdrName, LexicalFixity, [LExpPatFrame],[AddAnn]))
-- A variable binding is parsed as a FunBind.
-- Just (fun, is_infix, arg_pats) if e is a function LHS
--
@@ -1328,15 +1333,15 @@ isFunLhs :: LHsExpr GhcPs
isFunLhs e = go e [] []
where
- go (dL->L loc (HsVar _ (dL->L _ f))) es ann
+ go (dL->L loc (FrameVar f)) es ann
| not (isRdrDataCon f) = return (Just (cL loc f, Prefix, es, ann))
- go (dL->L _ (HsApp _ f e)) es ann = go f (e:es) ann
- go (dL->L l (HsPar _ e)) es@(_:_) ann = go e es (ann ++ mkParensApiAnn l)
+ go (dL->L _ (FrameApp f e)) es ann = go f (e:es) ann
+ go (dL->L l (FramePar e)) es@(_:_) ann = go e es (ann ++ mkParensApiAnn l)
-- Things of the form `!x` are also FunBinds
-- See Note [FunBind vs PatBind]
- go (dL->L _ (SectionR _ (dL->L _ (HsVar _ (dL->L _ bang)))
- (dL->L l (HsVar _ (L _ var))))) [] ann
+ go (dL->L _ (FrameSectionR (dL->L _ (FrameVar bang))
+ (dL->L l (FrameVar var)))) [] ann
| bang == bang_RDR
, not (isRdrDataCon var) = return (Just (cL l var, Prefix, [], ann))
@@ -1353,7 +1358,7 @@ isFunLhs e = go e [] []
-- ToDo: what about this?
-- x + 1 `op` y = ...
- go e@(L loc (OpApp _ l (dL->L loc' (HsVar _ (dL->L _ op))) r)) es ann
+ go e@(L loc (FrameOpApp l (dL->L loc' (FrameVar op)) r)) es ann
| Just (e',es') <- splitBang e
= do { bang_on <- getBit BangPatBit
; if bang_on then go e' (es' ++ es) ann
@@ -1367,8 +1372,8 @@ isFunLhs e = go e [] []
Just (op', Infix, j : k : es', ann')
-> return (Just (op', Infix, j : op_app : es', ann'))
where
- op_app = cL loc (OpApp noExt k
- (cL loc' (HsVar noExt (cL loc' op))) r)
+ op_app = cL loc (FrameOpApp k
+ (cL loc' (FrameVar op)) r)
_ -> return Nothing }
go _ _ _ = return Nothing
@@ -1866,93 +1871,93 @@ checkMonadComp = do
-- We parse arrow syntax as expressions and check for valid syntax below,
-- converting the expression into a pattern at the same time.
-checkCommand :: LHsExpr GhcPs -> P (LHsCmd GhcPs)
+checkCommand :: LExpPatFrame -> P (LHsCmd GhcPs)
checkCommand lc = locMap checkCmd lc
locMap :: (SrcSpan -> a -> P b) -> Located a -> P (Located b)
locMap f (dL->L l a) = f l a >>= (\b -> return $ cL l b)
-checkCmd :: SrcSpan -> HsExpr GhcPs -> P (HsCmd GhcPs)
-checkCmd _ (HsArrApp _ e1 e2 haat b) =
- return $ HsCmdArrApp noExt e1 e2 haat b
-checkCmd _ (HsArrForm _ e mf args) =
- return $ HsCmdArrForm noExt e Prefix mf args
-checkCmd _ (HsApp _ e1 e2) =
- checkCommand e1 >>= (\c -> return $ HsCmdApp noExt c e2)
-checkCmd _ (HsLam _ mg) =
- checkCmdMatchGroup mg >>= (\mg' -> return $ HsCmdLam noExt mg')
-checkCmd _ (HsPar _ e) =
+checkCmd :: SrcSpan -> ExpPatFrame -> P (HsCmd GhcPs)
+checkCmd _ (FrameArrApp e1 e2 haat b) =
+ return $ HsCmdArrApp noExt (checkExpr e1) (checkExpr e2) haat b
+checkCmd _ (FrameArrForm e args) =
+ return $ HsCmdArrForm noExt (checkExpr e) Prefix Nothing args
+checkCmd _ (FrameApp e1 e2) =
+ checkCommand e1 >>= (\c -> return $ HsCmdApp noExt c (checkExpr e2))
+checkCmd l (FrameLam ps e) = do
+ c <- checkCommand e
+ return $ HsCmdLam noExt $
+ mkMatchGroup FromSource
+ [cL l $ Match { m_ext = noExt
+ , m_ctxt = LambdaExpr
+ , m_pats = ps
+ , m_grhss = unguardedGRHSs c }]
+checkCmd _ (FramePar e) =
checkCommand e >>= (\c -> return $ HsCmdPar noExt c)
-checkCmd _ (HsCase _ e mg) =
- checkCmdMatchGroup mg >>= (\mg' -> return $ HsCmdCase noExt e mg')
-checkCmd _ (HsIf _ cf ep et ee) = do
+checkCmd _ (FrameCase e matches) = do
+ ms' <- mapM checkCmdMatch matches
+ return $
+ HsCmdCase noExt (checkExpr e) $
+ mkMatchGroup FromSource ms'
+checkCmd _ (FrameIf ep et ee) = do
pt <- checkCommand et
pe <- checkCommand ee
- return $ HsCmdIf noExt cf ep pt pe
-checkCmd _ (HsLet _ lb e) =
+ return $ HsCmdIf noExt (Just noSyntaxExpr) (checkExpr ep) pt pe
+checkCmd _ (FrameLet lb e) =
checkCommand e >>= (\c -> return $ HsCmdLet noExt lb c)
-checkCmd _ (HsDo _ DoExpr (dL->L l stmts)) =
+checkCmd l (FrameDo DoExpr stmts) =
mapM checkCmdLStmt stmts >>=
(\ss -> return $ HsCmdDo noExt (cL l ss) )
-checkCmd _ (OpApp _ eLeft op eRight) = do
+checkCmd _ (FrameOpApp eLeft op eRight) = do
-- OpApp becomes a HsCmdArrForm with a (Just fixity) in it
c1 <- checkCommand eLeft
c2 <- checkCommand eRight
let arg1 = cL (getLoc c1) $ HsCmdTop noExt c1
arg2 = cL (getLoc c2) $ HsCmdTop noExt c2
- return $ HsCmdArrForm noExt op Infix Nothing [arg1, arg2]
+ return $ HsCmdArrForm noExt (checkExpr op) Infix Nothing [arg1, arg2]
checkCmd l e = cmdFail l e
-checkCmdLStmt :: ExprLStmt GhcPs -> P (CmdLStmt GhcPs)
+checkCmdLStmt :: LFrameStmt -> P (CmdLStmt GhcPs)
checkCmdLStmt = locMap checkCmdStmt
-checkCmdStmt :: SrcSpan -> ExprStmt GhcPs -> P (CmdStmt GhcPs)
-checkCmdStmt _ (LastStmt x e s r) =
- checkCommand e >>= (\c -> return $ LastStmt x c s r)
-checkCmdStmt _ (BindStmt x pat e b f) =
- checkCommand e >>= (\c -> return $ BindStmt x pat c b f)
-checkCmdStmt _ (BodyStmt x e t g) =
- checkCommand e >>= (\c -> return $ BodyStmt x c t g)
-checkCmdStmt _ (LetStmt x bnds) = return $ LetStmt x bnds
-checkCmdStmt _ stmt@(RecStmt { recS_stmts = stmts }) = do
+checkCmdStmt :: SrcSpan -> FrameStmt -> P (CmdStmt GhcPs)
+checkCmdStmt _ (FrameBindStmt pat e) =
+ checkCommand e >>= (\c -> return $ mkBindStmt pat c)
+checkCmdStmt _ (FrameBodyStmt e) =
+ checkCommand e >>= (\c -> return $ mkBodyStmt c)
+checkCmdStmt _ (FrameLetStmt bnds) = return $ LetStmt noExt bnds
+checkCmdStmt _ (FrameRecStmt stmts) = do
ss <- mapM checkCmdLStmt stmts
- return $ stmt { recS_ext = noExt, recS_stmts = ss }
-checkCmdStmt _ (XStmtLR _) = panic "checkCmdStmt"
+ return $ mkRecStmt ss
checkCmdStmt l stmt = cmdStmtFail l stmt
-checkCmdMatchGroup :: MatchGroup GhcPs (LHsExpr GhcPs)
- -> P (MatchGroup GhcPs (LHsCmd GhcPs))
-checkCmdMatchGroup mg@(MG { mg_alts = (dL->L l ms) }) = do
- ms' <- mapM (locMap $ const convert) ms
- return $ mg { mg_ext = noExt
- , mg_alts = cL l ms' }
- where convert match@(Match { m_grhss = grhss }) = do
- grhss' <- checkCmdGRHSs grhss
- return $ match { m_ext = noExt, m_grhss = grhss'}
- convert (XMatch _) = panic "checkCmdMatchGroup.XMatch"
-checkCmdMatchGroup (XMatchGroup {}) = panic "checkCmdMatchGroup"
-
-checkCmdGRHSs :: GRHSs GhcPs (LHsExpr GhcPs) -> P (GRHSs GhcPs (LHsCmd GhcPs))
-checkCmdGRHSs (GRHSs x grhss binds) = do
+checkCmdMatch :: LFrameMatch -> P (LMatch GhcPs (LHsCmd GhcPs))
+checkCmdMatch (dL->L l match) =
+ let FrameMatch ctxt pats grhss = match in
+ checkCmdGRHSs grhss >>= \grhss' ->
+ return $ cL l $
+ Match { m_ext = NoExt,
+ m_ctxt = ctxt,
+ m_pats = pats,
+ m_grhss = grhss' }
+
+checkCmdGRHSs :: FrameGRHSs -> P (GRHSs GhcPs (LHsCmd GhcPs))
+checkCmdGRHSs (FrameGRHSs grhss binds) = do
grhss' <- mapM checkCmdGRHS grhss
- return $ GRHSs x grhss' binds
-checkCmdGRHSs (XGRHSs _) = panic "checkCmdGRHSs"
+ return $ GRHSs noExt grhss' binds
-checkCmdGRHS :: LGRHS GhcPs (LHsExpr GhcPs) -> P (LGRHS GhcPs (LHsCmd GhcPs))
+checkCmdGRHS :: LFrameGRHS -> P (LGRHS GhcPs (LHsCmd GhcPs))
checkCmdGRHS = locMap $ const convert
where
- convert (GRHS x stmts e) = do
+ convert (FrameGRHS stmts e) = do
c <- checkCommand e
--- cmdStmts <- mapM checkCmdLStmt stmts
- return $ GRHS x {- cmdStmts -} stmts c
- convert (XGRHS _) = panic "checkCmdGRHS"
-
+ return $ GRHS noExt stmts c
-cmdFail :: SrcSpan -> HsExpr GhcPs -> P a
+cmdFail :: SrcSpan -> ExpPatFrame -> P a
cmdFail loc e = parseErrorSDoc loc (text "Parse error in command:" <+> ppr e)
-cmdStmtFail :: SrcSpan -> Stmt GhcPs (LHsExpr GhcPs) -> P a
+cmdStmtFail :: SrcSpan -> FrameStmt -> P a
cmdStmtFail loc e = parseErrorSDoc loc
(text "Parse error in command statement:" <+> ppr e)
@@ -1974,17 +1979,17 @@ checkPrecP (dL->L l (_,i)) (dL->L _ ol)
, getRdrName funTyCon ]
mkRecConstrOrUpdate
- :: LHsExpr GhcPs
+ :: LExpPatFrame
-> SrcSpan
- -> ([LHsRecField GhcPs (LHsExpr GhcPs)], Bool)
- -> P (HsExpr GhcPs)
+ -> ([LHsRecField GhcPs LExpPatFrame], Bool)
+ -> P ExpPatFrame
-mkRecConstrOrUpdate (dL->L l (HsVar _ (dL->L _ c))) _ (fs,dd)
+mkRecConstrOrUpdate (dL->L l (FrameVar c)) _ (fs,dd)
| isRdrDataCon c
- = return (mkRdrRecordCon (cL l c) (mk_rec_fields fs dd))
+ = return (FrameRecordCon (cL l c) (mk_rec_fields fs dd))
mkRecConstrOrUpdate exp@(dL->L l _) _ (fs,dd)
| dd = parseErrorSDoc l (text "You cannot use `..' in a record update")
- | otherwise = return (mkRdrRecordUpd exp (map (fmap mk_rec_upd_field) fs))
+ | otherwise = return (FrameRecordUpd exp (map (fmap mk_rec_upd_field) fs))
mkRdrRecordUpd :: LHsExpr GhcPs -> [LHsRecUpdField GhcPs] -> HsExpr GhcPs
mkRdrRecordUpd exp flds
@@ -2001,7 +2006,7 @@ mk_rec_fields fs False = HsRecFields { rec_flds = fs, rec_dotdot = Nothing }
mk_rec_fields fs True = HsRecFields { rec_flds = fs
, rec_dotdot = Just (length fs) }
-mk_rec_upd_field :: HsRecField GhcPs (LHsExpr GhcPs) -> HsRecUpdField GhcPs
+mk_rec_upd_field :: HsRecField GhcPs LExpPatFrame -> FrameRecUpdField
mk_rec_upd_field (HsRecField (dL->L loc (FieldOcc _ rdr)) arg pun)
= HsRecField (L loc (Unambiguous noExt rdr)) arg pun
mk_rec_upd_field (HsRecField (dL->L _ (XFieldOcc _)) _ _)
@@ -2303,7 +2308,7 @@ parseErrorSDoc :: SrcSpan -> SDoc -> P a
parseErrorSDoc span s = failSpanMsgP span s
-- | Hint about bang patterns, assuming @BangPatterns@ is off.
-hintBangPat :: SrcSpan -> HsExpr GhcPs -> P ()
+hintBangPat :: SrcSpan -> ExpPatFrame -> P ()
hintBangPat span e = do
bang_on <- getBit BangPatBit
unless bang_on $
@@ -2311,22 +2316,22 @@ hintBangPat span e = do
(text "Illegal bang-pattern (use BangPatterns):" $$ ppr e)
data SumOrTuple
- = Sum ConTag Arity (LHsExpr GhcPs)
- | Tuple [LHsTupArg GhcPs]
+ = Sum ConTag Arity LExpPatFrame
+ | Tuple [LTupArgFrame]
-mkSumOrTuple :: Boxity -> SrcSpan -> SumOrTuple -> P (HsExpr GhcPs)
+mkSumOrTuple :: Boxity -> SrcSpan -> SumOrTuple -> P ExpPatFrame
-- Tuple
-mkSumOrTuple boxity _ (Tuple es) = return (ExplicitTuple noExt es boxity)
+mkSumOrTuple boxity _ (Tuple es) = return (FrameTuple es boxity)
-- Sum
mkSumOrTuple Unboxed _ (Sum alt arity e) =
- return (ExplicitSum noExt alt arity e)
+ return (FrameSum alt arity e)
mkSumOrTuple Boxed l (Sum alt arity (dL->L _ e)) =
parseErrorSDoc l (hang (text "Boxed sums not supported:") 2
(ppr_boxed_sum alt arity e))
where
- ppr_boxed_sum :: ConTag -> Arity -> HsExpr GhcPs -> SDoc
+ ppr_boxed_sum :: ConTag -> Arity -> ExpPatFrame -> SDoc
ppr_boxed_sum alt arity e =
text "(" <+> ppr_bars (alt - 1) <+> ppr e <+> ppr_bars (arity - alt)
<+> text ")"