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