r199368 - clang-format: Enable formatting of lambdas with explicit return type.
David Blaikie
dblaikie at gmail.com
Thu Jan 16 12:45:32 PST 2014
On Thu, Jan 16, 2014 at 1:11 AM, Daniel Jasper <djasper at google.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140116/4a6e9a9e/attachment.html>
More information about the cfe-commits
mailing list