on master help sign in
Implement support for inline signatures
commit046f14e7e54993195abaf0beb8f7083f2675fe69 authormrkkrp <mark.karpov@tweag.io> dateSun 9 Jun 2019, 13:40 (7 years ago) parenta8235f7
8 files changed+102−1
data/examples/declaration/signature/inline/inline-out.hs+11 data/examples/declaration/signature/inline/inline.hs+13 data/examples/declaration/signature/inline/inlineable-out.hs+11 data/examples/declaration/signature/inline/inlineable.hs+13 data/examples/declaration/signature/inline/noinline-out.hs+11 data/examples/declaration/signature/inline/noinline.hs+13 src/Ormolu/Printer/Meat/Declaration/Signature.hs+26−1 src/Ormolu/Printer/Meat/Module.hs+4
data/examples/declaration/signature/inline/inline-out.hsnew file+11
@@ -0,0 +1,11 @@
1+foo :: Int -> Int
2+foo = id
3+{-# INLINE foo #-}
4+
5+{-# INLINE [2] bar #-}
6+bar :: Int -> Int
7+bar = id
8+
9+baz :: Int -> Int
10+baz = id
11+{-# INLINE [~2] baz #-}
data/examples/declaration/signature/inline/inline.hsnew file+13
@@ -0,0 +1,13 @@
1+foo :: Int -> Int
2+foo = id
3+
4+{-# INLINE foo #-}
5+
6+{-# INLINE [2] bar #-}
7+
8+bar :: Int -> Int
9+bar = id
10+
11+baz :: Int -> Int
12+baz = id
13+{-# INLINE [~2] baz #-}
data/examples/declaration/signature/inline/inlineable-out.hsnew file+11
@@ -0,0 +1,11 @@
1+foo :: Int -> Int
2+foo = id
3+{-# INLINEABLE foo #-}
4+
5+{-# INLINEABLE [2] bar #-}
6+bar :: Int -> Int
7+bar = id
8+
9+baz :: Int -> Int
10+baz = id
11+{-# INLINEABLE [~2] baz #-}
data/examples/declaration/signature/inline/inlineable.hsnew file+13
@@ -0,0 +1,13 @@
1+foo :: Int -> Int
2+foo = id
3+
4+{-# INLINEABLE foo #-}
5+
6+{-# INLINEABLE [2] bar #-}
7+
8+bar :: Int -> Int
9+bar = id
10+
11+baz :: Int -> Int
12+baz = id
13+{-# INLINEABLE [~2] baz #-}
data/examples/declaration/signature/inline/noinline-out.hsnew file+11
@@ -0,0 +1,11 @@
1+foo :: Int -> Int
2+foo = id
3+{-# NOINLINE foo #-}
4+
5+{-# NOINLINE [2] bar #-}
6+bar :: Int -> Int
7+bar = id
8+
9+baz :: Int -> Int
10+baz = id
11+{-# NOINLINE [~2] baz #-}
data/examples/declaration/signature/inline/noinline.hsnew file+13
@@ -0,0 +1,13 @@
1+foo :: Int -> Int
2+foo = id
3+{-# NOINLINE foo #-}
4+
5+{-# NOINLINE [2] bar #-}
6+
7+bar :: Int -> Int
8+bar = id
9+
10+baz :: Int -> Int
11+baz = id
12+
13+{-# NOINLINE [~2] baz #-}
src/Ormolu/Printer/Meat/Declaration/Signature.hs+26−1
@@ -10,7 +10,7 @@ module Ormolu.Printer.Meat.Declaration.Signature
1010 )
1111where
1212
13−import BasicTypes (Fixity (..))
13+import BasicTypes
1414import Control.Monad
1515import GHC
1616import Ormolu.Printer.Combinators
@@ -26,6 +26,7 @@ p_sigDecl' = \case
2626 TypeSig NoExt names hswc -> p_typeSig names hswc
2727 ClassOpSig NoExt def names hsib -> p_classOpSig def names hsib
2828 FixSig NoExt sig -> p_fixSig sig
29+ InlineSig NoExt name inlinePragma -> p_inlineSig name inlinePragma
2930 _ -> notImplemented "certain types of signature declarations"
3031
3132p_typeSig
@@ -63,3 +64,27 @@ p_fixSig = \case
6364 space
6465 sequence_ (withSep comma p_rdrName names)
6566 XFixitySig NoExt -> notImplemented "XFixitySig"
67+
68+p_inlineSig
69+ :: Located RdrName -- ^ Name
70+ -> InlinePragma -- ^ Inline pragma specification
71+ -> R ()
72+p_inlineSig name InlinePragma {..} = do
73+ txt "{-# "
74+ txt $ case inl_inline of
75+ Inline -> "INLINE"
76+ Inlinable -> "INLINEABLE"
77+ NoInline -> "NOINLINE"
78+ NoUserInline -> notImplemented "NoUserInline"
79+ space
80+ case inl_act of
81+ NeverActive -> return ()
82+ AlwaysActive -> return ()
83+ ActiveBefore _ n -> do
84+ brackets (txt "~" >> atom n)
85+ space
86+ ActiveAfter _ n -> do
87+ brackets (atom n)
88+ space
89+ p_rdrName name
90+ txt " #-}"
src/Ormolu/Printer/Meat/Module.hs+4
@@ -66,4 +66,8 @@ separatedDecls
6666 -> Bool
6767separatedDecls (SigD NoExt (TypeSig NoExt (n:_) _)) (ValD NoExt (FunBind NoExt n' _ _ _)) =
6868 unL n /= unL n'
69+separatedDecls (ValD NoExt (FunBind NoExt n _ _ _)) (SigD NoExt (InlineSig NoExt n' _)) =
70+ unL n /= unL n'
71+separatedDecls (SigD NoExt (InlineSig NoExt n _)) (SigD NoExt (TypeSig NoExt (n':_) _)) =
72+ unL n /= unL n'
6973separatedDecls _ _ = True