On Thu, Jan 16, 2014 at 1:11 AM, Daniel Jasper <[email protected]> wrote:
> Author: djasper > Date: Thu Jan 16 03:11:55 2014 > New Revision: 199368 > > URL: http://llvm.org/viewvc/llvm-project?rev=199368&view=rev > Log: > clang-format: Enable formatting of lambdas with explicit return type. > > So clang-format can now format: > > int c = []()->int { return 2; }(); > int c = []()->vector<int> { return { 2 }; }(); > > Modified: > cfe/trunk/lib/Format/FormatToken.cpp > cfe/trunk/lib/Format/FormatToken.h > cfe/trunk/lib/Format/TokenAnnotator.cpp > cfe/trunk/lib/Format/UnwrappedLineParser.cpp > cfe/trunk/unittests/Format/FormatTest.cpp > > Modified: cfe/trunk/lib/Format/FormatToken.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.cpp?rev=199368&r1=199367&r2=199368&view=diff > > ============================================================================== > --- cfe/trunk/lib/Format/FormatToken.cpp (original) > +++ cfe/trunk/lib/Format/FormatToken.cpp Thu Jan 16 03:11:55 2014 > @@ -22,6 +22,36 @@ > namespace clang { > namespace format { > > +// FIXME: This is copy&pasted from Sema. Put it in a common place and > remove > +// duplication. > +bool FormatToken::isSimpleTypeSpecifier() const { > + switch (Tok.getKind()) { > + case tok::kw_short: > + case tok::kw_long: > + case tok::kw___int64: > + case tok::kw___int128: > + case tok::kw_signed: > + case tok::kw_unsigned: > + case tok::kw_void: > + case tok::kw_char: > + case tok::kw_int: > + case tok::kw_half: > + case tok::kw_float: > + case tok::kw_double: > + case tok::kw_wchar_t: > + case tok::kw_bool: > + case tok::kw___underlying_type: > + case tok::annot_typename: > + case tok::kw_char16_t: > + case tok::kw_char32_t: > + case tok::kw_typeof: > + case tok::kw_decltype: > + return true; > + default: > + return false; > + } > +} > + > TokenRole::~TokenRole() {} > > void TokenRole::precomputeFormattingInfos(const FormatToken *Token) {} > > Modified: cfe/trunk/lib/Format/FormatToken.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.h?rev=199368&r1=199367&r2=199368&view=diff > > ============================================================================== > --- cfe/trunk/lib/Format/FormatToken.h (original) > +++ cfe/trunk/lib/Format/FormatToken.h Thu Jan 16 03:11:55 2014 > @@ -280,6 +280,9 @@ struct FormatToken { > (!ColonRequired || (Next && Next->is(tok::colon))); > } > > + /// \brief Determine whether the token is a simple-type-specifier. > + bool isSimpleTypeSpecifier() const; > + > bool isObjCAccessSpecifier() const { > return is(tok::at) && Next && > (Next->isObjCAtKeyword(tok::objc_public) || > > Next->isObjCAtKeyword(tok::objc_protected) || > > Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=199368&r1=199367&r2=199368&view=diff > > ============================================================================== > --- cfe/trunk/lib/Format/TokenAnnotator.cpp (original) > +++ cfe/trunk/lib/Format/TokenAnnotator.cpp Thu Jan 16 03:11:55 2014 > @@ -697,7 +697,7 @@ private: > bool ParensAreType = !Current.Previous || > Current.Previous->Type == > TT_PointerOrReference || > Current.Previous->Type == TT_TemplateCloser > || > - isSimpleTypeSpecifier(*Current.Previous); > + Current.Previous->isSimpleTypeSpecifier(); > bool ParensCouldEndDecl = > Current.Next && > Current.Next->isOneOf(tok::equal, tok::semi, tok::l_brace); > @@ -778,7 +778,7 @@ private: > > return (!IsPPKeyword && PreviousNotConst->is(tok::identifier)) || > PreviousNotConst->Type == TT_PointerOrReference || > - isSimpleTypeSpecifier(*PreviousNotConst); > + PreviousNotConst->isSimpleTypeSpecifier(); > } > > /// \brief Return the type of the given token assuming it is * or &. > @@ -853,36 +853,6 @@ private: > return TT_UnaryOperator; > } > > - // FIXME: This is copy&pasted from Sema. Put it in a common place and > remove > - // duplication. > - /// \brief Determine whether the token kind starts a > simple-type-specifier. > - bool isSimpleTypeSpecifier(const FormatToken &Tok) const { > - switch (Tok.Tok.getKind()) { > - case tok::kw_short: > - case tok::kw_long: > - case tok::kw___int64: > - case tok::kw___int128: > - case tok::kw_signed: > - case tok::kw_unsigned: > - case tok::kw_void: > - case tok::kw_char: > - case tok::kw_int: > - case tok::kw_half: > - case tok::kw_float: > - case tok::kw_double: > - case tok::kw_wchar_t: > - case tok::kw_bool: > - case tok::kw___underlying_type: > - case tok::annot_typename: > - case tok::kw_char16_t: > - case tok::kw_char32_t: > - case tok::kw_typeof: > - case tok::kw_decltype: > - return true; > - default: > - return false; > - } > - } > > SmallVector<Context, 8> Contexts; > > > Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=199368&r1=199367&r2=199368&view=diff > > ============================================================================== > --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original) > +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Thu Jan 16 03:11:55 2014 > @@ -762,15 +762,22 @@ bool UnwrappedLineParser::tryToParseLamb > if (!tryToParseLambdaIntroducer()) > return false; > > - while (FormatTok->isNot(tok::l_brace)) { > + while (FormatTok && FormatTok->isNot(tok::l_brace)) { > + if (FormatTok->isSimpleTypeSpecifier()) { > + nextToken(); > + continue; > + } > switch (FormatTok->Tok.getKind()) { > case tok::l_brace: > break; > case tok::l_paren: > parseParens(); > break; > + case tok::less: > + case tok::greater: > case tok::identifier: > case tok::kw_mutable: > + case tok::arrow: > nextToken(); > break; > default: > @@ -956,7 +963,6 @@ void UnwrappedLineParser::parseSquare() > if (tryToParseLambda()) > return; > do { > - // llvm::errs() << FormatTok->Tok.getName() << "\n"; > switch (FormatTok->Tok.getKind()) { > case tok::l_paren: > parseParens(); > > Modified: cfe/trunk/unittests/Format/FormatTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=199368&r1=199367&r2=199368&view=diff > > ============================================================================== > --- cfe/trunk/unittests/Format/FormatTest.cpp (original) > +++ cfe/trunk/unittests/Format/FormatTest.cpp Thu Jan 16 03:11:55 2014 > @@ -7890,6 +7890,10 @@ TEST_F(FormatTest, FormatsLambdas) { > " [&](int, int) { return 1; });\n" > "}\n"); > > + // Lambdas with return types. > + verifyFormat("int c = []()->int { return 2; }();\n"); > Is this the right formatting here? I would've expected spaces around the "->" as I would for a trailing return type on a non-lambda: auto func(T x, T y) -> decltype(x + y); but I realize lambdas are intended to be fairly compact so the extra whitespace may be undesirable. > + verifyFormat("int c = []()->vector<int> { return { 2 }; }();\n"); > Do we put spaces around {} init generally? That seems uncommon. > + > // Not lambdas. > verifyFormat("constexpr char hello[]{ \"hello\" };"); > verifyFormat("double &operator[](int i) { return 0; }\n" > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
