From: Daniel Jasper Date: Tue, 21 Oct 2014 08:24:18 +0000 (+0000) Subject: clang-format: [Java] Wrap after each function annotation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ce4e238c2036135b6d7416afebba983ed608062d;p=clang clang-format: [Java] Wrap after each function annotation. Before: @Override public String toString() { .. } After: @Override public String toString() { .. } git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@220274 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp index ead1da99c2..4c93c7f548 100644 --- a/lib/Format/ContinuationIndenter.cpp +++ b/lib/Format/ContinuationIndenter.cpp @@ -458,6 +458,7 @@ unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State, !PreviousNonComment->isOneOf(tok::comma, tok::semi) && PreviousNonComment->Type != TT_TemplateCloser && PreviousNonComment->Type != TT_BinaryOperator && + PreviousNonComment->Type != TT_JavaAnnotation && Current.Type != TT_BinaryOperator && !PreviousNonComment->opensScope()) State.Stack.back().BreakBeforeParameter = true; @@ -533,7 +534,8 @@ unsigned ContinuationIndenter::getNewLineColumn(const LineState &State) { if (Previous.is(tok::comma) && State.Stack.back().VariablePos != 0) return State.Stack.back().VariablePos; if ((PreviousNonComment && (PreviousNonComment->ClosesTemplateDeclaration || - PreviousNonComment->Type == TT_AttributeParen)) || + PreviousNonComment->Type == TT_AttributeParen || + PreviousNonComment->Type == TT_JavaAnnotation)) || (!Style.IndentWrappedFunctionNames && (NextNonComment->is(tok::kw_operator) || NextNonComment->Type == TT_FunctionDeclarationName))) diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index dc2c8a466e..425a7c8364 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -46,6 +46,7 @@ enum TokenType { TT_ImplicitStringLiteral, TT_InheritanceColon, TT_InlineASMColon, + TT_JavaAnnotation, TT_LambdaLSquare, TT_LineComment, TT_ObjCBlockLBrace, diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 7fbd2f29d5..ce3d899900 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -826,6 +826,9 @@ 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.Type = TT_JavaAnnotation; } } } @@ -1787,6 +1790,9 @@ bool TokenAnnotator::mustBreakBefore(const AnnotatedLine &Line, if (Right.is(tok::char_constant) && Left.is(tok::plus) && Left.Previous && Left.Previous->is(tok::char_constant)) return true; + } else if (Style.Language == FormatStyle::LK_Java) { + if (Left.Type == TT_JavaAnnotation && Line.MightBeFunctionDecl) + return true; } return false; diff --git a/unittests/Format/FormatTestJava.cpp b/unittests/Format/FormatTestJava.cpp index 2bca3bbe89..18d945d0af 100644 --- a/unittests/Format/FormatTestJava.cpp +++ b/unittests/Format/FormatTestJava.cpp @@ -64,5 +64,14 @@ TEST_F(FormatTestJava, ThrowsDeclarations) { " throws LooooooooooooooooooooooooooooongException {}"); } +TEST_F(FormatTestJava, Annotations) { + verifyFormat("@Override\n" + "public String toString() {\n}"); + verifyFormat("@Override\n" + "@Nullable\n" + "public String getNameIfPresent() {\n}"); + verifyFormat("@Partial @Mock DataLoader loader;"); +} + } // end namespace tooling } // end namespace clang