diff --git a/data/examples/declaration/signature/inline/inline-out.hs b/data/examples/declaration/signature/inline/inline-out.hs new file mode 100644 index 0000000..cae4446 --- /dev/null +++ b/data/examples/declaration/signature/inline/inline-out.hs @@ -0,0 +1,11 @@ +foo :: Int -> Int +foo = id +{-# INLINE foo #-} + +{-# INLINE [2] bar #-} +bar :: Int -> Int +bar = id + +baz :: Int -> Int +baz = id +{-# INLINE [~2] baz #-} diff --git a/data/examples/declaration/signature/inline/inline.hs b/data/examples/declaration/signature/inline/inline.hs new file mode 100644 index 0000000..15ef910 --- /dev/null +++ b/data/examples/declaration/signature/inline/inline.hs @@ -0,0 +1,13 @@ +foo :: Int -> Int +foo = id + +{-# INLINE foo #-} + +{-# INLINE [2] bar #-} + +bar :: Int -> Int +bar = id + +baz :: Int -> Int +baz = id +{-# INLINE [~2] baz #-} diff --git a/data/examples/declaration/signature/inline/inlineable-out.hs b/data/examples/declaration/signature/inline/inlineable-out.hs new file mode 100644 index 0000000..66e324b --- /dev/null +++ b/data/examples/declaration/signature/inline/inlineable-out.hs @@ -0,0 +1,11 @@ +foo :: Int -> Int +foo = id +{-# INLINEABLE foo #-} + +{-# INLINEABLE [2] bar #-} +bar :: Int -> Int +bar = id + +baz :: Int -> Int +baz = id +{-# INLINEABLE [~2] baz #-} diff --git a/data/examples/declaration/signature/inline/inlineable.hs b/data/examples/declaration/signature/inline/inlineable.hs new file mode 100644 index 0000000..778932d --- /dev/null +++ b/data/examples/declaration/signature/inline/inlineable.hs @@ -0,0 +1,13 @@ +foo :: Int -> Int +foo = id + +{-# INLINEABLE foo #-} + +{-# INLINEABLE [2] bar #-} + +bar :: Int -> Int +bar = id + +baz :: Int -> Int +baz = id +{-# INLINEABLE [~2] baz #-} diff --git a/data/examples/declaration/signature/inline/noinline-out.hs b/data/examples/declaration/signature/inline/noinline-out.hs new file mode 100644 index 0000000..96cbb1c --- /dev/null +++ b/data/examples/declaration/signature/inline/noinline-out.hs @@ -0,0 +1,11 @@ +foo :: Int -> Int +foo = id +{-# NOINLINE foo #-} + +{-# NOINLINE [2] bar #-} +bar :: Int -> Int +bar = id + +baz :: Int -> Int +baz = id +{-# NOINLINE [~2] baz #-} diff --git a/data/examples/declaration/signature/inline/noinline.hs b/data/examples/declaration/signature/inline/noinline.hs new file mode 100644 index 0000000..e648ee1 --- /dev/null +++ b/data/examples/declaration/signature/inline/noinline.hs @@ -0,0 +1,13 @@ +foo :: Int -> Int +foo = id +{-# NOINLINE foo #-} + +{-# NOINLINE [2] bar #-} + +bar :: Int -> Int +bar = id + +baz :: Int -> Int +baz = id + +{-# NOINLINE [~2] baz #-} diff --git a/src/Ormolu/Printer/Meat/Declaration/Signature.hs b/src/Ormolu/Printer/Meat/Declaration/Signature.hs index 86b141a..ee6e92b 100644 --- a/src/Ormolu/Printer/Meat/Declaration/Signature.hs +++ b/src/Ormolu/Printer/Meat/Declaration/Signature.hs @@ -10,7 +10,7 @@ module Ormolu.Printer.Meat.Declaration.Signature ) where -import BasicTypes (Fixity (..)) +import BasicTypes import Control.Monad import GHC import Ormolu.Printer.Combinators @@ -26,6 +26,7 @@ p_sigDecl' = \case TypeSig NoExt names hswc -> p_typeSig names hswc ClassOpSig NoExt def names hsib -> p_classOpSig def names hsib FixSig NoExt sig -> p_fixSig sig + InlineSig NoExt name inlinePragma -> p_inlineSig name inlinePragma _ -> notImplemented "certain types of signature declarations" p_typeSig @@ -63,3 +64,27 @@ p_fixSig = \case space sequence_ (withSep comma p_rdrName names) XFixitySig NoExt -> notImplemented "XFixitySig" + +p_inlineSig + :: Located RdrName -- ^ Name + -> InlinePragma -- ^ Inline pragma specification + -> R () +p_inlineSig name InlinePragma {..} = do + txt "{-# " + txt $ case inl_inline of + Inline -> "INLINE" + Inlinable -> "INLINEABLE" + NoInline -> "NOINLINE" + NoUserInline -> notImplemented "NoUserInline" + space + case inl_act of + NeverActive -> return () + AlwaysActive -> return () + ActiveBefore _ n -> do + brackets (txt "~" >> atom n) + space + ActiveAfter _ n -> do + brackets (atom n) + space + p_rdrName name + txt " #-}" diff --git a/src/Ormolu/Printer/Meat/Module.hs b/src/Ormolu/Printer/Meat/Module.hs index 2a3345b..b3661d0 100644 --- a/src/Ormolu/Printer/Meat/Module.hs +++ b/src/Ormolu/Printer/Meat/Module.hs @@ -66,4 +66,8 @@ separatedDecls -> Bool separatedDecls (SigD NoExt (TypeSig NoExt (n:_) _)) (ValD NoExt (FunBind NoExt n' _ _ _)) = unL n /= unL n' +separatedDecls (ValD NoExt (FunBind NoExt n _ _ _)) (SigD NoExt (InlineSig NoExt n' _)) = + unL n /= unL n' +separatedDecls (SigD NoExt (InlineSig NoExt n _)) (SigD NoExt (TypeSig NoExt (n':_) _)) = + unL n /= unL n' separatedDecls _ _ = True