diff options
author | Krasimir Georgiev <krasimir@google.com> | 2018-01-17 16:17:26 +0000 |
---|---|---|
committer | Krasimir Georgiev <krasimir@google.com> | 2018-01-17 16:17:26 +0000 |
commit | 2537e2209454a67f9630fcacae6b05e2a7caffb1 (patch) | |
tree | cf133faa1ae78e23c05b6462ba78875baa0423bc /clang/lib/Format | |
parent | 2c6fe505b1868033fa1e225ec5a777dbb9e01700 (diff) | |
download | bcm5719-llvm-2537e2209454a67f9630fcacae6b05e2a7caffb1.tar.gz bcm5719-llvm-2537e2209454a67f9630fcacae6b05e2a7caffb1.zip |
[clang-format] adds enclosing function detection to raw string formatting
Summary: This patch adds enclosing function detection to raw string formatting.
Reviewers: bkramer
Reviewed By: bkramer
Subscribers: klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D42167
llvm-svn: 322678
Diffstat (limited to 'clang/lib/Format')
-rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 63 | ||||
-rw-r--r-- | clang/lib/Format/ContinuationIndenter.h | 6 | ||||
-rw-r--r-- | clang/lib/Format/Format.cpp | 7 |
3 files changed, 61 insertions, 15 deletions
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 4fe9bcd5f6b..520235a3129 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -105,32 +105,44 @@ static llvm::Optional<StringRef> getRawStringDelimiter(StringRef TokenText) { RawStringFormatStyleManager::RawStringFormatStyleManager( const FormatStyle &CodeStyle) { for (const auto &RawStringFormat : CodeStyle.RawStringFormats) { - for (StringRef Delimiter : RawStringFormat.Delimiters) { - llvm::Optional<FormatStyle> LanguageStyle = - CodeStyle.GetLanguageStyle(RawStringFormat.Language); - if (!LanguageStyle) { - FormatStyle PredefinedStyle; - if (!getPredefinedStyle(RawStringFormat.BasedOnStyle, - RawStringFormat.Language, &PredefinedStyle)) { - PredefinedStyle = getLLVMStyle(); - PredefinedStyle.Language = RawStringFormat.Language; - } - LanguageStyle = PredefinedStyle; + llvm::Optional<FormatStyle> LanguageStyle = + CodeStyle.GetLanguageStyle(RawStringFormat.Language); + if (!LanguageStyle) { + FormatStyle PredefinedStyle; + if (!getPredefinedStyle(RawStringFormat.BasedOnStyle, + RawStringFormat.Language, &PredefinedStyle)) { + 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<FormatStyle> -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<FormatStyle> +RawStringFormatStyleManager::getEnclosingFunctionStyle( + StringRef EnclosingFunction) const { + auto It = EnclosingFunctionStyle.find(EnclosingFunction); + if (It == EnclosingFunctionStyle.end()) + return None; + return It->second; +} + ContinuationIndenter::ContinuationIndenter(const FormatStyle &Style, const AdditionalKeywords &Keywords, const SourceManager &SourceMgr, @@ -1437,6 +1449,26 @@ unsigned ContinuationIndenter::handleEndOfLine(const FormatToken &Current, return Penalty; } +// Returns the enclosing function name of a token, or the empty string if not +// found. +static StringRef getEnclosingFunctionName(const FormatToken &Current) { + // Look for: 'function(' or 'function<templates>(' 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<FormatStyle> ContinuationIndenter::getRawStringStyle(const FormatToken &Current, const LineState &State) { @@ -1445,7 +1477,10 @@ ContinuationIndenter::getRawStringStyle(const FormatToken &Current, 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 = getColumnLimit(State); diff --git a/clang/lib/Format/ContinuationIndenter.h b/clang/lib/Format/ContinuationIndenter.h index ded7bfab426..c257ded0ebf 100644 --- a/clang/lib/Format/ContinuationIndenter.h +++ b/clang/lib/Format/ContinuationIndenter.h @@ -38,10 +38,14 @@ class WhitespaceManager; struct RawStringFormatStyleManager { llvm::StringMap<FormatStyle> DelimiterStyle; + llvm::StringMap<FormatStyle> EnclosingFunctionStyle; RawStringFormatStyleManager(const FormatStyle &CodeStyle); - llvm::Optional<FormatStyle> get(StringRef Delimiter) const; + llvm::Optional<FormatStyle> getDelimiterStyle(StringRef Delimiter) const; + + llvm::Optional<FormatStyle> + getEnclosingFunctionStyle(StringRef EnclosingFunction) const; }; class ContinuationIndenter { diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index ebcf3ab4539..6ef38ad1692 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -457,6 +457,7 @@ template <> struct MappingTraits<FormatStyle::RawStringFormat> { static void mapping(IO &IO, FormatStyle::RawStringFormat &Format) { IO.mapOptional("Language", Format.Language); IO.mapOptional("Delimiters", Format.Delimiters); + IO.mapOptional("EnclosingFunctions", Format.EnclosingFunctions); IO.mapOptional("BasedOnStyle", Format.BasedOnStyle); } }; @@ -705,6 +706,12 @@ FormatStyle getGoogleStyle(FormatStyle::LanguageKind Language) { "textproto", "TEXTPROTO", }, + /*EnclosingFunctionNames=*/ + { + "EqualsProto", + "PARSE_TEXT_PROTO", + "ParseTextProto", + }, /*BasedOnStyle=*/"google", }}; GoogleStyle.SpacesBeforeTrailingComments = 2; |