diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 014c30e346ad..ea68150d6a42 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -150,7 +150,8 @@ bool ContinuationIndenter::mustBreak(const LineState &State) { Previous.Type != TT_InlineASMColon && Previous.Type != TT_ConditionalExpr && nextIsMultilineString(State)) return true; - if (((Previous.Type == TT_DictLiteral && Previous.is(tok::l_brace)) || + if (Style.Language != FormatStyle::LK_Proto && + ((Previous.Type == TT_DictLiteral && Previous.is(tok::l_brace)) || Previous.Type == TT_ArrayInitializerLSquare) && Style.ColumnLimit > 0 && getLengthToMatchingParen(Previous) + State.Column > getColumnLimit(State)) diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 885d147b9b60..269e2fc28aae 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -311,8 +311,7 @@ private: if (CurrentToken->isOneOf(tok::r_paren, tok::r_square)) return false; updateParameterCount(Left, CurrentToken); - if (CurrentToken->is(tok::colon) && - Style.Language != FormatStyle::LK_Proto) { + if (CurrentToken->is(tok::colon)) { if (CurrentToken->getPreviousNonComment()->is(tok::identifier)) CurrentToken->getPreviousNonComment()->Type = TT_SelectorName; Left->Type = TT_DictLiteral; @@ -1683,6 +1682,9 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, } else if (isAllmanBrace(Left) || isAllmanBrace(Right)) { return Style.BreakBeforeBraces == FormatStyle::BS_Allman || Style.BreakBeforeBraces == FormatStyle::BS_GNU; + } else if (Style.Language == FormatStyle::LK_Proto && + Left.isNot(tok::l_brace) && Right.Type == TT_SelectorName) { + return true; } // If the last token before a '}' is a comma or a comment, the intention is to diff --git a/clang/unittests/Format/FormatTestProto.cpp b/clang/unittests/Format/FormatTestProto.cpp index bfd502566757..3ff38eab024e 100644 --- a/clang/unittests/Format/FormatTestProto.cpp +++ b/clang/unittests/Format/FormatTestProto.cpp @@ -98,8 +98,27 @@ TEST_F(FormatTestProto, MessageFieldAttributes) { } TEST_F(FormatTestProto, FormatsOptions) { - verifyFormat("option java_package = \"my.test.package\";"); - verifyFormat("option (my_custom_option) = \"abc\";"); + verifyFormat("option (MyProto.options) = {\n" + " field_a: OK\n" + " field_b: \"OK\"\n" + " field_c: \"OK\"\n" + " msg_field: {field_d: 123}\n" + "};"); + + verifyFormat("option (MyProto.options) = {\n" + " field_a: OK\n" + " field_b: \"OK\"\n" + " field_c: \"OK\"\n" + " msg_field: {field_d: 123\n" + " field_e: OK}\n" + "};"); + + verifyFormat("option (MyProto.options) = {\n" + " field_a: OK // Comment\n" + " field_b: \"OK\"\n" + " field_c: \"OK\"\n" + " msg_field: {field_d: 123}\n" + "};"); } TEST_F(FormatTestProto, FormatsService) {