darwin added a comment.

In D104044#2813515 <https://reviews.llvm.org/D104044#2813515>, @MyDeveloperDay 
wrote:

> Do we need a set options for when we want to insert/retain/add a newline 
> after various constructs? frankly I've been mulling over the concept of 
> adding a
>
>   NewLinesBetweenFunctions: 1
>
> I personally don't like code written like this as I find it hard to read, I'd 
> like to be able to mandate a single line between functions
>
>   void foo()
>   {
>   ...
>   }
>   void bar()
>   {
>   ...
>   }
>   void foobar()
>   {
>   ...
>   }
>
> I prefer when its written as:
>
>   void foo()
>   {
>   ...
>   }
>   
>   void bar()
>   {
>   ...
>   }
>   
>   void foobar()
>   {
>   ...
>   }
>
> Maybe we even need a more generalised mechanism that would allow alot of 
> flexibility letting people control their own specific style.
>
>   EmptyLineInsertionStyle: Custom
>         AfterNameSpaceOpeningBrace: 1
>         BeforeNameSpaceClosingBrace: 1
>         BetweenFunctions: 2
>         AfterClassOpeningBrace: 1
>         BeforeClassClosingBrace: 1
>         AfterAccessModifier : 1
>         BeforeAccessModifier: 1

I totally agree with you on this part, but I think this is a new feature 
requirement. Maybe we can open a new bug and set the "Severity" to 
"enhancement".

In D104044#2813794 <https://reviews.llvm.org/D104044#2813794>, @MyDeveloperDay 
wrote:

> My point being there is inconsistency between how different types of blocks 
> of code are handled, and rather than trying to fix another corner case maybe 
> we should take a more holistic approach, all these KeepEmptyLines and 
> EmptyLineAfterXXX options and what you'll need in order to fix this issue are 
> all addressing what is effectively the same issue, and that is that the 
> addition and/or removal of empty lines is a little hit or miss depending on 
> your combination and permutation of settings and the type of block

I agree that we should use a holistic approach to solve the problem as long as 
we can, but I think the namespace is different than the class based on those 
reasons:

- We indent in the class scope, but we almost never indent in the namespace 
scope. (I've checked all the predefined styles)
- The life-cycles of the objects in the class scope are associated with the 
class scope, but the life-cycles of the objects in a namespace is always global.

> I personally would prefer we took a step back and asked ourselves if we are 
> really facing a bug here or just different people desiring different 
> functionality?

My reason for this being a bug is very simple. If my original code is like this 
(original):

  01 namespace B
  02 {
  03
  04
  04 int j;
  05
  06
  07 }

Then I want the code to be formatted like this (expected):

  01 namespace B
  02 {
  03
  04 int j;
  05
  06 }

Not like this (actual):

  01 namespace B
  02 {
  03 int j;
  04
  05 }

> Whatever the rules are for an inner class, I don't particularly see they are 
> much different for a class in a namespace (which I why I picked that example 
> to demonstrate the point), we won't resolve that inconsistency in a way that 
> will satisfy everyone without having a more powerful mechanism.
>
> If you are thinking you want to just fix your bug then I'd be saying that it 
> SHOULD remove the empty lines (including the one prior to the } // namespace 
> MyLibrary, having said that I'm slightly struggling to understand why
>
>   class Foo {
>   
>   
>   
>   
>   class Bar {};
>   };
>
> isn't conforming to the setting of MaxEmptyLinesToKeep if I set it to 1 where

"it SHOULD remove the empty lines (including the one prior to the } // 
namespace MyLibrary", I don't get what you mean here, can you give me an 
example?

As for the code (original):

  darwin@Darwins-iMac temp % cat f.cpp 
  class Foo {
  
  
  
  
  class Bar {};
  };

It will be formatted into:

  darwin@Darwins-iMac temp % clang-format f.cpp -style="{MaxEmptyLinesToKeep: 
1}"
  class Foo {
  
    class Bar {};
  };

I didn't see any problem here.

>   namespace MyLibrary {
>   
>   class Tool {};
>   }  // namespace MyLibrary
>
> is
>
> i.e. set MaxEmptyLinesToKeep  to 0 and
>
> it gets formatted as:
>
>   namespace MyLibrary {
>   class Tool {};
>   }  // namespace MyLibrary

The behavior is correct in this case. Notice the `{` is on the same line as the 
`namespace`. If I set `AfterNamespace` as true, then the behavior is different.

Orignal code, there are two empty lines before and after `class Tool {};`:

  darwin@Darwins-iMac temp % cat e.cpp 
  01 namespace MyLibrary {
  02
  03 
  04 class Tool {};
  05 
  06 
  07 } 

If I format it with `AfterNamespace` as true and `MaxEmptyLinesToKeep` as 0, 
all those empty lines are removed, which is correct:

  darwin@Darwins-iMac temp % clang-format e.cpp -style="{BasedOnStyle: google, 
BreakBeforeBraces: Custom, BraceWrapping: {AfterNamespace: true}, 
MaxEmptyLinesToKeep: 0}"
  01 namespace MyLibrary
  02 {
  03 class Tool {};
  04 }  // namespace MyLibrary

If I format with `AfterNamespace` as true and `MaxEmptyLinesToKeep` as 1, the 
empty lines after `class Tool {};` are reduced to 1, which is correct, but the 
empty lines before `class Tool {};` is still zero, which I think is wrong:

  darwin@Darwins-iMac temp % clang-format e.cpp -style="{BasedOnStyle: google, 
BreakBeforeBraces: Custom, BraceWrapping: {AfterNamespace: true}, 
MaxEmptyLinesToKeep: 1}"
  01 namespace MyLibrary
  02 {
  03 class Tool {};
  04 
  05 }  // namespace MyLibrary



> We don't normally just review tests, but what were you thinking the fix 
> should be?

The reason I started with a test was because no one seemed to be reviewing the 
bug I reported: https://bugs.llvm.org/show_bug.cgi?id=50116. So, I think it 
might be a good place to discuss the issue here.

In my opinion, if there is no empty line in the namespace, clang-format should 
keep it this way. For example, if the original code is:

  darwin@Darwins-iMac temp % cat e.cpp
  namespace MyLibrary { class Tool {}; } 

The formatted code (with `AfterNamespace` as true and `MaxEmptyLinesToKeep` as 
1) is expected to be like this:

  namespace MyLibrary
  {
  class Tool {};
  } 

If there are empty lines in the beginning and the ending of the namespace, then 
clang-format should reduce them in a consistent way. For example, if the 
original code is:

  


Repository:
  rZORG LLVM Github Zorg

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D104044/new/

https://reviews.llvm.org/D104044

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to