The attached patch allows clang-formatter to properly format try catch blocks.
Before the patch there was no proper way of dealing with try/catch blocks so the braces occurring after the keyword were considered as compound-statements and a new line was always inserted. Even though it works for the traditional try/catch blocks, It still has issues when dealing with function-try-block's -- Diego Alexander Rojas Páez E-Mail: [email protected] Mobile: +49 (151) 5249 5452 Address: Stefan-George-Ring 46 81929, Munich Germany -------------- next part -------------- Index: lib/Format/UnwrappedLineParser.cpp =================================================================== --- lib/Format/UnwrappedLineParser.cpp (revision 198773) +++ lib/Format/UnwrappedLineParser.cpp (working copy) @@ -621,6 +621,9 @@ case tok::kw_private: parseAccessSpecifier(); return; + case tok::kw_try: + parseTryCatch(); + return; case tok::kw_if: parseIfThenElse(); return; @@ -1028,6 +1031,50 @@ } } +void UnwrappedLineParser::parseTryCatch() { + assert(FormatTok->Tok.is(tok::kw_try) && "'try' expected"); + nextToken(); + bool NeedsUnwrappedLine = false; + if (FormatTok->Tok.is(tok::l_brace)) { + CompoundStatementIndenter Indenter(this, Style, Line->Level); + parseBlock(/*MustBeDeclaration=*/false); + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman || + Style.BreakBeforeBraces == FormatStyle::BS_GNU) { + addUnwrappedLine(); + } else { + NeedsUnwrappedLine = true; + } + } else if (!FormatTok->Tok.is(tok::kw_catch)) { + // The C++ standard requires a compound-statement after a try. + // If there's none, we try to assume there's a structuralElement + // and try to continue. + StructuralError = true; + addUnwrappedLine(); + ++Line->Level; + parseStructuralElement(); + --Line->Level; + } + while (FormatTok->Tok.is(tok::kw_catch)) { + nextToken(); + if (FormatTok->Tok.is(tok::l_paren)) + parseParens(); + NeedsUnwrappedLine = false; + if (FormatTok->Tok.is(tok::l_brace)) { + CompoundStatementIndenter Indenter(this, Style, Line->Level); + parseBlock(/*MustBeDeclaration=*/false); + if (Style.BreakBeforeBraces == FormatStyle::BS_Allman || + Style.BreakBeforeBraces == FormatStyle::BS_GNU) { + addUnwrappedLine(); + } else { + NeedsUnwrappedLine = true; + } + } + } + if (NeedsUnwrappedLine) { + addUnwrappedLine(); + } +} + void UnwrappedLineParser::parseNamespace() { assert(FormatTok->Tok.is(tok::kw_namespace) && "'namespace' expected"); nextToken(); Index: lib/Format/UnwrappedLineParser.h =================================================================== --- lib/Format/UnwrappedLineParser.h (revision 198773) +++ lib/Format/UnwrappedLineParser.h (working copy) @@ -85,6 +85,7 @@ void parseReturn(); void parseParens(); void parseSquare(); + void parseTryCatch(); void parseIfThenElse(); void parseForOrWhileLoop(); void parseDoWhile(); _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
