From 505ad99f356e3b1e1a06487de4ca4f66ea4bd13c Mon Sep 17 00:00:00 2001 From: Lennart Spitzner Date: Wed, 12 Apr 2017 14:55:32 +0200 Subject: [PATCH] Handle InlineSig construct (pragma), fixes #20 --- src-literatetests/tests.blt | 33 +++++++++++++++++++ .../Haskell/Brittany/Layouters/Decl.hs | 27 ++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src-literatetests/tests.blt b/src-literatetests/tests.blt index 0e30f69..0d4c254 100644 --- a/src-literatetests/tests.blt +++ b/src-literatetests/tests.blt @@ -253,6 +253,39 @@ func -> () +############################################################################### +############################################################################### +############################################################################### +#group type signatures pragmas +############################################################################### +############################################################################### +############################################################################### + +#test inline pragma 1 +func = f + where + {-# INLINE f #-} + f = id + +#test inline pragma 2 +func = ($) + where + {-# INLINE ($) #-} + ($) = id + +#test inline pragma 3 +func = f + where + {-# INLINE CONLIKE [1] f #-} + f = id + +#test inline pragma 4 +#pending this does not work with the compiler version we currently use yet (i think). should work with ghc-8.0.2. +func = f + where + {-# INLINE [~] f #-} + f = id + ############################################################################### ############################################################################### diff --git a/src/Language/Haskell/Brittany/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Layouters/Decl.hs index b5d1e87..a6bbb46 100644 --- a/src/Language/Haskell/Brittany/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Layouters/Decl.hs @@ -25,6 +25,11 @@ import GHC ( runGhc, GenLocated(L), moduleNameString ) import SrcLoc ( SrcSpan ) import HsSyn import Name +import BasicTypes ( InlinePragma(..) + , Activation(..) + , InlineSpec(..) + , RuleMatchInfo(..) + ) import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) import Language.Haskell.Brittany.Layouters.Type @@ -60,7 +65,27 @@ layoutSig lsig@(L _loc sig) = case sig of ] ) ] - _ -> briDocByExactNoComment lsig -- TODO + InlineSig name (InlinePragma _ spec _arity phaseAct conlike) -> + docWrapNode lsig $ do + nameStr <- lrdrNameToTextAnn name + let specStr = case spec of + Inline -> "INLINE " + Inlinable -> "INLINABLE " + NoInline -> "NOINLINE " + EmptyInlineSpec -> "" -- i have no idea if this is correct. + let phaseStr = case phaseAct of + NeverActive -> "[] " + AlwaysActive -> "" + ActiveBefore _ i -> "[~" ++ show i ++ "] " + ActiveAfter _ i -> "[" ++ show i ++ "] " + let conlikeStr = case conlike of + FunLike -> "" + ConLike -> "CONLIKE " + docLit + $ Text.pack ("{-# " ++ specStr ++ conlikeStr ++ phaseStr) + <> nameStr + <> Text.pack " #-}" + _ -> briDocByExactNoComment lsig -- TODO layoutGuardLStmt :: ToBriDoc' (Stmt RdrName (LHsExpr RdrName)) layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of