haskell-suite / haskell-src-exts

Manipulating Haskell source: abstract syntax, lexer, parser, and pretty-printer
Other
193 stars 94 forks source link

DataKinds pretty-printing: Better to have spaces #471

Open nomeata opened 1 year ago

nomeata commented 1 year ago

This file:

{-# LANGUAGE DataKinds #-}

type PromotedList = '[ 'True ]

is pretty-printed as such:

ghci> parseFile "/tmp/Test.hs" >>= putStrLn . prettyPrint . fromParseResult
{-# LANGUAGE DataKinds #-}

type PromotedList = '['True]

but that’s not legal:

/tmp/Test.hs:3:21: error: parse error on input ‘'’
  |
3 | type PromotedList = '['True]
  |                     ^

My suggestion to is to always add a space after '[ in the pretty printer.

nomeata commented 1 year ago

I’m locally experimenting with this patch, but there are different ways of structuring this code:

diff --git a/src/Language/Haskell/Exts/Pretty.hs b/src/Language/Haskell/Exts/Pretty.hs
index 8d39a2d..6915d44 100644
--- a/src/Language/Haskell/Exts/Pretty.hs
+++ b/src/Language/Haskell/Exts/Pretty.hs
@@ -890,11 +890,11 @@ instance  Pretty (Promoted l) where
   pretty p =
     case p of
       PromotedInteger _ n _ -> integer n
-      PromotedString _ s _ -> doubleQuotes $ text s
+      PromotedString _ s _ -> text (show s)
       PromotedCon _ hasQuote qn ->
         addQuote hasQuote (pretty qn)
       PromotedList _ hasQuote list ->
-        addQuote hasQuote $ bracketList . punctuate comma . map pretty $ list
+        (if hasQuote then quoteBracketList else  bracketList) . punctuate comma . map pretty $ list
       PromotedTuple _ list ->
         addQuote True $ parenList $ map pretty list
       PromotedUnit {} -> addQuote True $ text "()"
@@ -1450,6 +1450,10 @@ braceList = braces . myFsepSimple . punctuate comma
 bracketList :: [Doc] -> Doc
 bracketList = brackets . myFsepSimple

+quoteBracketList :: [Doc] -> Doc
+quoteBracketList [] = text "'[]"
+quoteBracketList l = char '\'' <> brackets (space <> myFsepSimple l)
+
 bracketColonList :: [Doc] -> Doc
 bracketColonList = bracketColons . myFsepSimple
     where bracketColons = brackets . colons