russellmcc added inline comments.

================
Comment at: lib/Format/ContinuationIndenter.cpp:760
         (!Style.AllowAllParametersOfDeclarationOnNextLine &&
          State.Line->MustBeDeclaration) ||
+        (!Style.AllowAllArgumentsOnNextLine &&
----------------
djasper wrote:
> This still looks suspicious to me. State.Line->MustBeDeclaration is either 
> true or false meaning that AllowAllParametersOfDeclarationOnNextLine or 
> AllowAllArgumentsOnNextLine can always affect the behavior here, leading to 
> BreakBeforeParameter to be set to true, even if we are in the case for 
> PreviousIsBreakingCtorInitializerColon being true.
> 
> So, my guess would be that if you set one of AllowAllArgumentsOnNextLine and 
> AllowAllParametersOfDeclarationOnNextLine to false, then 
> AllowAllConstructorInitializersOnNextLine doesn't have an effect anymore.
> 
> Please verify, and if this is true, please fix and add tests. I think this 
> might be easier to understand if you pulled the one if statement apart.
Actually, I think this logic works.  The case you are worried about 
(interaction between arguments, parameters, and constructor initializers) is 
already tested in the unit tests in the 
`AllowAllConstructorInitializersOnNextLine` test.  The specific concern you 
have is solved by the separate if statement below.

I agree that this logic is a bit complex, but I think it's necessary since in 
most cases we don't want to change the existing value of 
`State.Stack.back().BreakBeforeParameter` - we only want to change this when we 
are sure we should or shouldn't bin-pack.  I've tried hard not to change any 
existing behavior unless it was clearly a bug.  I think we could simplify this 
logic if we wanted to be less conservative.

I'm not sure what you mean by breaking up the if statement - did you mean 
something like this?  To me, this reads much more verbose and is a bit more 
confusing; however I'm happy to edit the diff if it makes more sense to you:

```
    // If we are breaking after '(', '{', '<', or this is the break after a ':'
    // to start a member initializater list in a constructor, this should not
    // be considered bin packing unless the relevant AllowAll option is false or
    // this is a dict/object literal.
    bool PreviousIsBreakingCtorInitializerColon =
        Previous.is(TT_CtorInitializerColon) &&
        Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon;

    if (!(Previous.isOneOf(tok::l_paren, tok::l_brace, TT_BinaryOperator) ||
          PreviousIsBreakingCtorInitializerColon))
      State.Stack.back().BreakBeforeParameter = true;

    if (!Style.AllowAllParametersOfDeclarationOnNextLine &&
        State.Line->MustBeDeclaration)
      State.Stack.back().BreakBeforeParameter = true;

    if (!Style.AllowAllArgumentsOnNextLine && !State.Line->MustBeDeclaration)
      State.Stack.back().BreakBeforeParameter = true;

    if (!Style.AllowAllConstructorInitializersOnNextLine &&
        PreviousIsBreakingCtorInitializerColon)
      State.Stack.back().BreakBeforeParameter = true;

    if (Previous.is(TT_DictLiteral)))
      State.Stack.back().BreakBeforeParameter = true;

    // If we are breaking after a ':' to start a member initializer list,
    // and we allow all arguments on the next line, we should not break
    // before the next parameter.
    if (PreviousIsBreakingCtorInitializerColon &&
        Style.AllowAllConstructorInitializersOnNextLine)
      State.Stack.back().BreakBeforeParameter = false;
```


https://reviews.llvm.org/D40988



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATCH] D40988: Clang-fo... Russell McClellan via Phabricator via cfe-commits

Reply via email to