@@ -19,7 +19,7 @@ import DataCon
19
19
import Development.IDE (HscEnvEq (hscEnv ))
20
20
import Development.IDE.Core.Compile (lookupName )
21
21
import Development.IDE.GHC.Compat
22
- import GHC.SourceGen (case' , lambda , match )
22
+ import GHC.SourceGen (lambda )
23
23
import Generics.SYB (Data , everything , everywhere , listify , mkQ , mkT )
24
24
import GhcPlugins (extractModule , GlobalRdrElt (gre_name ))
25
25
import OccName
@@ -188,8 +188,8 @@ allOccNames = everything (<>) $ mkQ mempty $ \case
188
188
pattern AMatch :: HsMatchContext (NameOrRdrName (IdP GhcPs )) -> [Pat GhcPs ] -> HsExpr GhcPs -> Match GhcPs (LHsExpr GhcPs )
189
189
pattern AMatch ctx pats body <-
190
190
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)
193
193
}
194
194
195
195
@@ -207,23 +207,23 @@ pattern Lambda pats body <-
207
207
208
208
------------------------------------------------------------------------------
209
209
-- | A GRHS that caontains no guards.
210
- pattern UnguardedRHSs :: HsExpr GhcPs -> GRHSs GhcPs (LHsExpr GhcPs )
210
+ pattern UnguardedRHSs :: LHsExpr p -> GRHSs p (LHsExpr p )
211
211
pattern UnguardedRHSs body <-
212
- GRHSs {grhssGRHSs = [L _ (GRHS _ [] ( L _ body) )]}
212
+ GRHSs {grhssGRHSs = [L _ (GRHS _ [] body)]}
213
213
214
214
215
215
------------------------------------------------------------------------------
216
216
-- | 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 )
218
218
pattern SinglePatMatch pat body <-
219
- Match { m_pats = [fromPatCompatPs -> pat]
219
+ Match { m_pats = [fromPatCompat -> pat]
220
220
, m_grhss = UnguardedRHSs body
221
221
}
222
222
223
223
224
224
------------------------------------------------------------------------------
225
225
-- | 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 )]
227
227
unpackMatches [] = Just []
228
228
unpackMatches (SinglePatMatch pat body : matches) =
229
229
(:) <$> pure (pat, body) <*> unpackMatches matches
@@ -232,13 +232,10 @@ unpackMatches _ = Nothing
232
232
233
233
------------------------------------------------------------------------------
234
234
-- | 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
236
236
pattern Case scrutinee matches <-
237
237
HsCase _ (L _ scrutinee)
238
238
(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
242
239
243
240
244
241
------------------------------------------------------------------------------
@@ -253,20 +250,30 @@ lambdaCaseable (splitFunTy_maybe -> Just (arg, res))
253
250
= Just $ isJust $ algebraicTyCon res
254
251
lambdaCaseable _ = Nothing
255
252
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
+
260
257
#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
+
261
266
type PatCompat pass = Pat pass
262
- fromPatCompatTc = id
263
- fromPatCompatPs = id
264
- toPatCompatTc = id
265
267
#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
+
266
276
type PatCompat pass = LPat pass
267
- fromPatCompatTc = unLoc
268
- fromPatCompatPs = unLoc
269
- toPatCompatTc = noLoc
270
277
#endif
271
278
272
279
------------------------------------------------------------------------------
0 commit comments