[PATCH] D42167: [clang-format] adds enclosing function detection to raw string formatting

2018-01-17 Thread Krasimir Georgiev via Phabricator via cfe-commits
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

2018-01-17 Thread Krasimir Georgiev via Phabricator via cfe-commits
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

2018-01-17 Thread Benjamin Kramer via Phabricator via cfe-commits
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

2018-01-17 Thread Krasimir Georgiev via Phabricator via cfe-commits
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

2018-01-17 Thread Benjamin Kramer via Phabricator via cfe-commits
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

2018-01-17 Thread Krasimir Georgiev via Phabricator via cfe-commits
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

2018-01-17 Thread Krasimir Georgiev via Phabricator via cfe-commits
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: