diff options
author | Sirraide <aeternalmail@gmail.com> | 2025-01-19 00:26:40 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-19 00:26:40 +0100 |
commit | 106c483a102e1328f11e2b1d9398f4ad2826b59f (patch) | |
tree | a3fe8a3949bbc0c7d6a71be33a9b6b24df004d3e /clang/lib/Format/UnwrappedLineParser.cpp | |
parent | eae5ca9b45bf1232f30d92ce50c19c1ea82c0f0b (diff) | |
download | llvm-106c483a102e1328f11e2b1d9398f4ad2826b59f.zip llvm-106c483a102e1328f11e2b1d9398f4ad2826b59f.tar.gz llvm-106c483a102e1328f11e2b1d9398f4ad2826b59f.tar.bz2 |
[clang-format] Improve brace wrapping and add an option to control indentation of `export { ... }` (#110381)
`export { ... }` blocks can get a bit long, so I thought it would make
sense to have an option that makes it so their contents are not indented
(basically the same argument as for namespaces).
This is based on the `NamespaceIndentation` option, except that there is
no option to control the behaviour of `export` blocks when nested because
nesting them doesn’t really make sense.
Additionally, brace wrapping of short `export { ... }` blocks is now controlled by the
`AllowShortBlocksOnASingleLine` option. There is no separate option just for `export`
blocks because you can just write e.g. `export int x;` instead of `export { int x; }`.
This closes #121723.
Diffstat (limited to 'clang/lib/Format/UnwrappedLineParser.cpp')
-rw-r--r-- | clang/lib/Format/UnwrappedLineParser.cpp | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp index 198c05f..834693e 100644 --- a/clang/lib/Format/UnwrappedLineParser.cpp +++ b/clang/lib/Format/UnwrappedLineParser.cpp @@ -1625,6 +1625,10 @@ void UnwrappedLineParser::parseStructuralElement( parseNamespace(); return; } + if (FormatTok->is(tok::l_brace)) { + parseCppExportBlock(); + return; + } if (FormatTok->is(Keywords.kw_import) && parseModuleImport()) return; } @@ -3105,6 +3109,26 @@ void UnwrappedLineParser::parseTryCatch() { addUnwrappedLine(); } +void UnwrappedLineParser::parseNamespaceOrExportBlock(unsigned AddLevels) { + bool ManageWhitesmithsBraces = + AddLevels == 0u && Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths; + + // If we're in Whitesmiths mode, indent the brace if we're not indenting + // the whole block. + if (ManageWhitesmithsBraces) + ++Line->Level; + + // Munch the semicolon after the block. This is more common than one would + // think. Putting the semicolon into its own line is very ugly. + parseBlock(/*MustBeDeclaration=*/true, AddLevels, /*MunchSemi=*/true, + /*KeepBraces=*/true, /*IfKind=*/nullptr, ManageWhitesmithsBraces); + + addUnwrappedLine(AddLevels > 0 ? LineLevel::Remove : LineLevel::Keep); + + if (ManageWhitesmithsBraces) + --Line->Level; +} + void UnwrappedLineParser::parseNamespace() { assert(FormatTok->isOneOf(tok::kw_namespace, TT_NamespaceMacro) && "'namespace' expected"); @@ -3137,29 +3161,16 @@ void UnwrappedLineParser::parseNamespace() { DeclarationScopeStack.size() > 1) ? 1u : 0u; - bool ManageWhitesmithsBraces = - AddLevels == 0u && - Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths; - - // If we're in Whitesmiths mode, indent the brace if we're not indenting - // the whole block. - if (ManageWhitesmithsBraces) - ++Line->Level; - - // Munch the semicolon after a namespace. This is more common than one would - // think. Putting the semicolon into its own line is very ugly. - parseBlock(/*MustBeDeclaration=*/true, AddLevels, /*MunchSemi=*/true, - /*KeepBraces=*/true, /*IfKind=*/nullptr, - ManageWhitesmithsBraces); - - addUnwrappedLine(AddLevels > 0 ? LineLevel::Remove : LineLevel::Keep); - - if (ManageWhitesmithsBraces) - --Line->Level; + parseNamespaceOrExportBlock(AddLevels); } // FIXME: Add error handling. } +void UnwrappedLineParser::parseCppExportBlock() { + parseNamespaceOrExportBlock(/*AddLevels=*/Style.ExportBlockIndentation ? 1 + : 0); +} + void UnwrappedLineParser::parseNew() { assert(FormatTok->is(tok::kw_new) && "'new' expected"); nextToken(); |