<p dir="ltr"><br>
On Jan 16, 2014 9:45 PM, "David Blaikie" <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
><br>
><br>
><br>
><br>
> On Thu, Jan 16, 2014 at 1:11 AM, Daniel Jasper <<a href="mailto:djasper@google.com">djasper@google.com</a>> wrote:<br>
>><br>
>> Author: djasper<br>
>> Date: Thu Jan 16 03:11:55 2014<br>
>> New Revision: 199368<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=199368&view=rev">http://llvm.org/viewvc/llvm-project?rev=199368&view=rev</a><br>
>> Log:<br>
>> clang-format: Enable formatting of lambdas with explicit return type.<br>
>><br>
>> So clang-format can now format:<br>
>><br>
>>   int c = []()->int { return 2; }();<br>
>>   int c = []()->vector<int> { return { 2 }; }();<br>
>><br>
>> Modified:<br>
>>     cfe/trunk/lib/Format/FormatToken.cpp<br>
>>     cfe/trunk/lib/Format/FormatToken.h<br>
>>     cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
>>     cfe/trunk/lib/Format/UnwrappedLineParser.cpp<br>
>>     cfe/trunk/unittests/Format/FormatTest.cpp<br>
>><br>
>> Modified: cfe/trunk/lib/Format/FormatToken.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.cpp?rev=199368&r1=199367&r2=199368&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.cpp?rev=199368&r1=199367&r2=199368&view=diff</a><br>

