@@ -27,6 +27,7 @@ p_sigDecl' = \case
27 ClassOpSig NoExt def names hsib -> p_classOpSig def names hsib
27 ClassOpSig NoExt def names hsib -> p_classOpSig def names hsib
28 FixSig NoExt sig -> p_fixSig sig
28 FixSig NoExt sig -> p_fixSig sig
29 InlineSig NoExt name inlinePragma -> p_inlineSig name inlinePragma
29 InlineSig NoExt name inlinePragma -> p_inlineSig name inlinePragma
30+ SpecSig NoExt name ts inlinePragma -> p_specSig name ts inlinePragma
30 _ -> notImplemented "certain types of signature declarations"
31 _ -> notImplemented "certain types of signature declarations"
@@ -76,13 +77,38 @@ p_inlineSig name InlinePragma {..} = pragmaBraces $ do
76 NoInline -> "NOINLINE"
77 NoInline -> "NOINLINE"
77 NoUserInline -> notImplemented "NoUserInline"
78 NoUserInline -> notImplemented "NoUserInline"
79− case inl_act of
80+ p_activation inl_act
80− NeverActive -> return ()
81− AlwaysActive -> return ()
82− ActiveBefore _ n -> do
83− brackets (txt "~" >> atom n)
85− ActiveAfter _ n -> do
88 p_rdrName name
81 p_rdrName name
84+ :: Located RdrName -- ^ Name
85+ -> [LHsSigType GhcPs] -- ^ The types to specialize to
86+ -> InlinePragma -- ^ For specialize inline
88+p_specSig name ts InlinePragma {..} = pragmaBraces $ do
96+ -- XXX Not at all sure why ts is a list of @LHsSigType GhcPs@ things, it
97+ -- appears that we only can give one type to specialize to per pragma.
98+ -- Maybe I'm mistaken.
99+ located (hsib_body (head ts)) p_hsType
101+p_activation :: Activation -> R ()
103+ NeverActive -> return ()
104+ AlwaysActive -> return ()
105+ ActiveBefore _ n -> do
110+ ActiveAfter _ n -> do