on master help sign in
Implement specialize instance pragma
commit4f6b6171ba1d92364e719b09150e528a2230fe1f authorsphaso <sphaso@gmail.com> dateSat 22 Jun 2019, 11:13 (7 years ago) parent430e0a3
3 files changed+30
data/examples/declaration/signature/specialize/specialize-instance-out.hs+14 data/examples/declaration/signature/specialize/specialize-instance.hs+11 src/Ormolu/Printer/Meat/Declaration/Signature.hs+5
data/examples/declaration/signature/specialize/specialize-instance-out.hsnew file+14
@@ -0,0 +1,14 @@
1+data Foo a = Foo a
2+
3+data VT v m r = VT v m r
4+
5+instance (Eq a) => Eq (Foo a) where
6+ {-# SPECIALIZE instance Eq (Foo [(Int, Bar)]) #-}
7+ (==) (Foo a) (Foo b) = (==) a b
8+
9+instance (Num r, V.Vector v r, Factored m r) => Num (VT v m r) where
10+ {-# SPECIALIZE instance
11+ ( Factored m Int => Num (VT U.Vector m Int)
12+ )
13+ #-}
14+ VT x + VT y = VT $ V.zipWith (+) x y
data/examples/declaration/signature/specialize/specialize-instance.hsnew file+11
@@ -0,0 +1,11 @@
1+data Foo a = Foo a
2+data VT v m r = VT v m r
3+
4+instance (Eq a) => Eq (Foo a) where
5+ {-# SPECIALIZE instance Eq (Foo [(Int, Bar)]) #-}
6+ (==) (Foo a) (Foo b) = (==) a b
7+
8+instance (Num r, V.Vector v r, Factored m r) => Num (VT v m r) where
9+ {-# SPECIALIZE instance (
10+ Factored m Int => Num (VT U.Vector m Int)) #-}
11+ VT x + VT y = VT $ V.zipWith (+) x y
src/Ormolu/Printer/Meat/Declaration/Signature.hs+5
@@ -31,6 +31,7 @@ p_sigDecl' = \case
3131 FixSig NoExt sig -> p_fixSig sig
3232 InlineSig NoExt name inlinePragma -> p_inlineSig name inlinePragma
3333 SpecSig NoExt name ts inlinePragma -> p_specSig name ts inlinePragma
34+ SpecInstSig NoExt _ hsib -> p_specInstSig hsib
3435 MinimalSig NoExt _ booleanFormula -> p_minimalSig booleanFormula
3536 CompleteMatchSig NoExt _sourceText cs ty -> p_completeSig cs ty
3637 SCCFunSig NoExt _ name literal -> p_sccSig name literal
@@ -140,6 +141,10 @@ p_activation = \case
140141 txt "]"
141142 space
142143
144+p_specInstSig :: LHsSigType GhcPs -> R ()
145+p_specInstSig hsib = pragma "SPECIALIZE instance" $
146+ located (hsib_body hsib) p_hsType
147+
143148p_minimalSig
144149 :: LBooleanFormula (Located RdrName) -- ^ Boolean formula
145150 -> R ()