r183009 - Improve clang-format's error recovery.

Daniel Jasper djasper at google.com
Mon Jun 3 09:11:48 PDT 2013


Ah, then probably: "no". But we have to decide carefully for each token. I
think it is pretty safe for "}".


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

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


More information about the cfe-commits mailing list