@@ -19,7 +19,7 @@ import DataCon
1919import Development.IDE (HscEnvEq (hscEnv ))
2020import Development.IDE.Core.Compile (lookupName )
2121import Development.IDE.GHC.Compat
22- import GHC.SourceGen (case' , lambda , match )
22+ import GHC.SourceGen (lambda )
2323import Generics.SYB (Data , everything , everywhere , listify , mkQ , mkT )
2424import GhcPlugins (extractModule , GlobalRdrElt (gre_name ))
2525import OccName
@@ -188,8 +188,8 @@ allOccNames = everything (<>) $ mkQ mempty $ \case
188188pattern AMatch :: HsMatchContext (NameOrRdrName (IdP GhcPs )) -> [Pat GhcPs ] -> HsExpr GhcPs -> Match GhcPs (LHsExpr GhcPs )
189189pattern AMatch ctx pats body <-
190190 Match { m_ctxt = ctx
191- , m_pats = fmap fromPatCompatPs -> pats
192- , m_grhss = UnguardedRHSs body
191+ , m_pats = fmap fromPatCompat -> pats
192+ , m_grhss = UnguardedRHSs (unLoc -> body)
193193 }
194194
195195
@@ -207,23 +207,23 @@ pattern Lambda pats body <-
207207
208208------------------------------------------------------------------------------
209209-- | A GRHS that caontains no guards.
210- pattern UnguardedRHSs :: HsExpr GhcPs -> GRHSs GhcPs (LHsExpr GhcPs )
210+ pattern UnguardedRHSs :: LHsExpr p -> GRHSs p (LHsExpr p )
211211pattern UnguardedRHSs body <-
212- GRHSs {grhssGRHSs = [L _ (GRHS _ [] ( L _ body) )]}
212+ GRHSs {grhssGRHSs = [L _ (GRHS _ [] body)]}
213213
214214
215215------------------------------------------------------------------------------
216216-- | A match with a single pattern. Case matches are always 'SinglePatMatch'es.
217- pattern SinglePatMatch :: Pat GhcPs -> HsExpr GhcPs -> Match GhcPs (LHsExpr GhcPs )
217+ pattern SinglePatMatch :: PatCompattable p => Pat p -> LHsExpr p -> Match p (LHsExpr p )
218218pattern SinglePatMatch pat body <-
219- Match { m_pats = [fromPatCompatPs -> pat]
219+ Match { m_pats = [fromPatCompat -> pat]
220220 , m_grhss = UnguardedRHSs body
221221 }
222222
223223
224224------------------------------------------------------------------------------
225225-- | Helper function for defining the 'Case' pattern.
226- unpackMatches :: [Match GhcPs (LHsExpr GhcPs )] -> Maybe [(Pat GhcPs , HsExpr GhcPs )]
226+ unpackMatches :: PatCompattable p => [Match p (LHsExpr p )] -> Maybe [(Pat p , LHsExpr p )]
227227unpackMatches [] = Just []
228228unpackMatches (SinglePatMatch pat body : matches) =
229229 (:) <$> pure (pat, body) <*> unpackMatches matches
@@ -232,13 +232,10 @@ unpackMatches _ = Nothing
232232
233233------------------------------------------------------------------------------
234234-- | A pattern over the otherwise (extremely) messy AST for lambdas.
235- pattern Case :: HsExpr GhcPs -> [(Pat GhcPs , HsExpr GhcPs )] -> HsExpr GhcPs
235+ pattern Case :: PatCompattable p => HsExpr p -> [(Pat p , LHsExpr p )] -> HsExpr p
236236pattern Case scrutinee matches <-
237237 HsCase _ (L _ scrutinee)
238238 (MG {mg_alts = L _ (fmap unLoc -> unpackMatches -> Just matches)})
239- where
240- Case scrutinee matches =
241- case' scrutinee $ fmap (\ (pat, body) -> match [pat] body) matches
242239
243240
244241------------------------------------------------------------------------------
@@ -253,20 +250,30 @@ lambdaCaseable (splitFunTy_maybe -> Just (arg, res))
253250 = Just $ isJust $ algebraicTyCon res
254251lambdaCaseable _ = Nothing
255252
256- -- It's hard to generalize over these since weird type families are involved.
257- fromPatCompatTc :: PatCompat GhcTc -> Pat GhcTc
258- toPatCompatTc :: Pat GhcTc -> PatCompat GhcTc
259- fromPatCompatPs :: PatCompat GhcPs -> Pat GhcPs
253+ class PatCompattable p where
254+ fromPatCompat :: PatCompat p -> Pat p
255+ toPatCompat :: Pat p -> PatCompat p
256+
260257#if __GLASGOW_HASKELL__ == 808
258+ instance PatCompattable GhcTc where
259+ fromPatCompat = id
260+ toPatCompat = id
261+
262+ instance PatCompattable GhcPs where
263+ fromPatCompat = id
264+ toPatCompat = id
265+
261266type PatCompat pass = Pat pass
262- fromPatCompatTc = id
263- fromPatCompatPs = id
264- toPatCompatTc = id
265267#else
268+ instance PatCompattable GhcTc where
269+ fromPatCompat = unLoc
270+ toPatCompat = noLoc
271+
272+ instance PatCompattable GhcPs where
273+ fromPatCompat = unLoc
274+ toPatCompat = noLoc
275+
266276type PatCompat pass = LPat pass
267- fromPatCompatTc = unLoc
268- fromPatCompatPs = unLoc
269- toPatCompatTc = noLoc
270277#endif
271278
272279------------------------------------------------------------------------------
0 commit comments