Lay out unboxed tuples with spaces

This avoids clashes with names like foo#
pull/186/head
Sergey Vinokurov 2018-09-18 00:25:18 +01:00
parent 9d7cecaa92
commit 281d7a2f81
No known key found for this signature in database
GPG Key ID: D6CD29530F98D6B8
3 changed files with 33 additions and 14 deletions

View File

@ -650,3 +650,13 @@ jaicyhHumzo btrKpeyiFej mava = do
) )
Xcde{} -> (s, Pioemav) Xcde{} -> (s, Pioemav)
pure imomue pure imomue
#test unboxed-tuple and vanilla names
{-# LANGUAGE UnboxedTuples #-}
spanKey = case foo of
(# bar, baz #) -> (# baz, bar #)
#test unboxed-tuple and hashed name
{-# LANGUAGE MagicHash, UnboxedTuples #-}
spanKey = case foo of
(# bar#, baz# #) -> (# baz# +# bar#, bar# #)

View File

@ -372,7 +372,10 @@ layoutExpr lexpr@(L _ expr) = do
hasComments <- hasAnyCommentsBelow lexpr hasComments <- hasAnyCommentsBelow lexpr
let (openLit, closeLit) = case boxity of let (openLit, closeLit) = case boxity of
Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")")
Unboxed -> (docLit $ Text.pack "(#", docLit $ Text.pack "#)") Unboxed ->
( docSeq [docLit $ Text.pack "(#", docSeparator]
, docSeq [docSeparator, docLit $ Text.pack "#)"]
)
case splitFirstLast argDocs of case splitFirstLast argDocs of
FirstLastEmpty -> docSeq FirstLastEmpty -> docSeq
[ openLit [ openLit

View File

@ -140,8 +140,8 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of
-- (nestedpat1, nestedpat2, nestedpat3) -> expr -- (nestedpat1, nestedpat2, nestedpat3) -> expr
-- (#nestedpat1, nestedpat2, nestedpat3#) -> expr -- (#nestedpat1, nestedpat2, nestedpat3#) -> expr
case boxity of case boxity of
Boxed -> wrapPatListy args "(" ")" Boxed -> wrapPatListy args "(" ")" False
Unboxed -> wrapPatListy args "(#" "#)" Unboxed -> wrapPatListy args "(#" "#)" True
AsPat asName asPat -> do AsPat asName asPat -> do
-- bind@nestedpat -> expr -- bind@nestedpat -> expr
wrapPatPrepend asPat (docLit $ lrdrNameToText asName <> Text.pack "@") wrapPatPrepend asPat (docLit $ lrdrNameToText asName <> Text.pack "@")
@ -172,7 +172,7 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of
ListPat elems _ _ -> ListPat elems _ _ ->
-- [] -> expr1 -- [] -> expr1
-- [nestedpat1, nestedpat2, nestedpat3] -> expr2 -- [nestedpat1, nestedpat2, nestedpat3] -> expr2
wrapPatListy elems "[" "]" wrapPatListy elems "[" "]" False
BangPat pat1 -> do BangPat pat1 -> do
-- !nestedpat -> expr -- !nestedpat -> expr
wrapPatPrepend pat1 (docLit $ Text.pack "!") wrapPatPrepend pat1 (docLit $ Text.pack "!")
@ -213,17 +213,23 @@ wrapPatListy
:: [Located (Pat GhcPs)] :: [Located (Pat GhcPs)]
-> String -> String
-> String -> String
-> Bool
-> ToBriDocM (Seq BriDocNumbered) -> ToBriDocM (Seq BriDocNumbered)
wrapPatListy elems start end = do wrapPatListy elems start end padSeparators = do
elemDocs <- Seq.fromList elems `forM` (layoutPat >=> colsWrapPat) elemDocs <- Seq.fromList elems `forM` (layoutPat >=> colsWrapPat)
sDoc <- docLit $ Text.pack start
eDoc <- docLit $ Text.pack end
case Seq.viewl elemDocs of case Seq.viewl elemDocs of
Seq.EmptyL -> fmap Seq.singleton $ docLit $ Text.pack $ start ++ end Seq.EmptyL -> fmap Seq.singleton $ docLit $ Text.pack $ start ++ end
x1 Seq.:< rest -> do x1 Seq.:< rest -> do
sDoc <- docLit $ Text.pack start
eDoc <- docLit $ Text.pack end
let sDoc' | padSeparators = docSeq [return sDoc, docSeparator]
| otherwise = return sDoc
eDoc' | padSeparators = docSeq [docSeparator, return eDoc]
| otherwise = return eDoc
sDoc'' <- sDoc'
eDoc'' <- eDoc'
rest' <- rest `forM` \bd -> docSeq rest' <- rest `forM` \bd -> docSeq
[ docLit $ Text.pack "," [ docCommaSep
, docSeparator
, return bd , return bd
] ]
return $ (sDoc Seq.<| x1 Seq.<| rest') Seq.|> eDoc return $ (sDoc'' Seq.<| x1 Seq.<| rest') Seq.|> eDoc''