From b58b524e266527ec4890326ec650716fdfae166c Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 9 Jan 2015 23:25:06 +0000 Subject: [PATCH] clang-format: [Java] Support formatting qualified annotations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225559 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/ContinuationIndenter.cpp | 11 ++++--- lib/Format/TokenAnnotator.cpp | 47 ++++++++++++++++++----------- unittests/Format/FormatTestJava.cpp | 10 ++++++ 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index 53876bab58..f05471e712 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -93,8 +93,9 @@ bool ContinuationIndenter::canBreak(const LineState &State) { const FormatToken &Current = *State.NextToken; const FormatToken &Previous = *Current.Previous; assert(&Previous == Current.Previous); - if (!Current.CanBreakBefore && !(State.Stack.back().BreakBeforeClosingBrace && - Current.closesBlockTypeList(Style))) + if (!Current.CanBreakBefore && + !(State.Stack.back().BreakBeforeClosingBrace && + Current.closesBlockTypeList(Style))) return false; // The opening "{" of a braced list has to be on the same line as the first // element if it is nested in another braced init list or function call. @@ -196,7 +197,6 @@ bool ContinuationIndenter::mustBreak(const LineState &State) { return true; } - // Same as above, but for the first "<<" operator. if (Current.is(tok::lessless) && Current.isNot(TT_OverloadedOperator) && State.Stack.back().BreakBeforeParameter && @@ -209,12 +209,13 @@ bool ContinuationIndenter::mustBreak(const LineState &State) { if (Current.NestingLevel == 0 && !Current.isTrailingComment()) { if (Previous.ClosesTemplateDeclaration) return true; - if (Previous.is(TT_LeadingJavaAnnotation) && Current.isNot(tok::l_paren)) + if (Previous.is(TT_LeadingJavaAnnotation) && Current.isNot(tok::l_paren) && + Current.isNot(TT_LeadingJavaAnnotation)) return true; } // If the return type spans multiple lines, wrap before the function name. - if (Current.isOneOf(TT_FunctionDeclarationName ,tok::kw_operator) && + if (Current.isOneOf(TT_FunctionDeclarationName, tok::kw_operator) && State.Stack.back().BreakBeforeParameter) return true; diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 12756f05d9..6ad1ad2cc7 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -305,7 +305,7 @@ private: (Left->is(TT_ArraySubscriptLSquare) || (Left->is(TT_ObjCMethodExpr) && !ColonFound))) Left->Type = TT_ArrayInitializerLSquare; - FormatToken* Tok = CurrentToken; + FormatToken *Tok = CurrentToken; if (!consumeToken()) return false; updateParameterCount(Left, Tok); @@ -861,6 +861,11 @@ private: if (PreviousNoComment && PreviousNoComment->isOneOf(tok::comma, tok::l_brace)) Current.Type = TT_DesignatedInitializerPeriod; + else if (Style.Language == FormatStyle::LK_Java && Current.Previous && + Current.Previous->isOneOf(TT_JavaAnnotation, + TT_LeadingJavaAnnotation)) { + Current.Type = Current.Previous->Type; + } } else if (Current.isOneOf(tok::identifier, tok::kw_const) && Current.Previous && !Current.Previous->isOneOf(tok::equal, tok::at) && @@ -868,15 +873,20 @@ private: // Line.MightBeFunctionDecl can only be true after the parentheses of a // function declaration have been found. Current.Type = TT_TrailingAnnotation; - } else if (Style.Language == FormatStyle::LK_Java && Current.Previous && - Current.Previous->is(tok::at) && - Current.isNot(Keywords.kw_interface)) { - const FormatToken &AtToken = *Current.Previous; - const FormatToken *Previous = AtToken.getPreviousNonComment(); - if (!Previous || Previous->is(TT_LeadingJavaAnnotation)) - Current.Type = TT_LeadingJavaAnnotation; - else - Current.Type = TT_JavaAnnotation; + } else if (Style.Language == FormatStyle::LK_Java && Current.Previous) { + if (Current.Previous->is(tok::at) && + Current.isNot(Keywords.kw_interface)) { + const FormatToken &AtToken = *Current.Previous; + const FormatToken *Previous = AtToken.getPreviousNonComment(); + if (!Previous || Previous->is(TT_LeadingJavaAnnotation)) + Current.Type = TT_LeadingJavaAnnotation; + else + Current.Type = TT_JavaAnnotation; + } else if (Current.Previous->is(tok::period) && + Current.Previous->isOneOf(TT_JavaAnnotation, + TT_LeadingJavaAnnotation)) { + Current.Type = Current.Previous->Type; + } } } @@ -1281,8 +1291,8 @@ private: } // end anonymous namespace -void -TokenAnnotator::setCommentLineLevels(SmallVectorImpl &Lines) { +void TokenAnnotator::setCommentLineLevels( + SmallVectorImpl &Lines) { const AnnotatedLine *NextNonCommentLine = nullptr; for (SmallVectorImpl::reverse_iterator I = Lines.rbegin(), E = Lines.rend(); @@ -1408,9 +1418,9 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { Current->MustBreakBefore = Current->MustBreakBefore || mustBreakBefore(Line, *Current); - if (Style.AlwaysBreakAfterDefinitionReturnType && - InFunctionDecl && Current->is(TT_FunctionDeclarationName) && - !Line.Last->isOneOf(tok::semi, tok::comment)) // Only for definitions. + if (Style.AlwaysBreakAfterDefinitionReturnType && InFunctionDecl && + Current->is(TT_FunctionDeclarationName) && + !Line.Last->isOneOf(tok::semi, tok::comment)) // Only for definitions. // FIXME: Line.Last points to other characters than tok::semi // and tok::lbrace. Current->MustBreakBefore = true; @@ -1423,7 +1433,7 @@ void TokenAnnotator::calculateFormattingInformation(AnnotatedLine &Line) { ChildSize = LastOfChild.isTrailingComment() ? Style.ColumnLimit : LastOfChild.TotalLength + 1; } - const FormatToken *Prev= Current->Previous; + const FormatToken *Prev = Current->Previous; if (Current->MustBreakBefore || Prev->Children.size() > 1 || (Prev->Children.size() == 1 && Prev->Children[0]->First->MustBreakBefore) || @@ -1612,7 +1622,7 @@ bool TokenAnnotator::spaceRequiredBetween(const AnnotatedLine &Line, if (Left.is(tok::l_paren) && Right.is(tok::r_paren)) return Style.SpaceInEmptyParentheses; if (Left.is(tok::l_paren) || Right.is(tok::r_paren)) - return (Right.is(TT_CastRParen )|| + return (Right.is(TT_CastRParen) || (Left.MatchingParen && Left.MatchingParen->is(TT_CastRParen))) ? Style.SpacesInCStyleCastParentheses : Style.SpacesInParentheses; @@ -1897,7 +1907,8 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, Left.NestingLevel == 0) return true; } else if (Style.Language == FormatStyle::LK_Java) { - if (Left.is(TT_LeadingJavaAnnotation) && Right.isNot(tok::l_paren) && + if (Left.is(TT_LeadingJavaAnnotation) && + Right.isNot(TT_LeadingJavaAnnotation) && Right.isNot(tok::l_paren) && Line.Last->is(tok::l_brace)) return true; if (Right.is(tok::plus) && Left.is(tok::string_literal) && Right.Next && diff --git a/unittests/Format/FormatTestJava.cpp b/unittests/Format/FormatTestJava.cpp index 99b25dc734..b187206e5c 100644 --- a/unittests/Format/FormatTestJava.cpp +++ b/unittests/Format/FormatTestJava.cpp @@ -242,6 +242,9 @@ TEST_F(FormatTestJava, Annotations) { verifyFormat("@Override // comment\n" "@Nullable\n" "public String getNameIfPresent() {}"); + verifyFormat("@java.lang.Override // comment\n" + "@Nullable\n" + "public String getNameIfPresent() {}"); verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" "public void doSomething() {}"); @@ -255,6 +258,7 @@ TEST_F(FormatTestJava, Annotations) { "});"); verifyFormat("void SomeFunction(@Nullable String something) {}"); + verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}"); verifyFormat("@Partial @Mock DataLoader loader;"); verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" @@ -262,10 +266,16 @@ TEST_F(FormatTestJava, Annotations) { verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" "private static final long something = 0L;"); + verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n" + "private static final long something = 0L;"); verifyFormat("@Mock\n" "DataLoader loooooooooooooooooooooooader =\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", getStyleWithColumns(60)); + verifyFormat("@org.llvm.QualifiedMock\n" + "DataLoader loooooooooooooooooooooooader =\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", + getStyleWithColumns(60)); } TEST_F(FormatTestJava, Generics) { -- 2.40.0