@@ -192,14 +192,14 @@ p_match' placer render style isInfix strictness m_pats m_grhss = do
192192 then id
193193 else inci
194194 switchLayout [combinedSpans] $ do
195− let stdCase = sep breakpoint (located' p_pat) m_pats
195+ let stdCase = sep breakpoint p_pat m_pats
196196 case style of
197197 Function name ->
198198 p_infixDefHelper
199199 isInfix
200200 inci'
201201 (p_rdrName name)
202− (located' p_pat <$> m_pats)
202+ (p_pat <$> m_pats)
203203 PatternBind -> stdCase
204204 Case -> stdCase
205205 Lambda -> do
@@ -367,18 +367,22 @@ p_stmt' ::
367367 R ()
368368p_stmt' placer render = \case
369369 LastStmt NoExt body _ _ -> located body render
370− BindStmt NoExt l f _ _ -> do
371− located l p_pat
370+ BindStmt NoExt p f _ _ -> do
371+ p_pat p
372372 space
373373 txt "<-"
374+ -- https://gitlab.haskell.org/ghc/ghc/issues/17330
375+ let loc = case p of
376+ XPat pat -> getLoc pat
377+ _ -> error "p_stmt': BindStmt: Pat does not contain a location"
374378 let placement =
375379 case f of
376380 L l' x ->
377381 if isOneLineSpan
378− (mkSrcSpan (srcSpanEnd (getLoc l)) (srcSpanStart l'))
382+ (mkSrcSpan (srcSpanEnd loc) (srcSpanStart l'))
379383 then placer x
380384 else Normal
381− switchLayout [getLoc l, getLoc f] $
385+ switchLayout [loc, getLoc f] $
382386 placeHanging placement (located f render)
383387 ApplicativeStmt {} -> notImplemented "ApplicativeStmt" -- generated by renamer
384388 BodyStmt NoExt body _ _ -> located body render
@@ -564,7 +568,7 @@ p_hsExpr' s = \case
564568 sep breakpoint (located' p_hsExpr) initp
565569 placeHanging placement $
566570 located lastp p_hsExpr
567− HsAppType a e -> do
571+ HsAppType NoExt e a -> do
568572 located e p_hsExpr
569573 breakpoint
570574 inci $ do
@@ -687,7 +691,7 @@ p_hsExpr' s = \case
687691 (comma >> breakpoint)
688692 (sitcc . located' (p_hsRecField . updName))
689693 rupd_flds
690− ExprWithTySig affix x -> sitcc $ do
694+ ExprWithTySig NoExt x affix -> sitcc $ do
691695 located x p_hsExpr
692696 space
693697 txt "::"
@@ -736,7 +740,7 @@ p_hsExpr' s = \case
736740 HsSpliceE NoExt splice -> p_hsSplice splice
737741 HsProc NoExt p e -> do
738742 txt "proc"
739− located p $ \x -> do
743+ locatedPat p $ \x -> do
740744 breakpoint
741745 inci (p_pat x)
742746 breakpoint
@@ -781,15 +785,15 @@ p_patSynBind PSB {..} = do
781785 Unidirectional -> do
782786 txt "<-"
783787 breakpoint
784− located psb_def p_pat
788+ p_pat psb_def
785789 ImplicitBidirectional -> do
786790 txt "="
787791 breakpoint
788− located psb_def p_pat
792+ p_pat psb_def
789793 ExplicitBidirectional mgroup -> do
790794 txt "<-"
791795 breakpoint
792− located psb_def p_pat
796+ p_pat psb_def
793797 newline
794798 txt "where"
795799 newline
@@ -890,37 +894,40 @@ p_let render localBinds e = sitcc $ do
890894
891895p_pat :: Pat GhcPs -> R ()
892896p_pat = \case
897+ -- Note: starting from GHC 8.8, 'LPat' == 'Pat'. Located 'Pat's are always
898+ -- constructed with the 'XPat' constructor, containing a @Located Pat@.
899+ XPat pat -> located pat p_pat
893900 WildPat NoExt -> txt "_"
894901 VarPat NoExt name -> p_rdrName name
895902 LazyPat NoExt pat -> do
896903 txt "~"
897− located pat p_pat
904+ p_pat pat
898905 AsPat NoExt name pat -> do
899906 p_rdrName name
900907 txt "@"
901− located pat p_pat
908+ p_pat pat
902909 ParPat NoExt pat ->
903− located pat (parens S . p_pat)
910+ locatedPat pat (parens S . p_pat)
904911 BangPat NoExt pat -> do
905912 txt "!"
906− located pat p_pat
913+ p_pat pat
907914 ListPat NoExt pats -> do
908− brackets S . sitcc $ sep (comma >> breakpoint) (located' p_pat) pats
915+ brackets S . sitcc $ sep (comma >> breakpoint) p_pat pats
909916 TuplePat NoExt pats boxing -> do
910917 let f =
911918 case boxing of
912919 Boxed -> parens S
913920 Unboxed -> parensHash S
914− f . sitcc $ sep (comma >> breakpoint) (sitcc . located' p_pat) pats
921+ f . sitcc $ sep (comma >> breakpoint) (sitcc . p_pat) pats
915922 SumPat NoExt pat tag arity ->
916− p_unboxedSum S tag arity (located pat p_pat)
923+ p_unboxedSum S tag arity (p_pat pat)
917924 ConPatIn pat details ->
918925 case details of
919926 PrefixCon xs -> sitcc $ do
920927 p_rdrName pat
921928 unless (null xs) $ do
922929 breakpoint
923− inci . sitcc $ sep breakpoint (sitcc . located' p_pat) xs
930+ inci . sitcc $ sep breakpoint (sitcc . p_pat) xs
924931 RecCon (HsRecFields fields dotdot) -> do
925932 p_rdrName pat
926933 breakpoint
@@ -932,18 +939,18 @@ p_pat = \case
932939 Nothing -> Just <$> fields
933940 Just n -> (Just <$> take n fields) ++ [Nothing]
934941 InfixCon x y -> do
935− located x p_pat
942+ p_pat x
936943 space
937944 p_rdrName pat
938945 breakpoint
939− inci (located y p_pat)
946+ inci (p_pat y)
940947 ConPatOut {} -> notImplemented "ConPatOut" -- presumably created by renamer?
941948 ViewPat NoExt expr pat -> sitcc $ do
942949 located expr p_hsExpr
943950 space
944951 txt "->"
945952 breakpoint
946− inci (located pat p_pat)
953+ inci (p_pat pat)
947954 SplicePat NoExt splice -> p_hsSplice splice
948955 LitPat NoExt p -> atom p
949956 NPat NoExt v _ _ -> located v (atom . ol_val)
@@ -954,11 +961,10 @@ p_pat = \case
954961 txt "+"
955962 space
956963 located k (atom . ol_val)
957− SigPat hswc pat -> do
958− located pat p_pat
964+ SigPat NoExt pat hswc -> do
965+ p_pat pat
959966 p_typeAscription hswc
960967 CoPat {} -> notImplemented "CoPat" -- apparently created at some later stage
961− XPat NoExt -> notImplemented "XPat"
962968
963969p_pat_hsRecField :: HsRecField' (FieldOcc GhcPs) (LPat GhcPs) -> R ()
964970p_pat_hsRecField HsRecField {..} = do
@@ -968,7 +974,7 @@ p_pat_hsRecField HsRecField {..} = do
968974 space
969975 txt "="
970976 breakpoint
971− inci (located hsRecFieldArg p_pat)
977+ inci (p_pat hsRecFieldArg)
972978
973979p_unboxedSum :: BracketStyle -> ConTag -> Arity -> R () -> R ()
974980p_unboxedSum s tag arity m = do
@@ -1000,6 +1006,7 @@ p_hsSplice = \case
10001006 atom str
10011007 txt "|]"
10021008 HsSpliced {} -> notImplemented "HsSpliced"
1009+ HsSplicedT {} -> notImplemented "HsSplicedT"
10031010 XSplice {} -> notImplemented "XSplice"
10041011
10051012p_hsSpliceTH ::
@@ -1030,7 +1037,7 @@ p_hsBracket = \case
10301037 AnnOpenEQ : _ -> ""
10311038 _ -> "e"
10321039 quote name (located expr p_hsExpr)
1033− PatBr NoExt pat -> quote "p" (located pat p_pat)
1040+ PatBr NoExt pat -> quote "p" (p_pat pat)
10341041 DecBrL NoExt decls -> quote "d" (p_hsDecls Free decls)
10351042 DecBrG NoExt _ -> notImplemented "DecBrG" -- result of renamer
10361043 TypBr NoExt ty -> quote "t" (located ty p_hsType)
@@ -1193,12 +1200,16 @@ exprPlacement = \case
11931200 OpApp NoExt _ _ y -> exprPlacement (unLoc y)
11941201 -- Same thing for function applications (usually with -XBlockArguments)
11951202 HsApp NoExt _ y -> exprPlacement (unLoc y)
1196− HsProc NoExt (L s _) _ ->
1197− -- Indentation breaks if pattern is longer than one line and left
1198− -- hanging. Consequently, only apply hanging when it is safe.
1199− if isOneLineSpan s
1200− then Hanging
1201− else Normal
1203+ HsProc NoExt p _ ->
1204+ -- https://gitlab.haskell.org/ghc/ghc/issues/17330
1205+ let loc = case p of
1206+ XPat pat -> getLoc pat
1207+ _ -> error "exprPlacement: HsProc: Pat does not contain a location"
1208+ in -- Indentation breaks if pattern is longer than one line and left
1209+ -- hanging. Consequently, only apply hanging when it is safe.
1210+ if isOneLineSpan loc
1211+ then Hanging
1212+ else Normal
12021213 _ -> Normal
12031214
12041215withGuards :: [LGRHS GhcPs (Located body)] -> Bool