[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
This revision was automatically updated to reflect the committed changes. Closed by commit rL322678: [clang-format] adds enclosing function detection to raw string formatting (authored by krasimir, committed by ). Herald added a subscriber: llvm-commits. Repository: rL LLVM https://reviews.llvm.org/D42167 Files: cfe/trunk/docs/ClangFormatStyleOptions.rst cfe/trunk/include/clang/Format/Format.h cfe/trunk/lib/Format/ContinuationIndenter.cpp cfe/trunk/lib/Format/ContinuationIndenter.h cfe/trunk/lib/Format/Format.cpp cfe/trunk/unittests/Format/FormatTest.cpp cfe/trunk/unittests/Format/FormatTestRawStrings.cpp Index: cfe/trunk/lib/Format/Format.cpp === --- cfe/trunk/lib/Format/Format.cpp +++ cfe/trunk/lib/Format/Format.cpp @@ -457,6 +457,7 @@ static void mapping(IO , FormatStyle::RawStringFormat ) { IO.mapOptional("Language", Format.Language); IO.mapOptional("Delimiters", Format.Delimiters); +IO.mapOptional("EnclosingFunctions", Format.EnclosingFunctions); IO.mapOptional("BasedOnStyle", Format.BasedOnStyle); } }; @@ -705,6 +706,12 @@ "textproto", "TEXTPROTO", }, + /*EnclosingFunctionNames=*/ + { + "EqualsProto", + "PARSE_TEXT_PROTO", + "ParseTextProto", + }, /*BasedOnStyle=*/"google", }}; GoogleStyle.SpacesBeforeTrailingComments = 2; Index: cfe/trunk/lib/Format/ContinuationIndenter.h === --- cfe/trunk/lib/Format/ContinuationIndenter.h +++ cfe/trunk/lib/Format/ContinuationIndenter.h @@ -38,10 +38,14 @@ struct RawStringFormatStyleManager { llvm::StringMap DelimiterStyle; + llvm::StringMap EnclosingFunctionStyle; RawStringFormatStyleManager(const FormatStyle ); - llvm::Optional get(StringRef Delimiter) const; + llvm::Optional getDelimiterStyle(StringRef Delimiter) const; + + llvm::Optional + getEnclosingFunctionStyle(StringRef EnclosingFunction) const; }; class ContinuationIndenter { Index: cfe/trunk/lib/Format/ContinuationIndenter.cpp === --- cfe/trunk/lib/Format/ContinuationIndenter.cpp +++ cfe/trunk/lib/Format/ContinuationIndenter.cpp @@ -105,32 +105,44 @@ RawStringFormatStyleManager::RawStringFormatStyleManager( const FormatStyle ) { for (const auto : CodeStyle.RawStringFormats) { -for (StringRef Delimiter : RawStringFormat.Delimiters) { - llvm::Optional LanguageStyle = - CodeStyle.GetLanguageStyle(RawStringFormat.Language); - if (!LanguageStyle) { -FormatStyle PredefinedStyle; -if (!getPredefinedStyle(RawStringFormat.BasedOnStyle, -RawStringFormat.Language, )) { - PredefinedStyle = getLLVMStyle(); - PredefinedStyle.Language = RawStringFormat.Language; -} -LanguageStyle = PredefinedStyle; +llvm::Optional LanguageStyle = +CodeStyle.GetLanguageStyle(RawStringFormat.Language); +if (!LanguageStyle) { + FormatStyle PredefinedStyle; + if (!getPredefinedStyle(RawStringFormat.BasedOnStyle, + RawStringFormat.Language, )) { +PredefinedStyle = getLLVMStyle(); +PredefinedStyle.Language = RawStringFormat.Language; } - LanguageStyle->ColumnLimit = CodeStyle.ColumnLimit; + LanguageStyle = PredefinedStyle; +} +LanguageStyle->ColumnLimit = CodeStyle.ColumnLimit; +for (StringRef Delimiter : RawStringFormat.Delimiters) { DelimiterStyle.insert({Delimiter, *LanguageStyle}); } +for (StringRef EnclosingFunction : RawStringFormat.EnclosingFunctions) { + EnclosingFunctionStyle.insert({EnclosingFunction, *LanguageStyle}); +} } } llvm::Optional -RawStringFormatStyleManager::get(StringRef Delimiter) const { +RawStringFormatStyleManager::getDelimiterStyle(StringRef Delimiter) const { auto It = DelimiterStyle.find(Delimiter); if (It == DelimiterStyle.end()) return None; return It->second; } +llvm::Optional +RawStringFormatStyleManager::getEnclosingFunctionStyle( +StringRef EnclosingFunction) const { + auto It = EnclosingFunctionStyle.find(EnclosingFunction); + if (It == EnclosingFunctionStyle.end()) +return None; + return It->second; +} + ContinuationIndenter::ContinuationIndenter(const FormatStyle , const AdditionalKeywords , const SourceManager , @@ -1437,15 +1449,38 @@ return Penalty; } +// Returns the enclosing function name of a token, or the empty string if not +// found. +static StringRef getEnclosingFunctionName(const FormatToken ) { + // Look for: 'function(' or 'function(' before Current. + auto Tok = Current.getPreviousNonComment(); + if (!Tok || !Tok->is(tok::l_paren)) +return ""; + Tok =
[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
This revision was automatically updated to reflect the committed changes. Closed by commit rC322678: [clang-format] adds enclosing function detection to raw string formatting (authored by krasimir, committed by ). Changed prior to commit: https://reviews.llvm.org/D42167?vs=130177=130191#toc Repository: rC Clang https://reviews.llvm.org/D42167 Files: docs/ClangFormatStyleOptions.rst include/clang/Format/Format.h lib/Format/ContinuationIndenter.cpp lib/Format/ContinuationIndenter.h lib/Format/Format.cpp unittests/Format/FormatTest.cpp unittests/Format/FormatTestRawStrings.cpp Index: lib/Format/ContinuationIndenter.h === --- lib/Format/ContinuationIndenter.h +++ lib/Format/ContinuationIndenter.h @@ -38,10 +38,14 @@ struct RawStringFormatStyleManager { llvm::StringMap DelimiterStyle; + llvm::StringMap EnclosingFunctionStyle; RawStringFormatStyleManager(const FormatStyle ); - llvm::Optional get(StringRef Delimiter) const; + llvm::Optional getDelimiterStyle(StringRef Delimiter) const; + + llvm::Optional + getEnclosingFunctionStyle(StringRef EnclosingFunction) const; }; class ContinuationIndenter { Index: lib/Format/ContinuationIndenter.cpp === --- lib/Format/ContinuationIndenter.cpp +++ lib/Format/ContinuationIndenter.cpp @@ -105,32 +105,44 @@ RawStringFormatStyleManager::RawStringFormatStyleManager( const FormatStyle ) { for (const auto : CodeStyle.RawStringFormats) { -for (StringRef Delimiter : RawStringFormat.Delimiters) { - llvm::Optional LanguageStyle = - CodeStyle.GetLanguageStyle(RawStringFormat.Language); - if (!LanguageStyle) { -FormatStyle PredefinedStyle; -if (!getPredefinedStyle(RawStringFormat.BasedOnStyle, -RawStringFormat.Language, )) { - PredefinedStyle = getLLVMStyle(); - PredefinedStyle.Language = RawStringFormat.Language; -} -LanguageStyle = PredefinedStyle; +llvm::Optional LanguageStyle = +CodeStyle.GetLanguageStyle(RawStringFormat.Language); +if (!LanguageStyle) { + FormatStyle PredefinedStyle; + if (!getPredefinedStyle(RawStringFormat.BasedOnStyle, + RawStringFormat.Language, )) { +PredefinedStyle = getLLVMStyle(); +PredefinedStyle.Language = RawStringFormat.Language; } - LanguageStyle->ColumnLimit = CodeStyle.ColumnLimit; + LanguageStyle = PredefinedStyle; +} +LanguageStyle->ColumnLimit = CodeStyle.ColumnLimit; +for (StringRef Delimiter : RawStringFormat.Delimiters) { DelimiterStyle.insert({Delimiter, *LanguageStyle}); } +for (StringRef EnclosingFunction : RawStringFormat.EnclosingFunctions) { + EnclosingFunctionStyle.insert({EnclosingFunction, *LanguageStyle}); +} } } llvm::Optional -RawStringFormatStyleManager::get(StringRef Delimiter) const { +RawStringFormatStyleManager::getDelimiterStyle(StringRef Delimiter) const { auto It = DelimiterStyle.find(Delimiter); if (It == DelimiterStyle.end()) return None; return It->second; } +llvm::Optional +RawStringFormatStyleManager::getEnclosingFunctionStyle( +StringRef EnclosingFunction) const { + auto It = EnclosingFunctionStyle.find(EnclosingFunction); + if (It == EnclosingFunctionStyle.end()) +return None; + return It->second; +} + ContinuationIndenter::ContinuationIndenter(const FormatStyle , const AdditionalKeywords , const SourceManager , @@ -1437,15 +1449,38 @@ return Penalty; } +// Returns the enclosing function name of a token, or the empty string if not +// found. +static StringRef getEnclosingFunctionName(const FormatToken ) { + // Look for: 'function(' or 'function(' before Current. + auto Tok = Current.getPreviousNonComment(); + if (!Tok || !Tok->is(tok::l_paren)) +return ""; + Tok = Tok->getPreviousNonComment(); + if (!Tok) +return ""; + if (Tok->is(TT_TemplateCloser)) { +Tok = Tok->MatchingParen; +if (Tok) + Tok = Tok->getPreviousNonComment(); + } + if (!Tok || !Tok->is(tok::identifier)) +return ""; + return Tok->TokenText; +} + llvm::Optional ContinuationIndenter::getRawStringStyle(const FormatToken , const LineState ) { if (!Current.isStringLiteral()) return None; auto Delimiter = getRawStringDelimiter(Current.TokenText); if (!Delimiter) return None; - auto RawStringStyle = RawStringFormats.get(*Delimiter); + auto RawStringStyle = RawStringFormats.getDelimiterStyle(*Delimiter); + if (!RawStringStyle) +RawStringStyle = RawStringFormats.getEnclosingFunctionStyle( +getEnclosingFunctionName(Current)); if (!RawStringStyle) return None; RawStringStyle->ColumnLimit =
[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
bkramer accepted this revision. bkramer added a comment. This revision is now accepted and ready to land. lgtm Repository: rC Clang https://reviews.llvm.org/D42167 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
krasimir updated this revision to Diff 130177. krasimir added a comment. - Format a function Repository: rC Clang https://reviews.llvm.org/D42167 Files: docs/ClangFormatStyleOptions.rst include/clang/Format/Format.h lib/Format/ContinuationIndenter.cpp lib/Format/ContinuationIndenter.h lib/Format/Format.cpp unittests/Format/FormatTest.cpp unittests/Format/FormatTestRawStrings.cpp Index: unittests/Format/FormatTestRawStrings.cpp === --- unittests/Format/FormatTestRawStrings.cpp +++ unittests/Format/FormatTestRawStrings.cpp @@ -65,23 +65,32 @@ FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) { FormatStyle Style = getLLVMStyle(); Style.ColumnLimit = ColumnLimit; -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_TextProto, - /*Delimiters=*/{"pb"}, - /*BasedOnStyle=*/"google"}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_TextProto, + /*Delimiters=*/{"pb"}, + /*EnclosingFunctions=*/{}, + /*BasedOnStyle=*/"google"}, +}; return Style; } FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) { FormatStyle Style = getLLVMStyle(); -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_Cpp, - /*Delimiters=*/{"cpp"}, BasedOnStyle}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_Cpp, + /*Delimiters=*/{"cpp"}, + /*EnclosingFunctions=*/{}, BasedOnStyle}, +}; return Style; } FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) { FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_Cpp, - /*Delimiters=*/{"cpp"}, BasedOnStyle}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_Cpp, + /*Delimiters=*/{"cpp"}, + /*EnclosingFunctions=*/{}, BasedOnStyle}, +}; return Style; } @@ -122,7 +131,7 @@ EXPECT_EQ(0, parseConfiguration("---\n" "Language: Cpp\n" "BasedOnStyle: Google", ).value()); - Style.RawStringFormats = {{FormatStyle::LK_Cpp, {"cpp"}, "llvm"}}; + Style.RawStringFormats = {{FormatStyle::LK_Cpp, {"cpp"}, {}, "llvm"}}; expect_eq(R"test(int* i = R"cpp(int* j = 0;)cpp";)test", format(R"test(int * i = R"cpp(int * j = 0;)cpp";)test", Style)); } @@ -720,6 +729,29 @@ getRawStringPbStyleWithColumns(20))); } +TEST_F(FormatTestRawStrings, FormatsRawStringsWithEnclosingFunctionName) { + FormatStyle Style = getRawStringPbStyleWithColumns(40); + Style.RawStringFormats[0].EnclosingFunctions.push_back( + "PARSE_TEXT_PROTO"); + Style.RawStringFormats[0].EnclosingFunctions.push_back("ParseTextProto"); + expect_eq(R"test(a = PARSE_TEXT_PROTO(R"(key: value)");)test", +format(R"test(a = PARSE_TEXT_PROTO(R"(key:value)");)test", Style)); + + expect_eq(R"test( +a = PARSE_TEXT_PROTO /**/ ( +/**/ R"(key: value)");)test", +format(R"test( +a = PARSE_TEXT_PROTO/**/(/**/R"(key:value)");)test", + Style)); + + expect_eq(R"test( +a = ParseTextProto( +R"(key: value)");)test", +format(R"test( +a = ParseTextProto(R"(key:value)");)test", + Style)); +} + } // end namespace } // end namespace format } // end namespace clang Index: unittests/Format/FormatTest.cpp === --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -10408,21 +10408,35 @@ Style.RawStringFormats.clear(); std::vector ExpectedRawStringFormats = { - {FormatStyle::LK_TextProto, {"pb", "proto"}, "llvm"}, - {FormatStyle::LK_Cpp, {"cc", "cpp"}, "google"}, + { + FormatStyle::LK_TextProto, + {"pb", "proto"}, + {"PARSE_TEXT_PROTO"}, + "llvm", + }, + { + FormatStyle::LK_Cpp, + {"cc", "cpp"}, + {"C_CODEBLOCK", "CPPEVAL"}, + "", + }, }; CHECK_PARSE("RawStringFormats:\n" " - Language: TextProto\n" "Delimiters:\n" " - 'pb'\n" " - 'proto'\n" + "EnclosingFunctions:\n" + " - 'PARSE_TEXT_PROTO'\n" "BasedOnStyle: llvm\n" " - Language: Cpp\n" "Delimiters:\n" " - 'cc'\n" " - 'cpp'\n" - "BasedOnStyle: google\n", + "EnclosingFunctions:\n" + " - 'C_CODEBLOCK'\n" + " - 'CPPEVAL'\n", RawStringFormats, ExpectedRawStringFormats); } Index: lib/Format/Format.cpp
[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
bkramer added inline comments. Comment at: lib/Format/ContinuationIndenter.cpp:1454 +// found. +static StringRef getEnclosingFunctionName(const FormatToken& Current) { + // Look for: 'function(' or 'function(' before Current. This function doesn't look clang-formatted. Repository: rC Clang https://reviews.llvm.org/D42167 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
krasimir updated this revision to Diff 130142. krasimir added a comment. - Update comments Repository: rC Clang https://reviews.llvm.org/D42167 Files: docs/ClangFormatStyleOptions.rst include/clang/Format/Format.h lib/Format/ContinuationIndenter.cpp lib/Format/ContinuationIndenter.h lib/Format/Format.cpp unittests/Format/FormatTest.cpp unittests/Format/FormatTestRawStrings.cpp Index: unittests/Format/FormatTestRawStrings.cpp === --- unittests/Format/FormatTestRawStrings.cpp +++ unittests/Format/FormatTestRawStrings.cpp @@ -65,23 +65,32 @@ FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) { FormatStyle Style = getLLVMStyle(); Style.ColumnLimit = ColumnLimit; -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_TextProto, - /*Delimiters=*/{"pb"}, - /*BasedOnStyle=*/"google"}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_TextProto, + /*Delimiters=*/{"pb"}, + /*EnclosingFunctions=*/{}, + /*BasedOnStyle=*/"google"}, +}; return Style; } FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) { FormatStyle Style = getLLVMStyle(); -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_Cpp, - /*Delimiters=*/{"cpp"}, BasedOnStyle}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_Cpp, + /*Delimiters=*/{"cpp"}, + /*EnclosingFunctions=*/{}, BasedOnStyle}, +}; return Style; } FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) { FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_Cpp, - /*Delimiters=*/{"cpp"}, BasedOnStyle}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_Cpp, + /*Delimiters=*/{"cpp"}, + /*EnclosingFunctions=*/{}, BasedOnStyle}, +}; return Style; } @@ -122,7 +131,7 @@ EXPECT_EQ(0, parseConfiguration("---\n" "Language: Cpp\n" "BasedOnStyle: Google", ).value()); - Style.RawStringFormats = {{FormatStyle::LK_Cpp, {"cpp"}, "llvm"}}; + Style.RawStringFormats = {{FormatStyle::LK_Cpp, {"cpp"}, {}, "llvm"}}; expect_eq(R"test(int* i = R"cpp(int* j = 0;)cpp";)test", format(R"test(int * i = R"cpp(int * j = 0;)cpp";)test", Style)); } @@ -720,6 +729,29 @@ getRawStringPbStyleWithColumns(20))); } +TEST_F(FormatTestRawStrings, FormatsRawStringsWithEnclosingFunctionName) { + FormatStyle Style = getRawStringPbStyleWithColumns(40); + Style.RawStringFormats[0].EnclosingFunctions.push_back( + "PARSE_TEXT_PROTO"); + Style.RawStringFormats[0].EnclosingFunctions.push_back("ParseTextProto"); + expect_eq(R"test(a = PARSE_TEXT_PROTO(R"(key: value)");)test", +format(R"test(a = PARSE_TEXT_PROTO(R"(key:value)");)test", Style)); + + expect_eq(R"test( +a = PARSE_TEXT_PROTO /**/ ( +/**/ R"(key: value)");)test", +format(R"test( +a = PARSE_TEXT_PROTO/**/(/**/R"(key:value)");)test", + Style)); + + expect_eq(R"test( +a = ParseTextProto( +R"(key: value)");)test", +format(R"test( +a = ParseTextProto(R"(key:value)");)test", + Style)); +} + } // end namespace } // end namespace format } // end namespace clang Index: unittests/Format/FormatTest.cpp === --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -10408,21 +10408,35 @@ Style.RawStringFormats.clear(); std::vector ExpectedRawStringFormats = { - {FormatStyle::LK_TextProto, {"pb", "proto"}, "llvm"}, - {FormatStyle::LK_Cpp, {"cc", "cpp"}, "google"}, + { + FormatStyle::LK_TextProto, + {"pb", "proto"}, + {"PARSE_TEXT_PROTO"}, + "llvm", + }, + { + FormatStyle::LK_Cpp, + {"cc", "cpp"}, + {"C_CODEBLOCK", "CPPEVAL"}, + "", + }, }; CHECK_PARSE("RawStringFormats:\n" " - Language: TextProto\n" "Delimiters:\n" " - 'pb'\n" " - 'proto'\n" + "EnclosingFunctions:\n" + " - 'PARSE_TEXT_PROTO'\n" "BasedOnStyle: llvm\n" " - Language: Cpp\n" "Delimiters:\n" " - 'cc'\n" " - 'cpp'\n" - "BasedOnStyle: google\n", + "EnclosingFunctions:\n" + " - 'C_CODEBLOCK'\n" + " - 'CPPEVAL'\n", RawStringFormats, ExpectedRawStringFormats); } Index: lib/Format/Format.cpp
[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting
krasimir created this revision. Herald added subscribers: cfe-commits, klimek. This patch adds enclosing function detection to raw string formatting. Repository: rC Clang https://reviews.llvm.org/D42167 Files: docs/ClangFormatStyleOptions.rst include/clang/Format/Format.h lib/Format/ContinuationIndenter.cpp lib/Format/ContinuationIndenter.h lib/Format/Format.cpp unittests/Format/FormatTest.cpp unittests/Format/FormatTestRawStrings.cpp Index: unittests/Format/FormatTestRawStrings.cpp === --- unittests/Format/FormatTestRawStrings.cpp +++ unittests/Format/FormatTestRawStrings.cpp @@ -65,23 +65,32 @@ FormatStyle getRawStringPbStyleWithColumns(unsigned ColumnLimit) { FormatStyle Style = getLLVMStyle(); Style.ColumnLimit = ColumnLimit; -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_TextProto, - /*Delimiters=*/{"pb"}, - /*BasedOnStyle=*/"google"}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_TextProto, + /*Delimiters=*/{"pb"}, + /*EnclosingFunctions=*/{}, + /*BasedOnStyle=*/"google"}, +}; return Style; } FormatStyle getRawStringLLVMCppStyleBasedOn(std::string BasedOnStyle) { FormatStyle Style = getLLVMStyle(); -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_Cpp, - /*Delimiters=*/{"cpp"}, BasedOnStyle}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_Cpp, + /*Delimiters=*/{"cpp"}, + /*EnclosingFunctions=*/{}, BasedOnStyle}, +}; return Style; } FormatStyle getRawStringGoogleCppStyleBasedOn(std::string BasedOnStyle) { FormatStyle Style = getGoogleStyle(FormatStyle::LK_Cpp); -Style.RawStringFormats = {{/*Language=*/FormatStyle::LK_Cpp, - /*Delimiters=*/{"cpp"}, BasedOnStyle}}; +Style.RawStringFormats = { +{/*Language=*/FormatStyle::LK_Cpp, + /*Delimiters=*/{"cpp"}, + /*EnclosingFunctions=*/{}, BasedOnStyle}, +}; return Style; } @@ -122,7 +131,7 @@ EXPECT_EQ(0, parseConfiguration("---\n" "Language: Cpp\n" "BasedOnStyle: Google", ).value()); - Style.RawStringFormats = {{FormatStyle::LK_Cpp, {"cpp"}, "llvm"}}; + Style.RawStringFormats = {{FormatStyle::LK_Cpp, {"cpp"}, {}, "llvm"}}; expect_eq(R"test(int* i = R"cpp(int* j = 0;)cpp";)test", format(R"test(int * i = R"cpp(int * j = 0;)cpp";)test", Style)); } @@ -720,6 +729,29 @@ getRawStringPbStyleWithColumns(20))); } +TEST_F(FormatTestRawStrings, FormatsRawStringsWithEnclosingFunctionName) { + FormatStyle Style = getRawStringPbStyleWithColumns(40); + Style.RawStringFormats[0].EnclosingFunctions.push_back( + "PARSE_TEXT_PROTO"); + Style.RawStringFormats[0].EnclosingFunctions.push_back("ParseTextProto"); + expect_eq(R"test(a = PARSE_TEXT_PROTO(R"(key: value)");)test", +format(R"test(a = PARSE_TEXT_PROTO(R"(key:value)");)test", Style)); + + expect_eq(R"test( +a = PARSE_TEXT_PROTO /**/ ( +/**/ R"(key: value)");)test", +format(R"test( +a = PARSE_TEXT_PROTO/**/(/**/R"(key:value)");)test", + Style)); + + expect_eq(R"test( +a = ParseTextProto( +R"(key: value)");)test", +format(R"test( +a = ParseTextProto(R"(key:value)");)test", + Style)); +} + } // end namespace } // end namespace format } // end namespace clang Index: unittests/Format/FormatTest.cpp === --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -10408,21 +10408,35 @@ Style.RawStringFormats.clear(); std::vector ExpectedRawStringFormats = { - {FormatStyle::LK_TextProto, {"pb", "proto"}, "llvm"}, - {FormatStyle::LK_Cpp, {"cc", "cpp"}, "google"}, + { + FormatStyle::LK_TextProto, + {"pb", "proto"}, + {"PARSE_TEXT_PROTO"}, + "llvm", + }, + { + FormatStyle::LK_Cpp, + {"cc", "cpp"}, + {"C_CODEBLOCK", "CPPEVAL"}, + "", + }, }; CHECK_PARSE("RawStringFormats:\n" " - Language: TextProto\n" "Delimiters:\n" " - 'pb'\n" " - 'proto'\n" + "EnclosingFunctions:\n" + " - 'PARSE_TEXT_PROTO'\n" "BasedOnStyle: llvm\n" " - Language: Cpp\n" "Delimiters:\n" " - 'cc'\n" " - 'cpp'\n" - "BasedOnStyle: google\n", + "EnclosingFunctions:\n" + " - 'C_CODEBLOCK'\n" + " - 'CPPEVAL'\n", RawStringFormats, ExpectedRawStringFormats); } Index: