[cfe-commits] r172058 - in /cfe/trunk: lib/Format/Format.cpp lib/Format/UnwrappedLineParser.cpp lib/Format/UnwrappedLineParser.h unittests/Format/FormatTest.cpp

Manuel Klimek klimek at google.com
Thu Jan 10 09:30:42 PST 2013


On Thu, Jan 10, 2013 at 5:23 PM, David Blaikie <dblaikie at gmail.com> wrote:

> On Thu, Jan 10, 2013 at 3:52 AM, Manuel Klimek <klimek at google.com> wrote:
> > Author: klimek
> > Date: Thu Jan 10 05:52:21 2013
> > New Revision: 172058
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=172058&view=rev
> > Log:
> > Fix layout of blocks inside statements.
> >
> > Previously, we would not indent:
> > SOME_MACRO({
> >   int i;
> > });
> > correctly. This is fixed by adding the trailing }); to the unwrapped
> > line starting with SOME_MACRO({, so the formatter can correctly match
> > the braces and indent accordingly.
>
> This is similar to some of the complexities of lambda syntax - perhaps
> you could add some test cases for that, too (though, of course, there
> may be bugs in that because it has other syntactic complications)
>

Due to there currently being very little lambda code, we're so far not
prioritizing it.


>
> >
> > Also fixes incorrect parsing of initializer lists, like:
> > int a[] = { 1 };
> >
> > Modified:
> >     cfe/trunk/lib/Format/Format.cpp
> >     cfe/trunk/lib/Format/UnwrappedLineParser.cpp
> >     cfe/trunk/lib/Format/UnwrappedLineParser.h
> >     cfe/trunk/unittests/Format/FormatTest.cpp
> >
> > Modified: cfe/trunk/lib/Format/Format.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=172058&r1=172057&r2=172058&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Format/Format.cpp (original)
> > +++ cfe/trunk/lib/Format/Format.cpp Thu Jan 10 05:52:21 2013
> > @@ -279,7 +279,9 @@
> >
> >      if (Newline) {
> >        unsigned WhitespaceStartColumn = State.Column;
> > -      if (Previous.is(tok::l_brace)) {
> > +      if (Current.is(tok::r_brace)) {
> > +        State.Column = Line.Level * 2;
> > +      } else if (Previous.is(tok::l_brace)) {
> >          // FIXME: This does not work with nested static initializers.
> >          // Implement a better handling for static initializers and
> similar
> >          // constructs.
> >
> > Modified: cfe/trunk/lib/Format/UnwrappedLineParser.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.cpp?rev=172058&r1=172057&r2=172058&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Format/UnwrappedLineParser.cpp (original)
> > +++ cfe/trunk/lib/Format/UnwrappedLineParser.cpp Thu Jan 10 05:52:21 2013
> > @@ -76,6 +76,40 @@
> >    FormatToken Token;
> >  };
> >
> > +class ScopedLineState {
> > +public:
> > +  ScopedLineState(UnwrappedLineParser &Parser) : Parser(Parser) {
> > +    PreBlockLine = Parser.Line.take();
> > +    Parser.Line.reset(new UnwrappedLine(*PreBlockLine));
> > +    assert(Parser.LastInCurrentLine == NULL ||
> > +           Parser.LastInCurrentLine->Children.empty());
> > +    PreBlockLastToken = Parser.LastInCurrentLine;
> > +    PreBlockRootTokenInitialized = Parser.RootTokenInitialized;
> > +    Parser.RootTokenInitialized = false;
> > +    Parser.LastInCurrentLine = NULL;
> > +  }
> > +
> > +  ~ScopedLineState() {
> > +    if (Parser.RootTokenInitialized) {
> > +      Parser.addUnwrappedLine();
> > +    }
> > +    assert(!Parser.RootTokenInitialized);
> > +    Parser.Line.reset(PreBlockLine);
> > +    Parser.RootTokenInitialized = PreBlockRootTokenInitialized;
> > +    Parser.LastInCurrentLine = PreBlockLastToken;
> > +    assert(Parser.LastInCurrentLine == NULL ||
> > +           Parser.LastInCurrentLine->Children.empty());
> > +    Parser.MustBreakBeforeNextToken = true;
> > +  }
> > +
> > +private:
> > +  UnwrappedLineParser &Parser;
> > +
> > +  UnwrappedLine *PreBlockLine;
> > +  FormatToken* PreBlockLastToken;
> > +  bool PreBlockRootTokenInitialized;
> > +};
> > +
> >  UnwrappedLineParser::UnwrappedLineParser(const FormatStyle &Style,
> >                                           FormatTokenSource &Tokens,
> >                                           UnwrappedLineConsumer
> &Callback)
> > @@ -204,6 +238,7 @@
> >  }
> >
> >  void UnwrappedLineParser::parseStructuralElement() {
> > +  assert(!FormatTok.Tok.is(tok::l_brace));
> >    parseComments();
> >
> >    int TokenNumber = 0;
> > @@ -289,6 +324,10 @@
> >        parseParens();
> >        break;
> >      case tok::l_brace:
> > +      // A block outside of parentheses must be the last part of a
> > +      // structural element.
> > +      // FIXME: Figure out cases where this is not true, and add
> projections for
> > +      // them (the one we know is missing are lambdas).
> >        parseBlock();
> >        addUnwrappedLine();
> >        return;
> > @@ -301,9 +340,9 @@
> >        break;
> >      case tok::equal:
> >        nextToken();
> > -      // Skip initializers as they will be formatted by a later step.
> > -      if (FormatTok.Tok.is(tok::l_brace))
> > -        nextToken();
> > +      if (FormatTok.Tok.is(tok::l_brace)) {
> > +        parseBracedList();
> > +      }
> >        break;
> >      default:
> >        nextToken();
> > @@ -312,6 +351,24 @@
> >    } while (!eof());
> >  }
> >
> > +void UnwrappedLineParser::parseBracedList() {
> > +  nextToken();
> > +
> > +  do {
> > +    switch (FormatTok.Tok.getKind()) {
> > +    case tok::l_brace:
> > +      parseBracedList();
> > +      break;
> > +    case tok::r_brace:
> > +      nextToken();
> > +      return;
> > +    default:
> > +      nextToken();
> > +      break;
> > +    }
> > +  } while (!eof());
> > +}
> > +
> >  void UnwrappedLineParser::parseParens() {
> >    assert(FormatTok.Tok.is(tok::l_paren) && "'(' expected.");
> >    nextToken();
> > @@ -323,6 +380,15 @@
> >      case tok::r_paren:
> >        nextToken();
> >        return;
> > +    case tok::l_brace:
> > +      {
> > +        nextToken();
> > +        ScopedLineState LineState(*this);
> > +        Line->Level += 1;
> > +        parseLevel(/*HasOpeningBrace=*/true);
> > +        Line->Level -= 1;
> > +      }
> > +      break;
> >      default:
> >        nextToken();
> >        break;
> > @@ -626,22 +692,8 @@
> >    while (!Line->InPPDirective && FormatTok.Tok.is(tok::hash) &&
> >           ((FormatTok.NewlinesBefore > 0 &&
> FormatTok.HasUnescapedNewline) ||
> >            FormatTok.IsFirst)) {
> > -    UnwrappedLine* StoredLine = Line.take();
> > -    Line.reset(new UnwrappedLine(*StoredLine));
> > -    assert(LastInCurrentLine == NULL ||
> LastInCurrentLine->Children.empty());
> > -    FormatToken *StoredLastInCurrentLine = LastInCurrentLine;
> > -    bool PreviousInitialized = RootTokenInitialized;
> > -    RootTokenInitialized = false;
> > -    LastInCurrentLine = NULL;
> > -
> > +    ScopedLineState BlockState(*this);
> >      parsePPDirective();
> > -
> > -    assert(!RootTokenInitialized);
> > -    Line.reset(StoredLine);
> > -    RootTokenInitialized = PreviousInitialized;
> > -    LastInCurrentLine = StoredLastInCurrentLine;
> > -    assert(LastInCurrentLine == NULL ||
> LastInCurrentLine->Children.empty());
> > -    MustBreakBeforeNextToken = true;
> >    }
> >  }
> >
> >
> > Modified: cfe/trunk/lib/Format/UnwrappedLineParser.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/UnwrappedLineParser.h?rev=172058&r1=172057&r2=172058&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Format/UnwrappedLineParser.h (original)
> > +++ cfe/trunk/lib/Format/UnwrappedLineParser.h Thu Jan 10 05:52:21 2013
> > @@ -131,6 +131,7 @@
> >    void parsePPUnknown();
> >    void parseComments();
> >    void parseStructuralElement();
> > +  void parseBracedList();
> >    void parseParens();
> >    void parseIfThenElse();
> >    void parseForOrWhileLoop();
> > @@ -163,6 +164,8 @@
> >    const FormatStyle &Style;
> >    FormatTokenSource *Tokens;
> >    UnwrappedLineConsumer &Callback;
> > +
> > +  friend class ScopedLineState;
> >  };
> >
> >  } // end namespace format
> >
> > Modified: cfe/trunk/unittests/Format/FormatTest.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=172058&r1=172057&r2=172058&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
> > +++ cfe/trunk/unittests/Format/FormatTest.cpp Thu Jan 10 05:52:21 2013
> > @@ -615,6 +615,30 @@
> >        "               trailing);", getLLVMStyleWithColumns(69));
> >  }
> >
> > +TEST_F(FormatTest, LayoutBlockInsideParens) {
> > +  EXPECT_EQ("functionCall({\n"
> > +            "  int i;\n"
> > +            "});", format(" functionCall ( {int i;} );"));
> > +}
> > +
> > +TEST_F(FormatTest, LayoutBlockInsideStatement) {
> > +  EXPECT_EQ("SOME_MACRO {\n"
> > +            "  int i;\n"
> > +            "}\n"
> > +            "int i;", format("  SOME_MACRO  {int i;}  int i;"));
> > +}
> > +
> > +TEST_F(FormatTest, LayoutNestedBlocks) {
> > +  verifyFormat("void AddOsStrings(unsigned bitmask) {\n"
> > +               "  struct s {\n"
> > +               "    int i;\n"
> > +               "  };\n"
> > +               "  s kBitsToOs[] = { { 10 } };\n"
> > +               "  for (int i = 0; i < 10; ++i)\n"
> > +               "    return;\n"
> > +               "}");
> > +}
> > +
> >
>  //===----------------------------------------------------------------------===//
> >  // Line break tests.
> >
>  //===----------------------------------------------------------------------===//
> >
> >
> > _______________________________________________
> > 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/20130110/3086244f/attachment.html>


More information about the cfe-commits mailing list