diff options
| author | Krasimir Georgiev <krasimir@google.com> | 2018-02-13 10:20:39 +0000 |
|---|---|---|
| committer | Krasimir Georgiev <krasimir@google.com> | 2018-02-13 10:20:39 +0000 |
| commit | 4e290648ae2a2b7703fc69d037f356ecfe36f238 (patch) | |
| tree | 9a27b1c9f5869a304124a2ad25bca287c0d10b83 /clang/lib/Format | |
| parent | 1f95ef1815c9b6a961811ec78e44d14b277abdd3 (diff) | |
| download | bcm5719-llvm-4e290648ae2a2b7703fc69d037f356ecfe36f238.tar.gz bcm5719-llvm-4e290648ae2a2b7703fc69d037f356ecfe36f238.zip | |
[clang-format] Support text proto extensions
Summary:
This adds support for text proto extensions, like:
```
msg {
[type.type/ext] {
key: value
}
}
```
Reviewers: djasper
Reviewed By: djasper
Subscribers: klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D43180
llvm-svn: 324995
Diffstat (limited to 'clang/lib/Format')
| -rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Format/FormatToken.h | 1 | ||||
| -rw-r--r-- | clang/lib/Format/TokenAnnotator.cpp | 44 |
3 files changed, 41 insertions, 6 deletions
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 64d8bb7ed80..d28254d8067 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -943,6 +943,8 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) { if (Previous.is(tok::r_paren) && !Current.isBinaryOperator() && !Current.isOneOf(tok::colon, tok::comment)) return ContinuationIndent; + if (Current.is(TT_ProtoExtensionLSquare)) + return State.Stack.back().Indent; if (State.Stack.back().Indent == State.FirstIndent && PreviousNonComment && PreviousNonComment->isNot(tok::r_brace)) // Ensure that we fall back to the continuation indent width instead of diff --git a/clang/lib/Format/FormatToken.h b/clang/lib/Format/FormatToken.h index 79e8df95e78..6a558875619 100644 --- a/clang/lib/Format/FormatToken.h +++ b/clang/lib/Format/FormatToken.h @@ -88,6 +88,7 @@ namespace format { TYPE(TemplateCloser) \ TYPE(TemplateOpener) \ TYPE(TemplateString) \ + TYPE(ProtoExtensionLSquare) \ TYPE(TrailingAnnotation) \ TYPE(TrailingReturnArrow) \ TYPE(TrailingUnaryOperator) \ diff --git a/clang/lib/Format/TokenAnnotator.cpp b/clang/lib/Format/TokenAnnotator.cpp index 78c69d1e0fa..248e2b58501 100644 --- a/clang/lib/Format/TokenAnnotator.cpp +++ b/clang/lib/Format/TokenAnnotator.cpp @@ -368,12 +368,35 @@ private: Parent->is(TT_TemplateCloser)) { Left->Type = TT_ArraySubscriptLSquare; } else if (Style.Language == FormatStyle::LK_Proto || - (!CppArrayTemplates && Parent && - Parent->isOneOf(TT_BinaryOperator, TT_TemplateCloser, tok::at, - tok::comma, tok::l_paren, tok::l_square, - tok::question, tok::colon, tok::kw_return, - // Should only be relevant to JavaScript: - tok::kw_default))) { + Style.Language == FormatStyle::LK_TextProto) { + // Square braces in LK_Proto can either be message field attributes: + // + // optional Aaa aaa = 1 [ + // (aaa) = aaa + // ]; + // + // or text proto extensions (in options): + // + // option (Aaa.options) = { + // [type.type/type] { + // key: value + // } + // } + // + // In the first case we want to spread the contents inside the square + // braces; in the second we want to keep them inline. + Left->Type = TT_ArrayInitializerLSquare; + if (!Left->endsSequence(tok::l_square, tok::numeric_constant, + tok::equal)) { + Left->Type = TT_ProtoExtensionLSquare; + BindingIncrease = 10; + } + } else if (!CppArrayTemplates && Parent && + Parent->isOneOf(TT_BinaryOperator, TT_TemplateCloser, tok::at, + tok::comma, tok::l_paren, tok::l_square, + tok::question, tok::colon, tok::kw_return, + // Should only be relevant to JavaScript: + tok::kw_default)) { Left->Type = TT_ArrayInitializerLSquare; } else { BindingIncrease = 10; @@ -2396,6 +2419,12 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, return true; if (Right.isOneOf(tok::l_brace, tok::less) && Left.is(TT_SelectorName)) return true; + // Slashes occur in text protocol extension syntax: [type/type] { ... }. + if (Left.is(tok::slash) || Right.is(tok::slash)) + return false; + if (Left.MatchingParen && Left.MatchingParen->is(TT_ProtoExtensionLSquare) && + Right.isOneOf(tok::l_brace, tok::less)) + return !Style.Cpp11BracedListStyle; } else if (Style.Language == FormatStyle::LK_JavaScript) { if (Left.is(TT_JsFatArrow)) return true; @@ -2732,6 +2761,9 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, (Line.Last->is(tok::l_brace) || Style.BreakAfterJavaFieldAnnotations)) return true; + if (Right.is(TT_ProtoExtensionLSquare)) + return true; + return false; } |

