[PATCH] D146101: [clang-format] Add DesignatedInitializerIndentWidth option.
Björn Schäpers via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 30 11:49:42 PDT 2023
HazardyKnusperkeks added a comment.
In D146101#4233535 <https://reviews.llvm.org/D146101#4233535>, @jp4a50 wrote:
> So at the risk of adding to the number of decisions we need to come to a consensus on, I was about to update the KJ style guide to explicitly call out the difference in indentation for designated initializers when I realized that we (both KJ code authors and clang-format contributors) should consider whether users should have the option to configure other similar types of indentation following opening braces.
>
> I chatted to the owner of the KJ style guide and, whilst he did not have extremely strong opinions one way or another, he and I agreed that it probably makes more sense for such a config option to apply to other types of braced init lists.
>
> Broadly speaking, these include aggregate initialization and list initialization (possibly direct initialization with braces too). See the initialization <https://en.cppreference.com/w/cpp/language/initialization> cppref article for links to all these.
>
> As such, I would propose to actually rename `DesignatedInitializerIndentWidth` to `BracedInitializerIndentWidth` (but open to suggestiosn on exact naming) and have it apply to all the above types of initialization.
>
> What does everyone think?
Would be okay for me. But then I want the documentation and tests show nested initialization (array of struct for example).
================
Comment at: clang/lib/Format/ContinuationIndenter.cpp:1665-1669
+ const auto DesignatedInitializerIndentWidth =
+ Style.DesignatedInitializerIndentWidth < 0
+ ? Style.ContinuationIndentWidth
+ : Style.DesignatedInitializerIndentWidth;
+ NewIndent = CurrentState.LastSpace + DesignatedInitializerIndentWidth;
----------------
MyDeveloperDay wrote:
> rymiel wrote:
> > owenpan wrote:
> > > jp4a50 wrote:
> > > > HazardyKnusperkeks wrote:
> > > > > owenpan wrote:
> > > > > > jp4a50 wrote:
> > > > > > > HazardyKnusperkeks wrote:
> > > > > > > > owenpan wrote:
> > > > > > > > > jp4a50 wrote:
> > > > > > > > > > owenpan wrote:
> > > > > > > > > > > owenpan wrote:
> > > > > > > > > > > > Using -1 to mean `ContinuationIndentWidth` is unnecessary and somewhat confusing IMO.
> > > > > > > > > > > Please disregard my comment above.
> > > > > > > > > > Just to make sure we are on the same page, does this mean that you are happy with the approach of using `-1` as a default value to indicate that `ContinuationIndentWidth` should be used?
> > > > > > > > > >
> > > > > > > > > > I did initially consider using `std::optional<unsigned>` and using empty optional to indicate that `ContinuationIndentWidth` should be used but I saw that `PPIndentWidth` was using `-1` to default to using `IndentWidth` so I followed that precedent.
> > > > > > > > > Yep! I would prefer the `optional`, but as you pointed out, we already got `PPIndentWidth`using `-1`.
> > > > > > > > From the C++ side I totally agree. One could use `value_or()`, which would make the code much more readable.
> > > > > > > > And just because `PPIndentWidth` is using -1 is no reason to repeat that, we could just as easily change `PPIndentWidht` to an optional.
> > > > > > > >
> > > > > > > > But how would it look in yaml?
> > > > > > > In YAML we wouldn't need to support empty optional being *explicitly* specified - it would just be the default.
> > > > > > >
> > > > > > > So specifying `DesignatedInitializerIndentWidth: 4` would set the `std::optional<unsigned>` to `4` but if `DesignatedInitializerIndentWidth` was omitted from the YAML then the optional would simply not be set during parsing.
> > > > > > >
> > > > > > > Of course, if we were to change `PPIndentWidth` to work that way too, it would technically be a breaking change because users may have *explicitly* specified `-1` in their YAML.
> > > > > > > And just because `PPIndentWidth` is using -1 is no reason to repeat that, we could just as easily change `PPIndentWidht` to an optional.
> > > > > >
> > > > > > We would have to deal with backward compatibility to avoid regressions though.
> > > > > > In YAML we wouldn't need to support empty optional being *explicitly* specified - it would just be the default.
> > > > > >
> > > > > > So specifying `DesignatedInitializerIndentWidth: 4` would set the `std::optional<unsigned>` to `4` but if `DesignatedInitializerIndentWidth` was omitted from the YAML then the optional would simply not be set during parsing.
> > > > > >
> > > > > > Of course, if we were to change `PPIndentWidth` to work that way too, it would technically be a breaking change because users may have *explicitly* specified `-1` in their YAML.
> > > > >
> > > > > You need an explicit entry, because you need to be able to write the empty optional on `--dump-config`.
> > > > > > In YAML we wouldn't need to support empty optional being *explicitly* specified - it would just be the default.
> > > > > >
> > > > > > So specifying `DesignatedInitializerIndentWidth: 4` would set the `std::optional<unsigned>` to `4` but if `DesignatedInitializerIndentWidth` was omitted from the YAML then the optional would simply not be set during parsing.
> > > > > >
> > > > > > Of course, if we were to change `PPIndentWidth` to work that way too, it would technically be a breaking change because users may have *explicitly* specified `-1` in their YAML.
> > > > >
> > > > > You need an explicit entry, because you need to be able to write the empty optional on `--dump-config`.
> > > >
> > > > It looks like the YAML IO logic just does the right thing (TM) with `std::optional`s. When calling `IO.mapOptional()` on output, it simply doesn't write the key out if the value is an empty optional. So I don't think this is an issue.
> > > >
> > > > As @owenpan says, though, there is still the issue of backward compatibility with `PPIndentWidth`.
> > > >
> > > > I don't feel strongly about which way to go so I'll leave it to you two to decide!
> > > > As @owenpan says, though, there is still the issue of backward compatibility with `PPIndentWidth`.
> > > >
> > > > I don't feel strongly about which way to go so I'll leave it to you two to decide!
> > >
> > > @MyDeveloperDay @rymiel can you weigh in?
> >
> > > can you weigh in?
> >
> > Well, as someone with experience with YAML, but with no experience with LLVM's YAML stuff, I'd suggest making it `null` (explicitly), but a) i don't know if that's supported and b) i'm not sure if it's semantically any clearer than just `-1`
> I'd do the right think with `DesignatedInitializerIndentWidth` which I guess is to use the `std::optional` that @owenpan suggests and don't worry about `PPIndentWidth` for now,
>
> if anything if it works I'd prefer to understand if we can turn `PPIndentWidth` into a `std::optional` later (in a seperate review) and just catch the -1 case so at least the code is nicer, but that is a different task
>
>
> > > In YAML we wouldn't need to support empty optional being *explicitly* specified - it would just be the default.
> > >
> > > So specifying `DesignatedInitializerIndentWidth: 4` would set the `std::optional<unsigned>` to `4` but if `DesignatedInitializerIndentWidth` was omitted from the YAML then the optional would simply not be set during parsing.
> > >
> > > Of course, if we were to change `PPIndentWidth` to work that way too, it would technically be a breaking change because users may have *explicitly* specified `-1` in their YAML.
> >
> > You need an explicit entry, because you need to be able to write the empty optional on `--dump-config`.
>
> It looks like the YAML IO logic just does the right thing (TM) with `std::optional`s. When calling `IO.mapOptional()` on output, it simply doesn't write the key out if the value is an empty optional. So I don't think this is an issue.
>
> As @owenpan says, though, there is still the issue of backward compatibility with `PPIndentWidth`.
>
> I don't feel strongly about which way to go so I'll leave it to you two to decide!
As @MyDeveloperDay said, ignore `PPIndentWidth`, that will be dealt with on a different occasion. Use the optional, it is the right thing (TM) to do.
For the yaml stuff, I for one like to define everything (even it has the default value), thus I'd like the `-1` or something on output. **But** if that leads to messing around with the yaml code just use what it does.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D146101/new/
https://reviews.llvm.org/D146101
More information about the cfe-commits
mailing list