r183009 - Improve clang-format's error recovery.

Daniel Jasper djasper at google.com
Mon Jun 3 08:41:59 PDT 2013


I don't understand that. '{' would not be an error ..


On Mon, Jun 3, 2013 at 1:34 PM, Manuel Klimek <klimek at google.com> wrote:

> On Fri, May 31, 2013 at 4:56 PM, Daniel Jasper <djasper at google.com> wrote:
>
>> Author: djasper
>> Date: Fri May 31 09:56:29 2013
>> New Revision: 183009
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=183009&view=rev
>> Log:
>> Improve clang-format's error recovery.
>>
>> If a "}" is found inside parenthesis, this is probably a case of
>> missing parenthesis. This enables continuing to format after stuff code
>> like:
>>
>> class A {
>>   void f(
>> };
>> ..
>>
>> Modified:
>>     cfe/trunk/lib/Format/UnwrappedLineParser.cpp
>>     cfe/trunk/unittests/Format/FormatTest.cpp
>>
>> Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=183009&r1=183008&r2=183009&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original)
>> +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Fri May 31 09:56:29 2013
>> @@ -45,6 +45,7 @@ public:
>>      else
>>        Line.MustBeDeclaration = true;
>>    }
>> +
>>  private:
>>    UnwrappedLine &Line;
>>    std::vector<bool> &Stack;
>> @@ -81,9 +82,7 @@ public:
>>      return Token;
>>    }
>>
>> -  virtual unsigned getPosition() {
>> -    return PreviousTokenSource->getPosition();
>> -  }
>> +  virtual unsigned getPosition() { return
>> PreviousTokenSource->getPosition(); }
>>
>>    virtual FormatToken *setPosition(unsigned Position) {
>>      Token = PreviousTokenSource->setPosition(Position);
>> @@ -279,7 +278,7 @@ void UnwrappedLineParser::calculateBrace
>>      case tok::kw_for:
>>      case tok::kw_switch:
>>      case tok::kw_try:
>> -      if (!LBraceStack.empty())
>> +      if (!LBraceStack.empty())
>>          LBraces[LBraceStack.back()] = BS_Block;
>>        break;
>>      default:
>> @@ -386,9 +385,7 @@ void UnwrappedLineParser::parsePPElse()
>>    parsePPUnknown();
>>  }
>>
>> -void UnwrappedLineParser::parsePPElIf() {
>> -  parsePPElse();
>> -}
>> +void UnwrappedLineParser::parsePPElIf() { parsePPElse(); }
>>
>>  void UnwrappedLineParser::parsePPEndIf() {
>>    if (!PPStack.empty())
>> @@ -700,15 +697,21 @@ void UnwrappedLineParser::parseParens()
>>      case tok::r_paren:
>>        nextToken();
>>        return;
>> +    case tok::r_brace:
>> +      // A "}" inside parenthesis is an error if there wasn't a matching
>> "{".
>> +      return;
>>      case tok::l_brace: {
>>        if (!tryToParseBracedList()) {
>>          nextToken();
>> -        ScopedLineState LineState(*this);
>> -        ScopedDeclarationState DeclarationState(*Line,
>> DeclarationScopeStack,
>> -                                                /*MustBeDeclaration=*/
>> false);
>> -        Line->Level += 1;
>> -        parseLevel(/*HasOpeningBrace=*/ true);
>> -        Line->Level -= 1;
>> +        {
>> +          ScopedLineState LineState(*this);
>> +          ScopedDeclarationState DeclarationState(*Line,
>> DeclarationScopeStack,
>> +                                                  /*MustBeDeclaration=*/
>> false);
>> +          Line->Level += 1;
>> +          parseLevel(/*HasOpeningBrace=*/ true);
>> +          Line->Level -= 1;
>> +        }
>> +        nextToken();
>>
>
> Don't we only want to do this if the next token is a '{'?
>
>
>>        }
>>        break;
>>      }
>>
>> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=183009&r1=183008&r2=183009&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
>> +++ cfe/trunk/unittests/Format/FormatTest.cpp Fri May 31 09:56:29 2013
>> @@ -1901,6 +1901,19 @@ TEST_F(FormatTest, LayoutBlockInsidePare
>>              "  int i;\n"
>>              "});",
>>              format(" functionCall ( {int i;} );"));
>> +
>> +  // FIXME: This is bad, find a better and more generic solution.
>> +  EXPECT_EQ("functionCall({\n"
>> +            "  int i;\n"
>> +            "},\n"
>> +            "             aaaa, bbbb, cccc);",
>> +            format(" functionCall ( {int i;},  aaaa,   bbbb, cccc);"));
>> +  verifyFormat(
>> +      "Aaa({\n"
>> +      "  int i;\n"
>> +      "},\n"
>> +      "
>>  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
>> +      "                                     ccccccccccccccccc));");
>>  }
>>
>>  TEST_F(FormatTest, LayoutBlockInsideStatement) {
>> @@ -3387,7 +3400,9 @@ TEST_F(FormatTest, IncorrectCodeMissingP
>>
>>  TEST_F(FormatTest, DoesNotTouchUnwrappedLinesWithErrors) {
>>    verifyFormat("namespace {\n"
>> -               "class Foo {  Foo  ( }; }  // comment");
>> +               "class Foo {  Foo  (\n"
>> +               "};\n"
>> +               "} // comment");
>>  }
>>
>>  TEST_F(FormatTest, IncorrectCodeErrorDetection) {
>> @@ -3460,16 +3475,6 @@ TEST_F(FormatTest, LayoutCxx11Constructo
>>                   NoSpaces);
>>  }
>>
>> -TEST_F(FormatTest, LayoutTokensFollowingBlockInParentheses) {
>> -  // FIXME: This is bad, find a better and more generic solution.
>> -  verifyFormat(
>> -      "Aaa({\n"
>> -      "  int i;\n"
>> -      "},\n"
>> -      "
>>  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n"
>> -      "                                     ccccccccccccccccc));");
>> -}
>> -
>>  TEST_F(FormatTest, PullTrivialFunctionDefinitionsIntoSingleLine) {
>>    verifyFormat("void f() { return 42; }");
>>    verifyFormat("void f() {\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/20130603/269896fc/attachment.html>


More information about the cfe-commits mailing list