@@ -276,15 +276,17 @@ literals = mkPattern' match
276276 , prettyPrintCpp' thens
277277 , maybe (return "") (fmap (" else " <>) . prettyPrintCpp') elses
278278 ]
279− match (CppSwitch cond cases@((case1,_):_:_)) = mconcat <$> sequence
279+ match (CppSwitch cond cases@((case1,_):_:_) default') = mconcat <$> sequence
280280 [ return "switch "
281281 , return . parensT $ prettyPrintCpp1 (cast case1 cond)
282282 , return " {\n"
283283 , withIndent $ do
284− cpps <- forM cases $ \(c, s) -> do
285− c' <- prettyPrintCpp' c
286− s' <- prettyPrintCpp' s
287− return $ "case " <> c' <> ": " <> s' <> ";"
284+ cpps <- forM (normalizeBlocks $
285+ cases ++ maybe [] (\c -> [(CppNoOp,c)]) default')
286+ $ \(c, s) -> do
287+ c' <- prettyPrintCpp' c
288+ s' <- prettyPrintCpp' s
289+ return $ label c <> c' <> ": " <> s' <> caseEnd s
288290 indentString <- currentIndent
289291 return $ T.intercalate "\n" $ map (indentString <>) cpps
290292 , return "\n"
@@ -297,6 +299,25 @@ literals = mkPattern' match
297299 cast CppBooleanLiteral {} cpp' = CppCast boolType cpp'
298300 cast CppCharLiteral {} cpp' = CppCast charType cpp'
299301 cast _ cpp' = cpp'
302+ normalizeBlocks :: [(Cpp,Cpp)] -> [(Cpp,Cpp)]
303+ normalizeBlocks cpps
304+ | any (isBlock . snd) cpps = addBlock <$> cpps
305+ | otherwise = cpps
306+ where
307+ addBlock (cpp1, cpp2@(CppBlock _)) = (cpp1, cpp2)
308+ addBlock (cpp1, cpp2) = (cpp1, CppBlock [cpp2])
309+ label :: Cpp -> Text
310+ label CppNoOp = "default"
311+ label _ = "case "
312+ caseEnd :: Cpp -> Text
313+ caseEnd (CppReturn {}) = ";"
314+ caseEnd (CppThrow {}) = ";"
315+ caseEnd (CppContinue) = ";"
316+ caseEnd (CppBlock stmts@(_:_))
317+ | (CppReturn {}) <- last stmts = ""
318+ | (CppThrow {}) <- last stmts = ""
319+ | CppContinue <- last stmts = ""
320+ caseEnd _ = " break;"
300321 match (CppReturn (CppBlock (cpp:cpps))) = mconcat <$> sequence
301322 [ do s <- prettyPrintCpp' cpp
302323 return $ T.dropWhile isSpace s
@@ -538,6 +559,10 @@ isNoOp CppNoOp = True
538559isNoOp (CppComment [] CppNoOp) = True
539560isNoOp _ = False
540561
562+isBlock :: Cpp -> Bool
563+isBlock (CppBlock {}) = True
564+isBlock _ = False
565+
541566renderName :: Text -> Text
542567renderName name
543568 | Just ('*', name') <- T.uncons name = '$' `T.cons` name'