{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
{-# OPTIONS_GHC -Wno-overlapping-patterns #-}
module Ide.Plugin.GHC where
import Data.Functor ((<&>))
import Data.List.Extra (stripInfix)
import qualified Data.List.NonEmpty as NE
import qualified Data.Text as T
import Development.IDE
import Development.IDE.GHC.Compat
import Development.IDE.GHC.Compat.ExactPrint
import Ide.PluginUtils (subRange)
import Language.Haskell.GHC.ExactPrint.Parsers (parseDecl)
import GHC.Parser.Annotation (AddEpAnn (..),
Anchor (Anchor),
AnchorOperation (MovedAnchor),
DeltaPos (..),
EpAnn (..),
EpAnnComments (EpaComments),
EpaLocation (EpaDelta),
SrcSpanAnn' (SrcSpanAnn),
spanAsAnchor)
#if MIN_VERSION_ghc(9,5,0)
import GHC.Parser.Annotation (TokenLocation (..))
#endif
import Language.Haskell.GHC.ExactPrint (showAst)
type GP = GhcPass Parsed
inRange :: HasSrcSpan a => Range -> a -> Bool
inRange :: forall a. HasSrcSpan a => Range -> a -> Bool
inRange Range
range a
s = forall b a. b -> (a -> b) -> Maybe a -> b
maybe Bool
False (Range -> Range -> Bool
subRange Range
range) (SrcSpan -> Maybe Range
srcSpanToRange (forall a. HasSrcSpan a => a -> SrcSpan
getLoc a
s))
getDataDecl :: LHsDecl GP -> Maybe (LTyClDecl GP)
getDataDecl :: LHsDecl GP -> Maybe (LTyClDecl GP)
getDataDecl (L SrcSpanAnnA
l (TyClD XTyClD GP
_ d :: TyClDecl GP
d@DataDecl{})) = forall a. a -> Maybe a
Just (forall l e. l -> e -> GenLocated l e
L SrcSpanAnnA
l TyClDecl GP
d)
getDataDecl LHsDecl GP
_ = forall a. Maybe a
Nothing
isConDeclH98 :: ConDecl GP -> Bool
isConDeclH98 :: ConDecl GP -> Bool
isConDeclH98 ConDeclH98{} = Bool
True
isConDeclH98 ConDecl GP
_ = Bool
False
isH98DataDecl :: LTyClDecl GP -> Bool
isH98DataDecl :: LTyClDecl GP -> Bool
isH98DataDecl (L SrcSpanAnnA
_ decl :: TyClDecl GP
decl@DataDecl{}) =
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (ConDecl GP -> Bool
isConDeclH98 forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\(L SrcSpanAnnA
_ ConDecl GP
r) -> ConDecl GP
r)) (forall pass. HsDataDefn pass -> [LConDecl pass]
dd_cons forall a b. (a -> b) -> a -> b
$ forall pass. TyClDecl pass -> HsDataDefn pass
tcdDataDefn TyClDecl GP
decl)
isH98DataDecl LTyClDecl GP
_ = Bool
False
h98ToGADTDecl :: TyClDecl GP -> TyClDecl GP
h98ToGADTDecl :: TyClDecl GP -> TyClDecl GP
h98ToGADTDecl = \case
DataDecl{HsDataDefn GP
LHsQTyVars GP
XRec GP (IdP GP)
XDataDecl GP
LexicalFixity
tcdDExt :: forall pass. TyClDecl pass -> XDataDecl pass
tcdFixity :: forall pass. TyClDecl pass -> LexicalFixity
tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
tcdDataDefn :: HsDataDefn GP
tcdFixity :: LexicalFixity
tcdTyVars :: LHsQTyVars GP
tcdLName :: XRec GP (IdP GP)
tcdDExt :: XDataDecl GP
tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
..} -> DataDecl
{ tcdDataDefn :: HsDataDefn GP
tcdDataDefn = GenLocated SrcSpanAnnN RdrName
-> LHsQTyVars GP -> HsDataDefn GP -> HsDataDefn GP
updateDefn XRec GP (IdP GP)
tcdLName LHsQTyVars GP
tcdTyVars HsDataDefn GP
tcdDataDefn
, LHsQTyVars GP
XRec GP (IdP GP)
XDataDecl GP
LexicalFixity
tcdDExt :: XDataDecl GP
tcdFixity :: LexicalFixity
tcdLName :: XRec GP (IdP GP)
tcdTyVars :: LHsQTyVars GP
tcdFixity :: LexicalFixity
tcdTyVars :: LHsQTyVars GP
tcdLName :: XRec GP (IdP GP)
tcdDExt :: XDataDecl GP
..
}
TyClDecl GP
x -> TyClDecl GP
x
where
updateDefn :: GenLocated SrcSpanAnnN RdrName
-> LHsQTyVars GP -> HsDataDefn GP -> HsDataDefn GP
updateDefn GenLocated SrcSpanAnnN RdrName
dataName LHsQTyVars GP
tyVars = \case
HsDataDefn{HsDeriving GP
[LConDecl GP]
Maybe (LHsContext GP)
Maybe (XRec GP (HsType GP))
Maybe (XRec GP CType)
NewOrData
XCHsDataDefn GP
dd_ND :: forall pass. HsDataDefn pass -> NewOrData
dd_cType :: forall pass. HsDataDefn pass -> Maybe (XRec pass CType)
dd_ctxt :: forall pass. HsDataDefn pass -> Maybe (LHsContext pass)
dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
dd_ext :: forall pass. HsDataDefn pass -> XCHsDataDefn pass
dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
dd_derivs :: HsDeriving GP
dd_cons :: [LConDecl GP]
dd_kindSig :: Maybe (XRec GP (HsType GP))
dd_cType :: Maybe (XRec GP CType)
dd_ctxt :: Maybe (LHsContext GP)
dd_ND :: NewOrData
dd_ext :: XCHsDataDefn GP
dd_cons :: forall pass. HsDataDefn pass -> [LConDecl pass]
..} -> HsDataDefn
{ dd_cons :: [LConDecl GP]
dd_cons =
(ConDecl GP -> ConDecl GP)
-> GenLocated (Anno (ConDecl GP)) (ConDecl GP)
-> GenLocated (Anno (ConDecl GP)) (ConDecl GP)
mapX (XRec GP (IdP GP)
-> LHsQTyVars GP
-> Maybe (LHsContext GP)
-> ConDecl GP
-> ConDecl GP
h98ToGADTConDecl GenLocated SrcSpanAnnN RdrName
dataName LHsQTyVars GP
tyVars (forall {a}. a -> a
wrapCtxt Maybe (LHsContext GP)
dd_ctxt)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [LConDecl GP]
dd_cons
, dd_ctxt :: Maybe (LHsContext GP)
dd_ctxt = forall a. Maybe a
emptyCtxt
, HsDeriving GP
Maybe (XRec GP (HsType GP))
Maybe (XRec GP CType)
NewOrData
XCHsDataDefn GP
dd_ND :: NewOrData
dd_cType :: Maybe (XRec GP CType)
dd_derivs :: HsDeriving GP
dd_ext :: XCHsDataDefn GP
dd_kindSig :: Maybe (XRec GP (HsType GP))
dd_derivs :: HsDeriving GP
dd_kindSig :: Maybe (XRec GP (HsType GP))
dd_cType :: Maybe (XRec GP CType)
dd_ND :: NewOrData
dd_ext :: XCHsDataDefn GP
..
}
HsDataDefn GP
x -> HsDataDefn GP
x
h98ToGADTConDecl ::
LIdP GP
-> LHsQTyVars GP
-> Maybe (LHsContext GP)
-> ConDecl GP
-> ConDecl GP
h98ToGADTConDecl :: XRec GP (IdP GP)
-> LHsQTyVars GP
-> Maybe (LHsContext GP)
-> ConDecl GP
-> ConDecl GP
h98ToGADTConDecl XRec GP (IdP GP)
dataName LHsQTyVars GP
tyVars Maybe (LHsContext GP)
ctxt = \case
ConDeclH98{Bool
[LHsTyVarBndr Specificity GP]
Maybe (LHsContext GP)
Maybe LHsDocString
HsConDeclH98Details GP
XRec GP (IdP GP)
XConDeclH98 GP
con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
con_doc :: forall pass. ConDecl pass -> Maybe LHsDocString
con_ex_tvs :: forall pass. ConDecl pass -> [LHsTyVarBndr Specificity pass]
con_ext :: forall pass. ConDecl pass -> XConDeclH98 pass
con_forall :: forall pass. ConDecl pass -> Bool
con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
con_name :: forall pass. ConDecl pass -> LIdP pass
con_doc :: Maybe LHsDocString
con_args :: HsConDeclH98Details GP
con_mb_cxt :: Maybe (LHsContext GP)
con_ex_tvs :: [LHsTyVarBndr Specificity GP]
con_forall :: Bool
con_name :: XRec GP (IdP GP)
con_ext :: XConDeclH98 GP
..} ->
forall pass.
XConDeclGADT pass
-> [LIdP pass]
-> XRec pass (HsOuterSigTyVarBndrs pass)
-> Maybe (LHsContext pass)
-> HsConDeclGADTDetails pass
-> LHsType pass
-> Maybe LHsDocString
-> ConDecl pass
ConDeclGADT
XConDeclH98 GP
con_ext
#if MIN_VERSION_ghc(9,5,0)
(NE.singleton con_name)
#else
[XRec GP (IdP GP)
con_name]
#endif
#if MIN_VERSION_ghc(9,5,0)
(L NoTokenLoc HsNormalTok)
#endif
forall {flag}. GenLocated SrcSpanAnnA (HsOuterTyVarBndrs flag GP)
implicitTyVars
(Maybe (LHsContext GP)
-> Maybe (LHsContext GP) -> Maybe (LHsContext GP)
mergeContext Maybe (LHsContext GP)
ctxt Maybe (LHsContext GP)
con_mb_cxt)
(HsConDeclH98Details GP -> HsConDeclGADTDetails GP
renderDetails HsConDeclH98Details GP
con_args)
XRec GP (HsType GP)
renderResultTy
Maybe LHsDocString
con_doc
ConDecl GP
x -> ConDecl GP
x
where
renderDetails :: HsConDeclH98Details GP -> HsConDeclGADTDetails GP
renderDetails :: HsConDeclH98Details GP -> HsConDeclGADTDetails GP
renderDetails (PrefixCon [Void]
_ [HsScaled GP (XRec GP (HsType GP))]
args) = forall pass.
[HsScaled pass (LBangType pass)] -> HsConDeclGADTDetails pass
PrefixConGADT [HsScaled GP (XRec GP (HsType GP))]
args
renderDetails (InfixCon HsScaled GP (XRec GP (HsType GP))
arg1 HsScaled GP (XRec GP (HsType GP))
arg2) = forall pass.
[HsScaled pass (LBangType pass)] -> HsConDeclGADTDetails pass
PrefixConGADT [HsScaled GP (XRec GP (HsType GP))
arg1, HsScaled GP (XRec GP (HsType GP))
arg2]
#if MIN_VERSION_ghc(9,3,0)
renderDetails (RecCon recs) = RecConGADT recs noHsUniTok
#else
renderDetails (RecCon XRec GP [LConDeclField GP]
recs) = forall pass.
XRec pass [LConDeclField pass] -> HsConDeclGADTDetails pass
RecConGADT XRec GP [LConDeclField GP]
recs
#endif
renderResultTy :: LHsType GP
renderResultTy :: XRec GP (HsType GP)
renderResultTy = case LHsQTyVars GP
tyVars of
HsQTvs XHsQTvs GP
_ [] -> XRec GP (HsType GP)
wrappedDataName
HsQTvs XHsQTvs GP
_ [LHsTyVarBndr () GP]
vars -> forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl forall {pass} {an} {ann} {pass} {l} {flag}.
(Anno (HsType pass) ~ SrcSpanAnn' (EpAnn an),
XTyVar pass ~ EpAnn ann, XAppTy pass ~ NoExtField,
XRec pass (IdP pass) ~ XRec pass (IdP pass),
XRec pass (HsType pass)
~ GenLocated (Anno (HsType pass)) (HsType pass)) =>
XRec pass (HsType pass)
-> GenLocated l (HsTyVarBndr flag pass)
-> GenLocated (Anno (HsType pass)) (HsType pass)
go XRec GP (HsType GP)
wrappedDataName [LHsTyVarBndr () GP]
vars
LHsQTyVars GP
_ -> XRec GP (HsType GP)
wrappedDataName
where
wrappedDataName :: XRec GP (HsType GP)
wrappedDataName = forall a. WrapXRec GP a => a -> XRec GP a
wrap (forall pass.
XTyVar pass -> PromotionFlag -> LIdP pass -> HsType pass
HsTyVar forall {ann}. EpAnn ann
noUsed PromotionFlag
NotPromoted XRec GP (IdP GP)
dataName)
go :: XRec pass (HsType pass)
-> GenLocated l (HsTyVarBndr flag pass) -> XRec GP (HsType pass)
go XRec pass (HsType pass)
acc (L l
_(UserTyVar' XRec pass (IdP pass)
var)) =
forall a. WrapXRec GP a => a -> XRec GP a
wrap
(forall pass.
XAppTy pass -> LHsType pass -> LHsType pass -> HsType pass
HsAppTy NoExtField
noExtField XRec pass (HsType pass)
acc
(forall a. WrapXRec GP a => a -> XRec GP a
wrap (forall pass.
XTyVar pass -> PromotionFlag -> LIdP pass -> HsType pass
HsTyVar forall {ann}. EpAnn ann
noUsed PromotionFlag
NotPromoted XRec pass (IdP pass)
var)))
go XRec pass (HsType pass)
acc GenLocated l (HsTyVarBndr flag pass)
_ = XRec pass (HsType pass)
acc
mergeContext :: Maybe (LHsContext GP) -> Maybe (LHsContext GP) -> Maybe (LHsContext GP)
mergeContext :: Maybe (LHsContext GP)
-> Maybe (LHsContext GP) -> Maybe (LHsContext GP)
mergeContext Maybe (LHsContext GP)
ctxt1 Maybe (LHsContext GP)
ctxt2 =
(forall a. WrapXRec GP a => a -> XRec GP a
wrap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. WrapXRec GP a => a -> XRec GP a
wrap) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map HsType GP -> HsType GP
unParTy
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Maybe (LHsContext GP) -> Maybe [HsType GP]
getContextType Maybe (LHsContext GP)
ctxt1 forall a. Semigroup a => a -> a -> a
<> Maybe (LHsContext GP) -> Maybe [HsType GP]
getContextType Maybe (LHsContext GP)
ctxt2)
where
getContextType :: Maybe (LHsContext GP) -> Maybe [HsType GP]
getContextType :: Maybe (LHsContext GP) -> Maybe [HsType GP]
getContextType Maybe (LHsContext GP)
ctxt = forall a b. (a -> b) -> [a] -> [b]
map forall {a}. GenLocated (Anno a) a -> a
unWrap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a}. GenLocated (Anno a) a -> a
unWrap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (LHsContext GP)
ctxt
unParTy :: HsType GP -> HsType GP
unParTy :: HsType GP -> HsType GP
unParTy (HsParTy XParTy GP
_ XRec GP (HsType GP)
ty) = forall {a}. GenLocated (Anno a) a -> a
unWrap XRec GP (HsType GP)
ty
unParTy HsType GP
x = HsType GP
x
prettyGADTDecl :: DynFlags -> TyClDecl GP -> Either String String
prettyGADTDecl :: DynFlags -> TyClDecl GP -> Either String String
prettyGADTDecl DynFlags
df TyClDecl GP
decl =
let old :: Text
old = forall a. Outputable a => a -> Text
printOutputable TyClDecl GP
decl
hsDecl :: ParseResult (LHsDecl GP)
hsDecl = Parser (LHsDecl GP)
parseDecl DynFlags
df String
"unused" (Text -> String
T.unpack Text
old)
tycld :: Either String (TyClDecl GP)
tycld = Either ErrorMessages (GenLocated SrcSpanAnnA (HsDecl GP))
-> Either String (TyClDecl GP)
adjustTyClD ParseResult (LHsDecl GP)
hsDecl
in String -> String
removeExtraEmptyLine forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ast. ExactPrint ast => ast -> String
exactPrint forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Either String (TyClDecl GP)
tycld
where
adjustTyClD :: Either ErrorMessages (GenLocated SrcSpanAnnA (HsDecl GP))
-> Either String (TyClDecl GP)
adjustTyClD = \case
Right (L SrcSpanAnnA
_ (TyClD XTyClD GP
_ TyClDecl GP
tycld)) -> forall a b. b -> Either a b
Right forall a b. (a -> b) -> a -> b
$ TyClDecl GP -> TyClDecl GP
adjustDataDecl TyClDecl GP
tycld
Right GenLocated SrcSpanAnnA (HsDecl GP)
x -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ String
"Expect TyClD but got " forall a. Semigroup a => a -> a -> a
<> forall a. Data a => a -> String
showAst GenLocated SrcSpanAnnA (HsDecl GP)
x
#if MIN_VERSION_ghc(9,3,0)
Left err -> Left $ printWithoutUniques err
#else
Left ErrorMessages
err -> forall a b. a -> Either a b
Left forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show ErrorMessages
err
#endif
adjustDataDecl :: TyClDecl GP -> TyClDecl GP
adjustDataDecl DataDecl{HsDataDefn GP
LHsQTyVars GP
XRec GP (IdP GP)
XDataDecl GP
LexicalFixity
tcdDataDefn :: HsDataDefn GP
tcdFixity :: LexicalFixity
tcdTyVars :: LHsQTyVars GP
tcdLName :: XRec GP (IdP GP)
tcdDExt :: XDataDecl GP
tcdDExt :: forall pass. TyClDecl pass -> XDataDecl pass
tcdFixity :: forall pass. TyClDecl pass -> LexicalFixity
tcdLName :: forall pass. TyClDecl pass -> LIdP pass
tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
..} = DataDecl
{ tcdDExt :: XDataDecl GP
tcdDExt = forall {f :: * -> *}. Functor f => f [AddEpAnn] -> f [AddEpAnn]
adjustWhere XDataDecl GP
tcdDExt
, tcdDataDefn :: HsDataDefn GP
tcdDataDefn = HsDataDefn GP
tcdDataDefn
{ dd_cons :: [LConDecl GP]
dd_cons =
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap LConDecl GP -> LConDecl GP
adjustCon (forall pass. HsDataDefn pass -> [LConDecl pass]
dd_cons HsDataDefn GP
tcdDataDefn)
}
, LHsQTyVars GP
XRec GP (IdP GP)
LexicalFixity
tcdFixity :: LexicalFixity
tcdTyVars :: LHsQTyVars GP
tcdLName :: XRec GP (IdP GP)
tcdFixity :: LexicalFixity
tcdLName :: XRec GP (IdP GP)
tcdTyVars :: LHsQTyVars GP
..
}
adjustDataDecl TyClDecl GP
x = TyClDecl GP
x
adjustCon :: LConDecl GP -> LConDecl GP
adjustCon :: LConDecl GP -> LConDecl GP
adjustCon (L (SrcSpanAnn EpAnn AnnListItem
_ SrcSpan
loc) ConDecl GP
r) =
forall l e. l -> e -> GenLocated l e
L (forall a. a -> SrcSpan -> SrcSpanAnn' a
SrcSpanAnn (forall ann. Anchor -> ann -> EpAnnComments -> EpAnn ann
EpAnn (Anchor -> Anchor
go (SrcSpan -> Anchor
spanAsAnchor SrcSpan
loc)) ([TrailingAnn] -> AnnListItem
AnnListItem []) ([LEpaComment] -> EpAnnComments
EpaComments [])) SrcSpan
loc) ConDecl GP
r
where
go :: Anchor -> Anchor
go (Anchor RealSrcSpan
a AnchorOperation
_) = RealSrcSpan -> AnchorOperation -> Anchor
Anchor RealSrcSpan
a (DeltaPos -> AnchorOperation
MovedAnchor (Int -> Int -> DeltaPos
DifferentLine Int
1 Int
2))
adjustWhere :: f [AddEpAnn] -> f [AddEpAnn]
adjustWhere f [AddEpAnn]
tcdDExt = f [AddEpAnn]
tcdDExt forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> forall a b. (a -> b) -> [a] -> [b]
map
(\(AddEpAnn AnnKeywordId
ann EpaLocation
l) ->
if AnnKeywordId
ann forall a. Eq a => a -> a -> Bool
== AnnKeywordId
AnnWhere
then AnnKeywordId -> EpaLocation -> AddEpAnn
AddEpAnn AnnKeywordId
AnnWhere (DeltaPos -> [LEpaComment] -> EpaLocation
EpaDelta (Int -> DeltaPos
SameLine Int
1) [])
else AnnKeywordId -> EpaLocation -> AddEpAnn
AddEpAnn AnnKeywordId
ann EpaLocation
l
)
removeExtraEmptyLine :: String -> String
removeExtraEmptyLine String
s = case forall a. Eq a => [a] -> [a] -> Maybe ([a], [a])
stripInfix String
"\n\n" String
s of
Just (String
x, String
xs) -> String
x forall a. Semigroup a => a -> a -> a
<> String
"\n" forall a. Semigroup a => a -> a -> a
<> String
xs
Maybe (String, String)
Nothing -> String
s
wrap :: forall a. WrapXRec GP a => a -> XRec GP a
wrap :: forall a. WrapXRec GP a => a -> XRec GP a
wrap = forall p a. WrapXRec p a => a -> XRec p a
wrapXRec @GP
wrapCtxt :: a -> a
wrapCtxt = forall {a}. a -> a
id
emptyCtxt :: Maybe a
emptyCtxt = forall a. Maybe a
Nothing
unWrap :: XRec GP a -> a
unWrap = forall p a. UnXRec p => XRec p a -> a
unXRec @GP
mapX :: (ConDecl GP -> ConDecl GP) -> LConDecl GP -> LConDecl GP
mapX = forall p a b.
(MapXRec p, Anno a ~ Anno b) =>
(a -> b) -> XRec p a -> XRec p b
mapXRec @GP
noUsed :: EpAnn ann
noUsed = forall {ann}. EpAnn ann
EpAnnNotUsed
pattern UserTyVar' :: LIdP pass -> HsTyVarBndr flag pass
pattern $mUserTyVar' :: forall {r} {pass} {flag}.
HsTyVarBndr flag pass -> (LIdP pass -> r) -> ((# #) -> r) -> r
UserTyVar' s <- UserTyVar _ _ s
implicitTyVars :: XRec GP (HsOuterTyVarBndrs flag GP)
implicitTyVars = (forall p a. WrapXRec p a => a -> XRec p a
wrapXRec @GP forall flag. HsOuterTyVarBndrs flag GP
mkHsOuterImplicit)