From 220c0d1f5ed2abcf00b583acf5782dfcdace0812 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Thu, 10 Apr 2014 07:27:12 +0000 Subject: [PATCH] clang-format: Fix false positive in braced list detection in protos. llvm-svn: 205954 --- clang/lib/Format/UnwrappedLineParser.cpp | 31 +++++++++++++--------- clang/unittests/Format/FormatTestProto.cpp | 8 ++++++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 96d815572fbe..8d951bb8c627 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -335,18 +335,25 @@ void UnwrappedLineParser::calculateBraceTypes() { case tok::r_brace: if (!LBraceStack.empty()) { if (LBraceStack.back()->BlockKind == BK_Unknown) { - // If there is a comma, semicolon or right paren after the closing - // brace, we assume this is a braced initializer list. Note that - // regardless how we mark inner braces here, we will overwrite the - // BlockKind later if we parse a braced list (where all blocks inside - // are by default braced lists), or when we explicitly detect blocks - // (for example while parsing lambdas). - // - // We exclude + and - as they can be ObjC visibility modifiers. - if (NextTok->isOneOf(tok::comma, tok::semi, tok::r_paren, tok::period, - tok::r_square, tok::l_brace, tok::colon) || - (NextTok->isBinaryOperator() && - !NextTok->isOneOf(tok::plus, tok::minus))) { + bool ProbablyBracedList = false; + if (Style.Language == FormatStyle::LK_Proto) { + ProbablyBracedList = NextTok->isOneOf(tok::comma, tok::r_square); + } else { + // If there is a comma, semicolon or right paren after the closing + // brace, we assume this is a braced initializer list. Note that + // regardless how we mark inner braces here, we will overwrite the + // BlockKind later if we parse a braced list (where all blocks + // inside are by default braced lists), or when we explicitly detect + // blocks (for example while parsing lambdas). + // + // We exclude + and - as they can be ObjC visibility modifiers. + ProbablyBracedList = + NextTok->isOneOf(tok::comma, tok::semi, tok::period, tok::colon, + tok::r_paren, tok::r_square, tok::l_brace) || + (NextTok->isBinaryOperator() && + !NextTok->isOneOf(tok::plus, tok::minus)); + } + if (ProbablyBracedList) { Tok->BlockKind = BK_BracedInit; LBraceStack.back()->BlockKind = BK_BracedInit; } else { diff --git a/clang/unittests/Format/FormatTestProto.cpp b/clang/unittests/Format/FormatTestProto.cpp index 0a4416ec268c..55bf230cf999 100644 --- a/clang/unittests/Format/FormatTestProto.cpp +++ b/clang/unittests/Format/FormatTestProto.cpp @@ -92,5 +92,13 @@ TEST_F(FormatTestProto, FormatsOptions) { verifyFormat("option (my_custom_option) = \"abc\";"); } +TEST_F(FormatTestProto, FormatsService) { + verifyFormat("service SearchService {\n" + " rpc Search(SearchRequest) returns (SearchResponse) {\n" + " option foo = true;\n" + " }\n" + "};"); +} + } // end namespace tooling } // end namespace clang