r183009 - Improve clang-format's error recovery.

Manuel Klimek klimek at google.com
Mon Jun 3 09:06:51 PDT 2013


Sorry, meant '}'.


On Mon, Jun 3, 2013 at 5:41 PM, Daniel Jasper <djasper at google.com> wrote:

> 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/517729b8/attachment.html>


More information about the cfe-commits mailing list