r183009 - Improve clang-format's error recovery.

Manuel Klimek klimek at google.com
Mon Jun 3 04:34:47 PDT 2013


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


More information about the cfe-commits mailing list