From edf3988bde3c932813a7abbf0662ece76d88d175 Mon Sep 17 00:00:00 2001 From: Alan Zimmerman Date: Mon, 11 Oct 2021 23:05:08 +0100 Subject: EPA: Preserve semicolon order in annotations Ensure the AddSemiAnn items appear in increasing order, so that if they are converted to delta format they are still in the correct order. Prior to this the exact printer sorted by Span, which is meaningless for EpaDelta locations. (cherry picked from commit fcf8d3f5edab65e3b310bd7213ff7c4766ce00a7) --- compiler/GHC/Parser.y | 40 +- compiler/GHC/Parser/Annotation.hs | 7 +- compiler/GHC/Parser/PostProcess.hs | 8 +- testsuite/tests/parser/should_compile/DumpSemis.hs | 35 + .../tests/parser/should_compile/DumpSemis.stderr | 1688 ++++++++++++++++++++ .../tests/parser/should_compile/T20452.stderr | 8 +- testsuite/tests/parser/should_compile/all.T | 2 + utils/check-exact/Main.hs | 6 +- 8 files changed, 1763 insertions(+), 31 deletions(-) create mode 100644 testsuite/tests/parser/should_compile/DumpSemis.hs create mode 100644 testsuite/tests/parser/should_compile/DumpSemis.stderr diff --git a/compiler/GHC/Parser.y b/compiler/GHC/Parser.y index a696c6aea2..b8a8e311ab 100644 --- a/compiler/GHC/Parser.y +++ b/compiler/GHC/Parser.y @@ -931,7 +931,7 @@ body2 :: { (AnnList top :: { ([TrailingAnn] ,([LImportDecl GhcPs], [LHsDecl GhcPs])) } - : semis top1 { ($1, $2) } + : semis top1 { (reverse $1, $2) } top1 :: { ([LImportDecl GhcPs], [LHsDecl GhcPs]) } : importdecls_semi topdecls_cs_semi { (reverse $1, cvTopDecls $2) } @@ -1080,7 +1080,7 @@ importdecls importdecls_semi :: { [LImportDecl GhcPs] } importdecls_semi : importdecls_semi importdecl semis1 - {% do { i <- amsA $2 $3 + {% do { i <- amsA $2 (reverse $3) ; return (i : $1)} } | {- empty -} { [] } @@ -1181,7 +1181,7 @@ topdecls :: { OrdList (LHsDecl GhcPs) } -- May have trailing semicolons, can be empty topdecls_semi :: { OrdList (LHsDecl GhcPs) } - : topdecls_semi topdecl semis1 {% do { t <- amsA $2 $3 + : topdecls_semi topdecl semis1 {% do { t <- amsA $2 (reverse $3) ; return ($1 `snocOL` t) }} | {- empty -} { nilOL } @@ -1194,7 +1194,7 @@ topdecls_cs :: { OrdList (LHsDecl GhcPs) } -- May have trailing semicolons, can be empty topdecls_cs_semi :: { OrdList (LHsDecl GhcPs) } - : topdecls_cs_semi topdecl_cs semis1 {% do { t <- amsA $2 $3 + : topdecls_cs_semi topdecl_cs semis1 {% do { t <- amsA $2 (reverse $3) ; return ($1 `snocOL` t) }} | {- empty -} { nilOL } @@ -1674,7 +1674,7 @@ decl_cls : at_decl_cls { $1 } decls_cls :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed : decls_cls ';' decl_cls {% if isNilOL (snd $ unLoc $1) - then return (sLLlA $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1) + then return (sLLlA $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2) , unitOL $3)) else case (snd $ unLoc $1) of SnocOL hs t -> do @@ -1682,7 +1682,7 @@ decls_cls :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed return (sLLlA $1 $> (fst $ unLoc $1 , snocOL hs t' `appOL` unitOL $3)) } | decls_cls ';' {% if isNilOL (snd $ unLoc $1) - then return (sLL $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1) + then return (sLL $1 $> ( (fst $ unLoc $1) ++ (mz AnnSemi $2) ,snd $ unLoc $1)) else case (snd $ unLoc $1) of SnocOL hs t -> do @@ -1720,7 +1720,7 @@ decl_inst : at_decl_inst { sL1A $1 (unitOL (sL1 $1 (InstD noExtFi decls_inst :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed : decls_inst ';' decl_inst {% if isNilOL (snd $ unLoc $1) - then return (sLL $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1) + then return (sLL $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2) , unLoc $3)) else case (snd $ unLoc $1) of SnocOL hs t -> do @@ -1728,7 +1728,7 @@ decls_inst :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed return (sLL $1 $> (fst $ unLoc $1 , snocOL hs t' `appOL` unLoc $3)) } | decls_inst ';' {% if isNilOL (snd $ unLoc $1) - then return (sLL $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1) + then return (sLL $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2) ,snd $ unLoc $1)) else case (snd $ unLoc $1) of SnocOL hs t -> do @@ -1758,7 +1758,7 @@ where_inst :: { Located ([AddEpAnn] -- decls :: { Located ([TrailingAnn], OrdList (LHsDecl GhcPs)) } : decls ';' decl {% if isNilOL (snd $ unLoc $1) - then return (sLLlA $1 $> ((msemi $2) ++ (fst $ unLoc $1) + then return (sLLlA $1 $> ((fst $ unLoc $1) ++ (msemi $2) , unitOL $3)) else case (snd $ unLoc $1) of SnocOL hs t -> do @@ -1769,7 +1769,7 @@ decls :: { Located ([TrailingAnn], OrdList (LHsDecl GhcPs)) } return (rest `seq` this `seq` these `seq` (sLLlA $1 $> (fst $ unLoc $1, these))) } | decls ';' {% if isNilOL (snd $ unLoc $1) - then return (sLL $1 $> (((msemi $2) ++ (fst $ unLoc $1) + then return (sLL $1 $> (((fst $ unLoc $1) ++ (msemi $2) ,snd $ unLoc $1))) else case (snd $ unLoc $1) of SnocOL hs t -> do @@ -3206,21 +3206,21 @@ alts :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LMatch GhcPs (Loc : alts1 { $1 >>= \ $1 -> return $ sL1 $1 (fst $ unLoc $1,snd $ unLoc $1) } | ';' alts { $2 >>= \ $2 -> return $ - sLL $1 $> (((mz AnnSemi $1) ++ (fst $ unLoc $2)) + sLL $1 $> (((fst $ unLoc $2) ++ (mz AnnSemi $1)) ,snd $ unLoc $2) } alts1 :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LMatch GhcPs (LocatedA b)])) } : alts1 ';' alt { $1 >>= \ $1 -> $3 >>= \ $3 -> case snd $ unLoc $1 of - [] -> return (sLL $1 (reLoc $>) ((mz AnnSemi $2) ++(fst $ unLoc $1) + [] -> return (sLL $1 (reLoc $>) ((fst $ unLoc $1) ++ (mz AnnSemi $2) ,[$3])) (h:t) -> do h' <- addTrailingSemiA h (gl $2) return (sLL $1 (reLoc $>) (fst $ unLoc $1,$3 : h' : t)) } | alts1 ';' { $1 >>= \ $1 -> case snd $ unLoc $1 of - [] -> return (sLL $1 $> ((mz AnnSemi $2) ++(fst $ unLoc $1) + [] -> return (sLL $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2) ,[])) (h:t) -> do h' <- addTrailingSemiA h (gl $2) @@ -3289,9 +3289,9 @@ apats :: { [LPat GhcPs] } stmtlist :: { forall b. DisambECP b => PV (LocatedL [LocatedA (Stmt GhcPs (LocatedA b))]) } : '{' stmts '}' { $2 >>= \ $2 -> amsrl - (sLL $1 $> (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) (Just $ moc $1) (Just $ mcc $3) (fst $ unLoc $2) []) } -- AZ:performance of reverse? + (sLL $1 $> (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) (Just $ moc $1) (Just $ mcc $3) (fromOL $ fst $ unLoc $2) []) } | vocurly stmts close { $2 >>= \ $2 -> amsrl - (L (gl $2) (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) Nothing Nothing (fst $ unLoc $2) []) } + (L (gl $2) (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) Nothing Nothing (fromOL $ fst $ unLoc $2) []) } -- do { ;; s ; s ; ; s ;; } -- The last Stmt should be an expression, but that's hard to enforce @@ -3299,11 +3299,11 @@ stmtlist :: { forall b. DisambECP b => PV (LocatedL [LocatedA (Stmt GhcPs (Locat -- So we use BodyStmts throughout, and switch the last one over -- in ParseUtils.checkDo instead -stmts :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LStmt GhcPs (LocatedA b)])) } +stmts :: { forall b. DisambECP b => PV (Located (OrdList AddEpAnn,[LStmt GhcPs (LocatedA b)])) } : stmts ';' stmt { $1 >>= \ $1 -> $3 >>= \ ($3 :: LStmt GhcPs (LocatedA b)) -> case (snd $ unLoc $1) of - [] -> return (sLL $1 (reLoc $>) ((mj AnnSemi $2) : (fst $ unLoc $1) + [] -> return (sLL $1 (reLoc $>) ((fst $ unLoc $1) `snocOL` (mj AnnSemi $2) ,$3 : (snd $ unLoc $1))) (h:t) -> do { h' <- addTrailingSemiA h (gl $2) @@ -3311,13 +3311,13 @@ stmts :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LStmt GhcPs (Locate | stmts ';' { $1 >>= \ $1 -> case (snd $ unLoc $1) of - [] -> return (sLL $1 $> ((mj AnnSemi $2) : (fst $ unLoc $1),snd $ unLoc $1)) + [] -> return (sLL $1 $> ((fst $ unLoc $1) `snocOL` (mj AnnSemi $2),snd $ unLoc $1)) (h:t) -> do { h' <- addTrailingSemiA h (gl $2) ; return $ sL1 $1 (fst $ unLoc $1,h':t) }} | stmt { $1 >>= \ $1 -> - return $ sL1A $1 ([],[$1]) } - | {- empty -} { return $ noLoc ([],[]) } + return $ sL1A $1 (nilOL,[$1]) } + | {- empty -} { return $ noLoc (nilOL,[]) } -- For typing stmts at the GHCi prompt, where diff --git a/compiler/GHC/Parser/Annotation.hs b/compiler/GHC/Parser/Annotation.hs index 801721faca..42c98a7e36 100644 --- a/compiler/GHC/Parser/Annotation.hs +++ b/compiler/GHC/Parser/Annotation.hs @@ -392,7 +392,7 @@ instance Outputable EpaComment where -- The usual way an 'AddEpAnn' is created is using the 'mj' ("make -- jump") function, and then it can be inserted into the appropriate -- annotation. -data AddEpAnn = AddEpAnn AnnKeywordId EpaLocation deriving (Data,Eq,Ord) +data AddEpAnn = AddEpAnn AnnKeywordId EpaLocation deriving (Data,Eq) -- | The anchor for an @'AnnKeywordId'@. The Parser inserts the -- @'EpaSpan'@ variant, giving the exact location of the original item @@ -453,6 +453,9 @@ instance Outputable EpaLocation where instance Outputable AddEpAnn where ppr (AddEpAnn kw ss) = text "AddEpAnn" <+> ppr kw <+> ppr ss +instance Ord AddEpAnn where + compare (AddEpAnn kw1 loc1) (AddEpAnn kw2 loc2) = compare (loc1, kw1) (loc2,kw2) + -- --------------------------------------------------------------------- -- | The exact print annotations (EPAs) are kept in the HsSyn AST for @@ -812,7 +815,7 @@ addTrailingAnnToA s t cs EpAnnNotUsed addTrailingAnnToA _ t cs n = n { anns = addTrailing (anns n) , comments = comments n <> cs } where - addTrailing n = n { lann_trailing = t : lann_trailing n } + addTrailing n = n { lann_trailing = lann_trailing n ++ [t] } -- | Helper function used in the parser to add a comma location to an -- existing annotation. diff --git a/compiler/GHC/Parser/PostProcess.hs b/compiler/GHC/Parser/PostProcess.hs index 19f78135c3..43423b52d5 100644 --- a/compiler/GHC/Parser/PostProcess.hs +++ b/compiler/GHC/Parser/PostProcess.hs @@ -834,7 +834,7 @@ checkTyVars pp_what equals_or_where tc tparms chkParens :: [AddEpAnn] -> EpAnnComments -> LHsType GhcPs -> P (LHsTyVarBndr () GhcPs) chkParens acc cs (L l (HsParTy an ty)) - = chkParens (mkParensEpAnn (locA l) ++ acc) (cs Semi.<> epAnnComments an) ty + = chkParens (sort $ mkParensEpAnn (locA l) ++ acc) (cs Semi.<> epAnnComments an) ty chkParens acc cs ty = chk acc cs ty -- Check that the name space is correct! @@ -937,7 +937,7 @@ checkTyClHdr is_cls ty | isRdrTc tc = return (ltc, acc, fix, ann) go _ (HsOpTy _ t1 ltc@(L _ tc) t2) acc ann _fix | isRdrTc tc = return (ltc, HsValArg t1:HsValArg t2:acc, Infix, ann) - go l (HsParTy _ ty) acc ann fix = goL ty acc (ann ++mkParensEpAnn l) fix + go l (HsParTy _ ty) acc ann fix = goL ty acc (sort $ ann ++mkParensEpAnn l) fix go _ (HsAppTy _ t1 t2) acc ann fix = goL t1 (HsValArg t2:acc) ann fix go _ (HsAppKindTy l ty ki) acc ann fix = goL ty (HsTypeArg l ki:acc) ann fix go l (HsTupleTy _ HsBoxedOrConstraintTuple ts) [] ann fix @@ -1023,7 +1023,7 @@ checkContext orig_t@(L (SrcSpanAnn _ l) _orig_t) = EpAnnNotUsed -> ([],[],emptyComments) EpAnn _ (AnnParen _ o c) cs -> ([o],[c],cs) return (L (SrcSpanAnn (EpAnn (spanAsAnchor l) - (AnnContext Nothing (op Semi.<> oparens) (cp Semi.<> cparens)) (cs Semi.<> cs')) l) ts) + (AnnContext Nothing (sort $ op Semi.<> oparens) (sort $ cp Semi.<> cparens)) (cs Semi.<> cs')) l) ts) check (opi,cpi,csi) (L _lp1 (HsParTy ann' ty)) -- to be sure HsParTy doesn't get into the way @@ -1284,7 +1284,7 @@ isFunLhs e = go e [] [] | not (isRdrDataCon f) = return (Just (L loc f, Prefix, es, ann)) go (L _ (PatBuilderApp f e)) es ann = go f (e:es) ann go (L l (PatBuilderPar e _an)) es@(_:_) ann - = go e es (ann ++ mkParensEpAnn (locA l)) + = go e es (sort $ ann ++ mkParensEpAnn (locA l)) go (L loc (PatBuilderOpApp l (L loc' op) r (EpAnn loca anns cs))) es ann | not (isRdrDataCon op) -- We have found the function! = return (Just (L loc' op, Infix, (l:r:es), (anns ++ ann))) diff --git a/testsuite/tests/parser/should_compile/DumpSemis.hs b/testsuite/tests/parser/should_compile/DumpSemis.hs new file mode 100644 index 0000000000..ee674a8d63 --- /dev/null +++ b/testsuite/tests/parser/should_compile/DumpSemis.hs @@ -0,0 +1,35 @@ +module DumpSemis where + +-- Make sure we get all the semicolons in statements +;;;; ;; +import Data.List +; ; ; +import Data.Kind + ; ;; +foo :: IO () +foo = do + do { ;;;; a } + a +; ;; +bar :: IO () +bar = do + { ; ; + a ;; + b + } + ; ;; ; +baz :: IO () +baz = do { ;; s ; s ; ; s ;; } +; +a = undefined +b = undefined +s = undefined +; +class LiftingMonad2 ((trans :: Type)) where + proof :: trans -> Int +; +f :: ((Eq a, Ord a)) => a -> a +f x = x +; + ;;x=let{;;;;;y=2;;z=3;;;;}in y; +; diff --git a/testsuite/tests/parser/should_compile/DumpSemis.stderr b/testsuite/tests/parser/should_compile/DumpSemis.stderr new file mode 100644 index 0000000000..788a9a2e0d --- /dev/null +++ b/testsuite/tests/parser/should_compile/DumpSemis.stderr @@ -0,0 +1,1688 @@ + +==================== Parser AST ==================== + +(L + { DumpSemis.hs:1:1 } + (HsModule + (EpAnn + (Anchor + { DumpSemis.hs:1:1 } + (UnchangedAnchor)) + (AnnsModule + [(AddEpAnn AnnModule (EpaSpan { DumpSemis.hs:1:1-6 })) + ,(AddEpAnn AnnWhere (EpaSpan { DumpSemis.hs:1:18-22 }))] + (AnnList + (Nothing) + (Nothing) + (Nothing) + [] + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:4:1 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:4:2 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:4:3 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:4:4 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:4:7 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:4:8 }))])) + (EpaCommentsBalanced + [] + [(L + (Anchor + { DumpSemis.hs:36:1 } + (UnchangedAnchor)) + (EpaComment + (EpaEofComment) + { DumpSemis.hs:36:1 }))])) + (VirtualBraces + (1)) + (Just + (L + { DumpSemis.hs:1:8-16 } + {ModuleName: DumpSemis})) + (Nothing) + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:5:1-16 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:6:1 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:6:3 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:6:5 }))]) + (EpaComments + [])) { DumpSemis.hs:5:1-16 }) + (ImportDecl + (EpAnn + (Anchor + { DumpSemis.hs:5:1-6 } + (UnchangedAnchor)) + (EpAnnImportDecl + (EpaSpan { DumpSemis.hs:5:1-6 }) + (Nothing) + (Nothing) + (Nothing) + (Nothing) + (Nothing)) + (EpaComments + [])) + (NoSourceText) + (L + { DumpSemis.hs:5:8-16 } + {ModuleName: Data.List}) + (Nothing) + (NotBoot) + (False) + (NotQualified) + (False) + (Nothing) + (Nothing))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:7:1-16 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:8:4 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:8:6 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:8:7 }))]) + (EpaComments + [])) { DumpSemis.hs:7:1-16 }) + (ImportDecl + (EpAnn + (Anchor + { DumpSemis.hs:7:1-6 } + (UnchangedAnchor)) + (EpAnnImportDecl + (EpaSpan { DumpSemis.hs:7:1-6 }) + (Nothing) + (Nothing) + (Nothing) + (Nothing) + (Nothing)) + (EpaComments + [])) + (NoSourceText) + (L + { DumpSemis.hs:7:8-16 } + {ModuleName: Data.Kind}) + (Nothing) + (NotBoot) + (False) + (NotQualified) + (False) + (Nothing) + (Nothing)))] + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:9:1-12 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:9:1-12 }) + (SigD + (NoExtField) + (TypeSig + (EpAnn + (Anchor + { DumpSemis.hs:9:1-3 } + (UnchangedAnchor)) + (AnnSig + (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:9:5-6 })) + []) + (EpaComments + [])) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:1-3 }) + (Unqual + {OccName: foo}))] + (HsWC + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-12 }) + (HsSig + (NoExtField) + (HsOuterImplicit + (NoExtField)) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-12 }) + (HsAppTy + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-9 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:9:8-9 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-9 }) + (Unqual + {OccName: IO})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:11-12 }) + (HsTupleTy + (EpAnn + (Anchor + { DumpSemis.hs:9:11 } + (UnchangedAnchor)) + (AnnParen + (AnnParens) + (EpaSpan { DumpSemis.hs:9:11 }) + (EpaSpan { DumpSemis.hs:9:12 })) + (EpaComments + [])) + (HsBoxedOrConstraintTuple) + [])))))))))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:(10,1)-(12,3) } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:13:1 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:13:3 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:13:4 }))]) + (EpaComments + [])) { DumpSemis.hs:(10,1)-(12,3) }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:10:1-3 }) + (Unqual + {OccName: foo})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(10,1)-(12,3) }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(10,1)-(12,3) }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:(10,1)-(12,3) } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:10:1-3 }) + (Unqual + {OccName: foo})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:(10,5)-(12,3) } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:(10,5)-(12,3) } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:10:5 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(10,7)-(12,3) }) + (HsDo + (EpAnn + (Anchor + { DumpSemis.hs:(10,7)-(12,3) } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:(11,3)-(12,3) } + (UnchangedAnchor))) + (Nothing) + (Nothing) + [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:10:7-8 }))] + []) + (EpaComments + [])) + (DoExpr + (Nothing)) + (L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:(11,3)-(12,3) } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:(11,3)-(12,3) } + (UnchangedAnchor))) + (Nothing) + (Nothing) + [] + []) + (EpaComments + [])) { DumpSemis.hs:(11,3)-(12,3) }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:3-15 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:3-15 }) + (HsDo + (EpAnn + (Anchor + { DumpSemis.hs:11:3-15 } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:11:6-15 } + (UnchangedAnchor))) + (Nothing) + (Nothing) + [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:11:3-4 }))] + []) + (EpaComments + [])) + (DoExpr + (Nothing)) + (L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:11:6-15 } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:11:8-13 } + (UnchangedAnchor))) + (Just + (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:11:6 }))) + (Just + (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:11:15 }))) + [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:8 })) + ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:9 })) + ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:10 })) + ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:11 }))] + []) + (EpaComments + [])) { DumpSemis.hs:11:6-15 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:13 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:13 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:13 }) + (Unqual + {OccName: a})))) + (NoExtField) + (NoExtField)))]))) + (NoExtField) + (NoExtField))) + ,(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:12:3 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:12:3 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:12:3 }) + (Unqual + {OccName: a})))) + (NoExtField) + (NoExtField)))])))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:14:1-12 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:14:1-12 }) + (SigD + (NoExtField) + (TypeSig + (EpAnn + (Anchor + { DumpSemis.hs:14:1-3 } + (UnchangedAnchor)) + (AnnSig + (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:14:5-6 })) + []) + (EpaComments + [])) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:1-3 }) + (Unqual + {OccName: bar}))] + (HsWC + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-12 }) + (HsSig + (NoExtField) + (HsOuterImplicit + (NoExtField)) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-12 }) + (HsAppTy + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-9 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:14:8-9 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-9 }) + (Unqual + {OccName: IO})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:11-12 }) + (HsTupleTy + (EpAnn + (Anchor + { DumpSemis.hs:14:11 } + (UnchangedAnchor)) + (AnnParen + (AnnParens) + (EpaSpan { DumpSemis.hs:14:11 }) + (EpaSpan { DumpSemis.hs:14:12 })) + (EpaComments + [])) + (HsBoxedOrConstraintTuple) + [])))))))))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:(15,1)-(19,3) } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:20:2 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:20:4 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:20:5 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:20:8 }))]) + (EpaComments + [])) { DumpSemis.hs:(15,1)-(19,3) }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:15:1-3 }) + (Unqual + {OccName: bar})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(15,1)-(19,3) }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(15,1)-(19,3) }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:(15,1)-(19,3) } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:15:1-3 }) + (Unqual + {OccName: bar})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:(15,5)-(19,3) } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:(15,5)-(19,3) } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:15:5 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(15,7)-(19,3) }) + (HsDo + (EpAnn + (Anchor + { DumpSemis.hs:(15,7)-(19,3) } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:(16,3)-(19,3) } + (UnchangedAnchor))) + (Nothing) + (Nothing) + [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:15:7-8 }))] + []) + (EpaComments + [])) + (DoExpr + (Nothing)) + (L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:(16,3)-(19,3) } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:(16,5)-(18,5) } + (UnchangedAnchor))) + (Just + (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:16:3 }))) + (Just + (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:19:3 }))) + [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:16:5 })) + ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:16:8 }))] + []) + (EpaComments + [])) { DumpSemis.hs:(16,3)-(19,3) }) + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:17:5 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:17:7 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:17:8 }))]) + (EpaComments + [])) { DumpSemis.hs:17:5 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:17:5 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:17:5 }) + (Unqual + {OccName: a})))) + (NoExtField) + (NoExtField))) + ,(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:18:5 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:18:5 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:18:5 }) + (Unqual + {OccName: b})))) + (NoExtField) + (NoExtField)))])))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:21:1-12 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:21:1-12 }) + (SigD + (NoExtField) + (TypeSig + (EpAnn + (Anchor + { DumpSemis.hs:21:1-3 } + (UnchangedAnchor)) + (AnnSig + (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:21:5-6 })) + []) + (EpaComments + [])) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:1-3 }) + (Unqual + {OccName: baz}))] + (HsWC + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-12 }) + (HsSig + (NoExtField) + (HsOuterImplicit + (NoExtField)) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-12 }) + (HsAppTy + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-9 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:21:8-9 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-9 }) + (Unqual + {OccName: IO})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:11-12 }) + (HsTupleTy + (EpAnn + (Anchor + { DumpSemis.hs:21:11 } + (UnchangedAnchor)) + (AnnParen + (AnnParens) + (EpaSpan { DumpSemis.hs:21:11 }) + (EpaSpan { DumpSemis.hs:21:12 })) + (EpaComments + [])) + (HsBoxedOrConstraintTuple) + [])))))))))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:22:1-30 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:23:1 }))]) + (EpaComments + [])) { DumpSemis.hs:22:1-30 }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-3 }) + (Unqual + {OccName: baz})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-30 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-30 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:22:1-30 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-3 }) + (Unqual + {OccName: baz})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:22:5-30 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:22:5-30 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:22:5 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:7-30 }) + (HsDo + (EpAnn + (Anchor + { DumpSemis.hs:22:7-30 } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:22:10-30 } + (UnchangedAnchor))) + (Nothing) + (Nothing) + [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:22:7-8 }))] + []) + (EpaComments + [])) + (DoExpr + (Nothing)) + (L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:22:10-30 } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:22:12-25 } + (UnchangedAnchor))) + (Just + (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:22:10 }))) + (Just + (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:22:30 }))) + [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:22:12 })) + ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:22:13 }))] + []) + (EpaComments + [])) { DumpSemis.hs:22:10-30 }) + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:22:15 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:22:17 }))]) + (EpaComments + [])) { DumpSemis.hs:22:15 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:15 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:15 }) + (Unqual + {OccName: s})))) + (NoExtField) + (NoExtField))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:22:19 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:22:21 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:22:23 }))]) + (EpaComments + [])) { DumpSemis.hs:22:19 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:19 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:19 }) + (Unqual + {OccName: s})))) + (NoExtField) + (NoExtField))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:22:25 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:22:27 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:22:28 }))]) + (EpaComments + [])) { DumpSemis.hs:22:25 }) + (BodyStmt + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:25 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:25 }) + (Unqual + {OccName: s})))) + (NoExtField) + (NoExtField)))])))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:24:1-13 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:24:1-13 }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1 }) + (Unqual + {OccName: a})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1-13 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1-13 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:24:1-13 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1 }) + (Unqual + {OccName: a})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:24:3-13 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:24:3-13 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:24:3 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:5-13 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:5-13 }) + (Unqual + {OccName: undefined}))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:25:1-13 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:25:1-13 }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1 }) + (Unqual + {OccName: b})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1-13 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1-13 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:25:1-13 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1 }) + (Unqual + {OccName: b})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:25:3-13 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:25:3-13 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:25:3 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:5-13 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:5-13 }) + (Unqual + {OccName: undefined}))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:26:1-13 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:27:1 }))]) + (EpaComments + [])) { DumpSemis.hs:26:1-13 }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1 }) + (Unqual + {OccName: s})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1-13 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1-13 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:26:1-13 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1 }) + (Unqual + {OccName: s})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:26:3-13 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:26:3-13 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:26:3 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:5-13 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:5-13 }) + (Unqual + {OccName: undefined}))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:(28,1)-(29,23) } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:30:1 }))]) + (EpaComments + [])) { DumpSemis.hs:(28,1)-(29,23) }) + (TyClD + (NoExtField) + (ClassDecl + ((,,) + (EpAnn + (Anchor + { DumpSemis.hs:(28,1)-(29,23) } + (UnchangedAnchor)) + [(AddEpAnn AnnClass (EpaSpan { DumpSemis.hs:28:1-5 })) + ,(AddEpAnn AnnWhere (EpaSpan { DumpSemis.hs:28:40-44 }))] + (EpaComments + [])) + (NoAnnSortKey) + (VirtualBraces + (3))) + (Nothing) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:7-19 }) + (Unqual + {OccName: LiftingMonad2})) + (HsQTvs + (NoExtField) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:22-38 }) + (KindedTyVar + (EpAnn + (Anchor + { DumpSemis.hs:28:22-38 } + (UnchangedAnchor)) + [(AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:28:30-31 })) + ,(AddEpAnn AnnOpenP (EpaSpan { DumpSemis.hs:28:22 })) + ,(AddEpAnn AnnOpenP (EpaSpan { DumpSemis.hs:28:23 })) + ,(AddEpAnn AnnCloseP (EpaSpan { DumpSemis.hs:28:37 })) + ,(AddEpAnn AnnCloseP (EpaSpan { DumpSemis.hs:28:38 }))] + (EpaComments + [])) + (()) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:24-28 }) + (Unqual + {OccName: trans})) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:33-36 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:28:33-36 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:33-36 }) + (Unqual + {OccName: Type}))))))]) + (Prefix) + [] + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:3-23 }) + (ClassOpSig + (EpAnn + (Anchor + { DumpSemis.hs:29:3-7 } + (UnchangedAnchor)) + (AnnSig + (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:29:9-10 })) + []) + (EpaComments + [])) + (False) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:3-7 }) + (Unqual + {OccName: proof}))] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-23 }) + (HsSig + (NoExtField) + (HsOuterImplicit + (NoExtField)) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-23 }) + (HsFunTy + (EpAnn + (Anchor + { DumpSemis.hs:29:12-16 } + (UnchangedAnchor)) + (NoEpAnns) + (EpaComments + [])) + (HsUnrestrictedArrow + (L + (TokenLoc + (EpaSpan { DumpSemis.hs:29:18-19 })) + (HsNormalTok))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-16 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:29:12-16 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-16 }) + (Unqual + {OccName: trans})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:21-23 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:29:21-23 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:21-23 }) + (Unqual + {OccName: Int}))))))))))] + {Bag(LocatedA (HsBind GhcPs)): + []} + [] + [] + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:31:1-30 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:31:1-30 }) + (SigD + (NoExtField) + (TypeSig + (EpAnn + (Anchor + { DumpSemis.hs:31:1 } + (UnchangedAnchor)) + (AnnSig + (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:31:3-4 })) + []) + (EpaComments + [])) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:1 }) + (Unqual + {OccName: f}))] + (HsWC + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:6-30 }) + (HsSig + (NoExtField) + (HsOuterImplicit + (NoExtField)) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:6-30 }) + (HsQualTy + (NoExtField) + (L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:31:6-20 } + (UnchangedAnchor)) + (AnnContext + (Just + ((,) + (NormalSyntax) + (EpaSpan { DumpSemis.hs:31:22-23 }))) + [(EpaSpan { DumpSemis.hs:31:6 }) + ,(EpaSpan { DumpSemis.hs:31:7 })] + [(EpaSpan { DumpSemis.hs:31:19 }) + ,(EpaSpan { DumpSemis.hs:31:20 })]) + (EpaComments + [])) { DumpSemis.hs:31:6-20 }) + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:31:8-11 } + (UnchangedAnchor)) + (AnnListItem + [(AddCommaAnn + (EpaSpan { DumpSemis.hs:31:12 }))]) + (EpaComments + [])) { DumpSemis.hs:31:8-11 }) + (HsAppTy + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:8-9 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:31:8-9 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:8-9 }) + (Unqual + {OccName: Eq})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:11 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:31:11 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:11 }) + (Unqual + {OccName: a})))))) + ,(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:14-18 }) + (HsAppTy + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:14-16 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:31:14-16 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:14-16 }) + (Unqual + {OccName: Ord})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:18 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:31:18 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:18 }) + (Unqual + {OccName: a}))))))]) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:25-30 }) + (HsFunTy + (EpAnn + (Anchor + { DumpSemis.hs:31:25 } + (UnchangedAnchor)) + (NoEpAnns) + (EpaComments + [])) + (HsUnrestrictedArrow + (L + (TokenLoc + (EpaSpan { DumpSemis.hs:31:27-28 })) + (HsNormalTok))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:25 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:31:25 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:25 }) + (Unqual + {OccName: a})))) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:30 }) + (HsTyVar + (EpAnn + (Anchor + { DumpSemis.hs:31:30 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (NotPromoted) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:30 }) + (Unqual + {OccName: a})))))))))))))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:32:1-7 } + (UnchangedAnchor)) + (AnnListItem + []) + (EpaComments + [])) { DumpSemis.hs:32:1-7 }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:1 }) + (Unqual + {OccName: f})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:1-7 }) + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:32:1-7 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:33:1 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:6 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:7 }))]) + (EpaComments + [])) { DumpSemis.hs:32:1-7 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:32:1-7 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:1 }) + (Unqual + {OccName: f})) + (Prefix) + (NoSrcStrict)) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:3 }) + (VarPat + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:3 }) + (Unqual + {OccName: x}))))] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:32:5-7 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:32:5-7 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:32:5 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:7 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:7 }) + (Unqual + {OccName: x}))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:34:8-35 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:36 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:35:1 }))]) + (EpaComments + [])) { DumpSemis.hs:34:8-35 }) + (ValD + (NoExtField) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8 }) + (Unqual + {OccName: x})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8-35 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8-35 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:34:8-35 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8 }) + (Unqual + {OccName: x})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:34:9-35 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:34:9-35 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:9 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:10-35 }) + (HsLet + (EpAnn + (Anchor + { DumpSemis.hs:34:10-35 } + (UnchangedAnchor)) + (AnnsLet + (EpaSpan { DumpSemis.hs:34:10-12 }) + (EpaSpan { DumpSemis.hs:34:32-33 })) + (EpaComments + [])) + (HsValBinds + (EpAnn + (Anchor + { DumpSemis.hs:34:13-31 } + (UnchangedAnchor)) + (AnnList + (Just + (Anchor + { DumpSemis.hs:34:14-30 } + (UnchangedAnchor))) + (Just + (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:34:13 }))) + (Just + (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:34:31 }))) + [] + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:14 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:15 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:16 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:17 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:18 }))]) + (EpaComments + [])) + (ValBinds + (NoAnnSortKey) + {Bag(LocatedA (HsBind GhcPs)): + [(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:34:19-21 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:22 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:23 }))]) + (EpaComments + [])) { DumpSemis.hs:34:19-21 }) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19 }) + (Unqual + {OccName: y})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19-21 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19-21 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:34:19-21 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19 }) + (Unqual + {OccName: y})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:34:20-21 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:34:20-21 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:20 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:21 }) + (HsOverLit + (EpAnn + (Anchor + { DumpSemis.hs:34:21 } + (UnchangedAnchor)) + (NoEpAnns) + (EpaComments + [])) + (OverLit + (NoExtField) + (HsIntegral + (IL + (SourceText 2) + (False) + (2))))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + [])) + ,(L + (SrcSpanAnn (EpAnn + (Anchor + { DumpSemis.hs:34:24-26 } + (UnchangedAnchor)) + (AnnListItem + [(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:27 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:28 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:29 })) + ,(AddSemiAnn + (EpaSpan { DumpSemis.hs:34:30 }))]) + (EpaComments + [])) { DumpSemis.hs:34:24-26 }) + (FunBind + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24 }) + (Unqual + {OccName: z})) + (MG + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24-26 }) + [(L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24-26 }) + (Match + (EpAnn + (Anchor + { DumpSemis.hs:34:24-26 } + (UnchangedAnchor)) + [] + (EpaComments + [])) + (FunRhs + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24 }) + (Unqual + {OccName: z})) + (Prefix) + (NoSrcStrict)) + [] + (GRHSs + (EpaComments + []) + [(L + { DumpSemis.hs:34:25-26 } + (GRHS + (EpAnn + (Anchor + { DumpSemis.hs:34:25-26 } + (UnchangedAnchor)) + (GrhsAnn + (Nothing) + (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:25 }))) + (EpaComments + [])) + [] + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:26 }) + (HsOverLit + (EpAnn + (Anchor + { DumpSemis.hs:34:26 } + (UnchangedAnchor)) + (NoEpAnns) + (EpaComments + [])) + (OverLit + (NoExtField) + (HsIntegral + (IL + (SourceText 3) + (False) + (3))))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + []))]} + [])) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:35 }) + (HsVar + (NoExtField) + (L + (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:35 }) + (Unqual + {OccName: y}))))))))] + (EmptyLocalBinds + (NoExtField)))))]) + (FromSource)) + [])))] + (Nothing) + (Nothing))) \ No newline at end of file diff --git a/testsuite/tests/parser/should_compile/T20452.stderr b/testsuite/tests/parser/should_compile/T20452.stderr index 8cd03e685f..c5eded00e9 100644 --- a/testsuite/tests/parser/should_compile/T20452.stderr +++ b/testsuite/tests/parser/should_compile/T20452.stderr @@ -155,9 +155,9 @@ { T20452.hs:6:13-22 } (UnchangedAnchor)) [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:6:17-18 })) + ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:6:13 })) ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:6:14 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:6:21 })) - ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:6:13 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:6:22 }))] (EpaComments [])) @@ -436,9 +436,9 @@ { T20452.hs:9:14-27 } (UnchangedAnchor)) [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:20-21 })) + ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:14 })) ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:15 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:26 })) - ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:14 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:27 }))] (EpaComments [])) @@ -470,9 +470,9 @@ { T20452.hs:9:29-46 } (UnchangedAnchor)) [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:36-37 })) + ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:29 })) ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:30 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:45 })) - ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:29 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:46 }))] (EpaComments [])) @@ -504,9 +504,9 @@ { T20452.hs:9:48-76 } (UnchangedAnchor)) [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:54-55 })) + ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:48 })) ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:49 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:75 })) - ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:48 })) ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:76 }))] (EpaComments [])) diff --git a/testsuite/tests/parser/should_compile/all.T b/testsuite/tests/parser/should_compile/all.T index d24321a103..5f81a651c3 100644 --- a/testsuite/tests/parser/should_compile/all.T +++ b/testsuite/tests/parser/should_compile/all.T @@ -179,3 +179,5 @@ test('T19521', normal, compile, ['']) test('T20186', normal, compile, ['']) test('T20452', normal, compile, ['']) + +test('DumpSemis', normal, compile, ['-dsuppress-uniques -ddump-parsed-ast']) diff --git a/utils/check-exact/Main.hs b/utils/check-exact/Main.hs index e13fdf832e..bcb6dc3525 100644 --- a/utils/check-exact/Main.hs +++ b/utils/check-exact/Main.hs @@ -188,9 +188,13 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/exactprin -- "../../testsuite/tests/printer/Test19813.hs" Nothing -- "../../testsuite/tests/printer/Test19814.hs" Nothing -- "../../testsuite/tests/printer/Test19821.hs" Nothing - "../../testsuite/tests/printer/Test19834.hs" Nothing + -- "../../testsuite/tests/printer/Test19834.hs" Nothing -- "../../testsuite/tests/printer/Test19840.hs" Nothing -- "../../testsuite/tests/printer/Test19850.hs" Nothing + -- "../../testsuite/tests/printer/PprLinearArrow.hs" Nothing + -- "../../testsuite/tests/printer/PprSemis.hs" Nothing + -- "../../testsuite/tests/printer/PprEmptyMostly.hs" Nothing + "../../testsuite/tests/parser/should_compile/DumpSemis.hs" Nothing -- cloneT does not need a test, function can be retired -- cgit v1.2.1