[clang] Fixes and closes issues, #53390 and #58710. Added new controls to IndentNamespaceAliases, IndentUsingDeclarations and DecorateReflowedComments. (PR #102894)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 12 05:41:23 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-format
Author: Rajkumar Ananthu (rajkumarananthu)
<details>
<summary>Changes</summary>
Issue #<!-- -->53390 was reported to have an option to control indenting namespace aliases independently of NamespaceIndentation, added this feature.
Issue #<!-- -->58710 was reported to have an option to control the decoration of the block comments, added this feature.
---
Full diff: https://github.com/llvm/llvm-project/pull/102894.diff
5 Files Affected:
- (modified) clang/include/clang/Format/Format.h (+43)
- (modified) clang/lib/Format/BreakableToken.cpp (+4-2)
- (modified) clang/lib/Format/Format.cpp (+16)
- (modified) clang/lib/Format/UnwrappedLineParser.cpp (+35-2)
- (modified) clang/lib/Format/UnwrappedLineParser.h (+1)
``````````diff
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index ef6c76a070bfaa..c00d57013cb13f 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -2822,6 +2822,46 @@ struct FormatStyle {
/// \version 11
IndentExternBlockStyle IndentExternBlock;
+ /// IndentNamespaceAliases is the type of indenting of namespace aliases
+ /// irrespective of NamespaceIndentation.
+ bool IndentNamespaceAliases;
+
+ /// IndentUsingDeclarations is the type of indenting of using declarations
+ /// irrespective of NamespaceIndentation.
+ bool IndentUsingDeclarations;
+
+ enum DecorateReflowedCommentsStyle : int8_t {
+ /// Never:
+ /// don't use any decorator
+ /// \code
+ /// /* blah blah blah blah blah blah blah blah blah blah blah blah blah
+ /// blah blah blah blah blah blah blah blah */
+ /// \endcode
+ DRC_Never,
+ /// Always:
+ /// Always decorate with the decorator
+ /// \code
+ /// /* blah blah blah blah blah blah blah blah blah blah blah blah blah
+ /// * blah blah blah blah blah blah blah blah */
+ /// \endcode
+ DRC_Always,
+ /// FirstInLine:
+ /// Use decoration only for First in line block comments
+ /// \code
+ /// using namespace std; /* blah blah blah blah blah blah blah blah blah
+ /// blah blah blah */
+ ///
+ /// /* blah blah blah blah blah blah blah blah blah blah blah blah blah
+ /// * blah blah blah blah blah blah blah blah */
+ /// using namespace std;
+ /// \endcode
+ DRC_FirstInLineOnly
+ };
+
+ /// reflowed block comments decoration style
+ /// \version 17
+ DecorateReflowedCommentsStyle DecorateReflowedComments;
+
/// Options for indenting preprocessor directives.
enum PPDirectiveIndentStyle : int8_t {
/// Does not indent any directives.
@@ -5104,6 +5144,9 @@ struct FormatStyle {
IndentCaseBlocks == R.IndentCaseBlocks &&
IndentCaseLabels == R.IndentCaseLabels &&
IndentExternBlock == R.IndentExternBlock &&
+ IndentNamespaceAliases == R.IndentNamespaceAliases &&
+ IndentUsingDeclarations == R.IndentUsingDeclarations &&
+ DecorateReflowedComments == R.DecorateReflowedComments &&
IndentGotoLabels == R.IndentGotoLabels &&
IndentPPDirectives == R.IndentPPDirectives &&
IndentRequiresClause == R.IndentRequiresClause &&
diff --git a/clang/lib/Format/BreakableToken.cpp b/clang/lib/Format/BreakableToken.cpp
index 75304908dc6506..8bb18486e1717c 100644
--- a/clang/lib/Format/BreakableToken.cpp
+++ b/clang/lib/Format/BreakableToken.cpp
@@ -517,10 +517,12 @@ BreakableBlockComment::BreakableBlockComment(
}
Decoration = "* ";
- if (Lines.size() == 1 && !FirstInLine) {
+ if ((Style.DecorateReflowedComments == FormatStyle::DRC_Never) ||
+ (!FirstInLine &&
+ (Style.DecorateReflowedComments == FormatStyle::DRC_FirstInLineOnly))) {
// Comments for which FirstInLine is false can start on arbitrary column,
// and available horizontal space can be too small to align consecutive
- // lines with the first one.
+ // lines with the first one. Also if decoration is explicitly turned off.
// FIXME: We could, probably, align them to current indentation level, but
// now we just wrap them without stars.
Decoration = "";
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 5358b35c19de25..566cbd7908ff42 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -449,6 +449,16 @@ struct ScalarEnumerationTraits<FormatStyle::NamespaceIndentationKind> {
}
};
+template <>
+struct ScalarEnumerationTraits<FormatStyle::DecorateReflowedCommentsStyle> {
+ static void enumeration(IO &IO,
+ FormatStyle::DecorateReflowedCommentsStyle &Value) {
+ IO.enumCase(Value, "Never", FormatStyle::DRC_Never);
+ IO.enumCase(Value, "Always", FormatStyle::DRC_Always);
+ IO.enumCase(Value, "FirstInLineOnly", FormatStyle::DRC_FirstInLineOnly);
+ }
+};
+
template <> struct ScalarEnumerationTraits<FormatStyle::OperandAlignmentStyle> {
static void enumeration(IO &IO, FormatStyle::OperandAlignmentStyle &Value) {
IO.enumCase(Value, "DontAlign", FormatStyle::OAS_DontAlign);
@@ -1014,6 +1024,9 @@ template <> struct MappingTraits<FormatStyle> {
IO.mapOptional("IndentCaseBlocks", Style.IndentCaseBlocks);
IO.mapOptional("IndentCaseLabels", Style.IndentCaseLabels);
IO.mapOptional("IndentExternBlock", Style.IndentExternBlock);
+ IO.mapOptional("IndentNamespaceAliases", Style.IndentNamespaceAliases);
+ IO.mapOptional("IndentUsingDeclarations", Style.IndentUsingDeclarations);
+ IO.mapOptional("DecorateReflowedComments", Style.DecorateReflowedComments);
IO.mapOptional("IndentGotoLabels", Style.IndentGotoLabels);
IO.mapOptional("IndentPPDirectives", Style.IndentPPDirectives);
IO.mapOptional("IndentRequiresClause", Style.IndentRequiresClause);
@@ -1524,6 +1537,9 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
LLVMStyle.IndentCaseBlocks = false;
LLVMStyle.IndentCaseLabels = false;
LLVMStyle.IndentExternBlock = FormatStyle::IEBS_AfterExternBlock;
+ LLVMStyle.IndentNamespaceAliases = false;
+ LLVMStyle.IndentUsingDeclarations = false;
+ LLVMStyle.DecorateReflowedComments = FormatStyle::DRC_FirstInLineOnly;
LLVMStyle.IndentGotoLabels = true;
LLVMStyle.IndentPPDirectives = FormatStyle::PPDIS_None;
LLVMStyle.IndentRequiresClause = true;
diff --git a/clang/lib/Format/UnwrappedLineParser.cpp b/clang/lib/Format/UnwrappedLineParser.cpp
index 66485c91f64de9..4878e4a749c968 100644
--- a/clang/lib/Format/UnwrappedLineParser.cpp
+++ b/clang/lib/Format/UnwrappedLineParser.cpp
@@ -47,8 +47,7 @@ void printLine(llvm::raw_ostream &OS, const UnwrappedLine &Line,
OS << Prefix;
NewLine = false;
}
- OS << I->Tok->Tok.getName() << "["
- << "T=" << (unsigned)I->Tok->getType()
+ OS << I->Tok->Tok.getName() << "[" << "T=" << (unsigned)I->Tok->getType()
<< ", OC=" << I->Tok->OriginalColumn << ", \"" << I->Tok->TokenText
<< "\"] ";
for (SmallVectorImpl<UnwrappedLine>::const_iterator
@@ -346,6 +345,35 @@ bool UnwrappedLineParser::precededByCommentOrPPDirective() const {
(Previous->IsMultiline || Previous->NewlinesBefore > 0);
}
+void UnwrappedLineParser::parseStmt(bool keepIndentation) {
+ bool levelsAreAdded = (Line->Level == DeclarationScopeStack.size());
+ // move till the end of the statement
+ while (!FormatTok->is(tok::semi))
+ nextToken();
+ nextToken();
+ if (keepIndentation) {
+ // if levels are already added, just emit with existing indentation
+ // otherwise, emit with scoped indentation
+ if (levelsAreAdded) {
+ addUnwrappedLine(LineLevel::Keep);
+ } else {
+ Line->Level += (DeclarationScopeStack.size() - 1);
+ addUnwrappedLine(LineLevel::Keep);
+ Line->Level -= (DeclarationScopeStack.size() - 1);
+ }
+ } else {
+ // if levels are already added, remove the levels and emit
+ // otherwise, just emit
+ if (levelsAreAdded) {
+ Line->Level -= (DeclarationScopeStack.size() - 1);
+ addUnwrappedLine(LineLevel::Remove);
+ Line->Level += (DeclarationScopeStack.size() - 1);
+ } else {
+ addUnwrappedLine(LineLevel::Remove);
+ }
+ }
+}
+
/// \brief Parses a level, that is ???.
/// \param OpeningBrace Opening brace (\p nullptr if absent) of that level.
/// \param IfKind The \p if statement kind in the level.
@@ -465,6 +493,9 @@ bool UnwrappedLineParser::parseLevel(const FormatToken *OpeningBrace,
SwitchLabelEncountered = true;
parseStructuralElement();
break;
+ case tok::kw_using:
+ parseStmt(Style.IndentUsingDeclarations);
+ break;
case tok::l_square:
if (Style.isCSharp()) {
nextToken();
@@ -3117,6 +3148,8 @@ void UnwrappedLineParser::parseNamespace() {
if (ManageWhitesmithsBraces)
--Line->Level;
+ } else if (FormatTok->is(tok::equal)) {
+ parseStmt(Style.IndentNamespaceAliases);
}
// FIXME: Add error handling.
}
diff --git a/clang/lib/Format/UnwrappedLineParser.h b/clang/lib/Format/UnwrappedLineParser.h
index b7daf8d9f44012..adcb0ee07994f0 100644
--- a/clang/lib/Format/UnwrappedLineParser.h
+++ b/clang/lib/Format/UnwrappedLineParser.h
@@ -120,6 +120,7 @@ class UnwrappedLineParser {
void reset();
void parseFile();
bool precededByCommentOrPPDirective() const;
+ void parseStmt(bool keepIndentation);
bool parseLevel(const FormatToken *OpeningBrace = nullptr,
IfStmtKind *IfKind = nullptr,
FormatToken **IfLeftBrace = nullptr);
``````````
</details>
https://github.com/llvm/llvm-project/pull/102894
More information about the cfe-commits
mailing list