>> ==============================================================================<br>
>> --- cfe/trunk/lib/Format/FormatToken.cpp (original)<br>
>> +++ cfe/trunk/lib/Format/FormatToken.cpp Thu Jan 16 03:11:55 2014<br>
>> @@ -22,6 +22,36 @@<br>
>>  namespace clang {<br>
>>  namespace format {<br>
>><br>
>> +// FIXME: This is copy&pasted from Sema. Put it in a common place and remove<br>
>> +// duplication.<br>
>> +bool FormatToken::isSimpleTypeSpecifier() const {<br>
>> +  switch (Tok.getKind()) {<br>
>> +  case tok::kw_short:<br>
>> +  case tok::kw_long:<br>
>> +  case tok::kw___int64:<br>
>> +  case tok::kw___int128:<br>
>> +  case tok::kw_signed:<br>
>> +  case tok::kw_unsigned:<br>
>> +  case tok::kw_void:<br>
>> +  case tok::kw_char:<br>
>> +  case tok::kw_int:<br>
>> +  case tok::kw_half:<br>
>> +  case tok::kw_float:<br>
>> +  case tok::kw_double:<br>
>> +  case tok::kw_wchar_t:<br>
>> +  case tok::kw_bool:<br>
>> +  case tok::kw___underlying_type:<br>
>> +  case tok::annot_typename:<br>
>> +  case tok::kw_char16_t:<br>
>> +  case tok::kw_char32_t:<br>
>> +  case tok::kw_typeof:<br>
>> +  case tok::kw_decltype:<br>
>> +    return true;<br>
>> +  default:<br>
>> +    return false;<br>
>> +  }<br>
>> +}<br>
>> +<br>
>>  TokenRole::~TokenRole() {}<br>
>><br>
>>  void TokenRole::precomputeFormattingInfos(const FormatToken *Token) {}<br>
>><br>
>> Modified: cfe/trunk/lib/Format/FormatToken.h<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.h?rev=199368&r1=199367&r2=199368&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/FormatToken.h?rev=199368&r1=199367&r2=199368&view=diff</a><br>

>> ==============================================================================<br>
>> --- cfe/trunk/lib/Format/FormatToken.h (original)<br>
>> +++ cfe/trunk/lib/Format/FormatToken.h Thu Jan 16 03:11:55 2014<br>
>> @@ -280,6 +280,9 @@ struct FormatToken {<br>
>>             (!ColonRequired || (Next && Next->is(tok::colon)));<br>
>>    }<br>
>><br>
>> +  /// \brief Determine whether the token is a simple-type-specifier.<br>
>> +  bool isSimpleTypeSpecifier() const;<br>
>> +<br>
>>    bool isObjCAccessSpecifier() const {<br>
>>      return is(tok::at) && Next && (Next->isObjCAtKeyword(tok::objc_public) ||<br>
>>                                     Next->isObjCAtKeyword(tok::objc_protected) ||<br>
>><br>
>> Modified: cfe/trunk/lib/Format/TokenAnnotator.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=199368&r1=199367&r2=199368&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/TokenAnnotator.cpp?rev=199368&r1=199367&r2=199368&view=diff</a><br>

>> ==============================================================================<br>
>> --- cfe/trunk/lib/Format/TokenAnnotator.cpp (original)<br>
>> +++ cfe/trunk/lib/Format/TokenAnnotator.cpp Thu Jan 16 03:11:55 2014<br>
>> @@ -697,7 +697,7 @@ private:<br>
>>          bool ParensAreType = !Current.Previous ||<br>
>>                               Current.Previous->Type == TT_PointerOrReference ||<br>
>>                               Current.Previous->Type == TT_TemplateCloser ||<br>
>> -                             isSimpleTypeSpecifier(*Current.Previous);<br>
>> +                             Current.Previous->isSimpleTypeSpecifier();<br>
>>          bool ParensCouldEndDecl =<br>
>>              Current.Next &&<br>
>>              Current.Next->isOneOf(tok::equal, tok::semi, tok::l_brace);<br>
>> @@ -778,7 +778,7 @@ private:<br>
>><br>
>>      return (!IsPPKeyword && PreviousNotConst->is(tok::identifier)) ||<br>
>>             PreviousNotConst->Type == TT_PointerOrReference ||<br>
>> -           isSimpleTypeSpecifier(*PreviousNotConst);<br>
>> +           PreviousNotConst->isSimpleTypeSpecifier();<br>
>>    }<br>
>><br>
>>    /// \brief Return the type of the given token assuming it is * or &.<br>
>> @@ -853,36 +853,6 @@ private:<br>
>>      return TT_UnaryOperator;<br>
>>    }<br>
>><br>
>> -  // FIXME: This is copy&pasted from Sema. Put it in a common place and remove<br>
>> -  // duplication.<br>
>> -  /// \brief Determine whether the token kind starts a simple-type-specifier.<br>
>> -  bool isSimpleTypeSpecifier(const FormatToken &Tok) const {<br>
>> -    switch (Tok.Tok.getKind()) {<br>
>> -    case tok::kw_short:<br>
>> -    case tok::kw_long:<br>
>> -    case tok::kw___int64:<br>
>> -    case tok::kw___int128:<br>
>> -    case tok::kw_signed:<br>
>> -    case tok::kw_unsigned:<br>
>> -    case tok::kw_void:<br>
>> -    case tok::kw_char:<br>
>> -    case tok::kw_int:<br>
>> -    case tok::kw_half:<br>
>> -    case tok::kw_float:<br>
>> -    case tok::kw_double:<br>
>> -    case tok::kw_wchar_t:<br>
>> -    case tok::kw_bool:<br>
>> -    case tok::kw___underlying_type:<br>
>> -    case tok::annot_typename:<br>
>> -    case tok::kw_char16_t:<br>
>> -    case tok::kw_char32_t:<br>
>> -    case tok::kw_typeof:<br>
>> -    case tok::kw_decltype:<br>
>> -      return true;<br>
>> -    default:<br>
>> -      return false;<br>
>> -    }<br>
>> -  }<br>
>><br>
>>    SmallVector<Context, 8> Contexts;<br>
>><br>
>><br>
>> Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=199368&r1=199367&r2=199368&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=199368&r1=199367&r2=199368&view=diff</a><br>

>> ==============================================================================<br>
>> --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original)<br>
>> +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Thu Jan 16 03:11:55 2014<br>
>> @@ -762,15 +762,22 @@ bool UnwrappedLineParser::tryToParseLamb<br>
>>    if (!tryToParseLambdaIntroducer())<br>
>>      return false;<br>
>><br>
>> -  while (FormatTok->isNot(tok::l_brace)) {<br>
>> +  while (FormatTok && FormatTok->isNot(tok::l_brace)) {<br>
>> +    if (FormatTok->isSimpleTypeSpecifier()) {<br>
>> +      nextToken();<br>
>> +      continue;<br>
>> +    }<br>
>>      switch (FormatTok->Tok.getKind()) {<br>
>>      case tok::l_brace:<br>
>>        break;<br>
>>      case tok::l_paren:<br>
>>        parseParens();<br>
>>        break;<br>
>> +    case tok::less:<br>
>> +    case tok::greater:<br>
>>      case tok::identifier:<br>
>>      case tok::kw_mutable:<br>
>> +    case tok::arrow:<br>
>>        nextToken();<br>
>>        break;<br>
>>      default:<br>
>> @@ -956,7 +963,6 @@ void UnwrappedLineParser::parseSquare()<br>
>>    if (tryToParseLambda())<br>
>>      return;<br>
>>    do {<br>
>> -    // llvm::errs() << FormatTok->Tok.getName() << "\n";<br>
>>      switch (FormatTok->Tok.getKind()) {<br>
>>      case tok::l_paren:<br>
>>        parseParens();<br>
>><br>
>> Modified: cfe/trunk/unittests/Format/FormatTest.cpp<br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=199368&r1=199367&r2=199368&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=199368&r1=199367&r2=199368&view=diff</a><br>

>> ==============================================================================<br>
>> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)<br>
>> +++ cfe/trunk/unittests/Format/FormatTest.cpp Thu Jan 16 03:11:55 2014<br>
>> @@ -7890,6 +7890,10 @@ TEST_F(FormatTest, FormatsLambdas) {<br>
>>                 "        [&](int, int) { return 1; });\n"<br>
>>                 "}\n");<br>
>><br>
>> +  // Lambdas with return types.<br>
>> +  verifyFormat("int c = []()->int { return 2; }();\n");<br>
><br>
><br>
> 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:<br>
><br>
> auto func(T x, T y) -> decltype(x + y);<br>
><br>
> but I realize lambdas are intended to be fairly compact so the extra whitespace may be undesirable. </p>
<p dir="ltr">I don't know.. But parsing this correctly seems like a good step.. </p>
<p dir="ltr">>  <br>
>><br>
>> +  verifyFormat("int c = []()->vector<int> { return { 2 }; }();\n");<br>
><br>
><br>
> Do we put spaces around {} init generally? That seems uncommon.</p>
<p dir="ltr">Controlled by Cpp11BracedListStyle..</p>
<p dir="ltr">>  <br>
>><br>
>> +<br>
>>    // Not lambdas.<br>
>>    verifyFormat("constexpr char hello[]{ \"hello\" };");<br>
>>    verifyFormat("double &operator[](int i) { return 0; }\n"<br>
>><br>
>><br>
>> _______________________________________________<br>
>> cfe-commits mailing list<br>
>> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
><br>
><br>
</p>