From 18faea6ed629e1be965f58cd84b64382d30d7be7 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Fri, 21 Nov 2014 12:14:12 +0000 Subject: [PATCH] clang-format: [Java] Basic lambda support. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@222524 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/FormatToken.h | 3 +++ lib/Format/TokenAnnotator.cpp | 7 +++++++ unittests/Format/FormatTestJava.cpp | 15 +++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/lib/Format/FormatToken.h b/lib/Format/FormatToken.h index 0ef563b73a..7ced6eac40 100644 --- a/lib/Format/FormatToken.h +++ b/lib/Format/FormatToken.h @@ -48,6 +48,7 @@ enum TokenType { TT_InheritanceColon, TT_InlineASMColon, TT_JavaAnnotation, + TT_LambdaArrow, TT_LambdaLSquare, TT_LeadingJavaAnnotation, TT_LineComment, @@ -271,6 +272,8 @@ struct FormatToken { bool is(tok::TokenKind Kind) const { return Tok.is(Kind); } + bool is(TokenType TT) const { return Type == TT; } + bool is(const IdentifierInfo *II) const { return II && II == Tok.getIdentifierInfo(); } diff --git a/lib/Format/TokenAnnotator.cpp b/lib/Format/TokenAnnotator.cpp index 1afdb19b29..6d9006be30 100644 --- a/lib/Format/TokenAnnotator.cpp +++ b/lib/Format/TokenAnnotator.cpp @@ -786,6 +786,9 @@ private: Current.Type = TT_StartOfName; } else if (Current.is(tok::kw_auto)) { AutoFound = true; + } else if (Current.is(tok::arrow) && + Style.Language == FormatStyle::LK_Java) { + Current.Type = TT_LambdaArrow; } else if (Current.is(tok::arrow) && AutoFound && Line.MustBeDeclaration && Current.NestingLevel == 0) { Current.Type = TT_TrailingReturnArrow; @@ -1167,6 +1170,8 @@ private: else if (NextNonComment && NextNonComment->is(tok::colon) && NextNonComment->Type == TT_DictLiteral) return prec::Comma; + else if (Current->is(TT_LambdaArrow)) + return prec::Comma; else if (Current->is(tok::semi) || Current->Type == TT_InlineASMColon || Current->Type == TT_SelectorName || (Current->is(tok::comment) && NextNonComment && @@ -1701,6 +1706,8 @@ bool TokenAnnotator::spaceRequiredBefore(const AnnotatedLine &Line, if (Left.is(Keywords.kw_var)) return true; } else if (Style.Language == FormatStyle::LK_Java) { + if (Left.is(TT_LambdaArrow) || Right.is(TT_LambdaArrow)) + return true; if (Left.is(Keywords.kw_synchronized) && Right.is(tok::l_paren)) return Style.SpaceBeforeParens != FormatStyle::SBPO_Never; if (Left.isOneOf(tok::kw_static, tok::kw_public, tok::kw_private, diff --git a/unittests/Format/FormatTestJava.cpp b/unittests/Format/FormatTestJava.cpp index cb96756e3d..f6ab7d32cd 100644 --- a/unittests/Format/FormatTestJava.cpp +++ b/unittests/Format/FormatTestJava.cpp @@ -317,5 +317,20 @@ TEST_F(FormatTestJava, NeverAlignAfterReturn) { getStyleWithColumns(40)); } +TEST_F(FormatTestJava, FormatsLambdas) { + verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;"); + verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n" + " -> aaaaaaaaaa + bbbbbbbbbb;", + getStyleWithColumns(40)); + verifyFormat("Runnable someLambda = () -> DoSomething();"); + verifyFormat("Runnable someLambda = () -> {\n" + " DoSomething();\n" + "}"); + + verifyFormat("Runnable someLambda =\n" + " (int aaaaa) -> DoSomething(aaaaa);", + getStyleWithColumns(40)); +} + } // end namespace tooling } // end namespace clang -- 2.40.0