[clang] 87ad34f - Revert "[clang-format] Add AlignConsecutiveShortCaseStatements"
Owen Pan via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 24 18:37:54 PDT 2023
Author: Owen Pan
Date: 2023-07-24T18:37:42-07:00
New Revision: 87ad34ffdcf2de99dab0ac86f148a03e4bd2dddc
URL: https://github.com/llvm/llvm-project/commit/87ad34ffdcf2de99dab0ac86f148a03e4bd2dddc
DIFF: https://github.com/llvm/llvm-project/commit/87ad34ffdcf2de99dab0ac86f148a03e4bd2dddc.diff
LOG: Revert "[clang-format] Add AlignConsecutiveShortCaseStatements"
This reverts commit 4ba00844174db562d2bd8b15dab6aac605eddf57.
Added:
Modified:
clang/docs/ClangFormatStyleOptions.rst
clang/docs/ReleaseNotes.rst
clang/include/clang/Format/Format.h
clang/lib/Format/Format.cpp
clang/lib/Format/WhitespaceManager.cpp
clang/lib/Format/WhitespaceManager.h
clang/unittests/Format/ConfigParseTest.cpp
clang/unittests/Format/FormatTest.cpp
Removed:
################################################################################
diff --git a/clang/docs/ClangFormatStyleOptions.rst b/clang/docs/ClangFormatStyleOptions.rst
index e85b8c0b1edc26..7547aa2a55a71c 100644
--- a/clang/docs/ClangFormatStyleOptions.rst
+++ b/clang/docs/ClangFormatStyleOptions.rst
@@ -789,104 +789,6 @@ the configuration (without a prefix: ``Auto``).
bbb >>= 2;
-.. _AlignConsecutiveShortCaseStatements:
-
-**AlignConsecutiveShortCaseStatements** (``ShortCaseStatementsAlignmentStyle``) :versionbadge:`clang-format 17` :ref:`¶ <AlignConsecutiveShortCaseStatements>`
- Style of aligning consecutive short case labels.
- Only applies if ``AllowShortCaseLabelsOnASingleLine`` is ``true``.
-
-
- .. code-block:: yaml
-
- # Example of usage:
- AlignConsecutiveShortCaseStatements:
- Enabled: true
- AcrossEmptyLines: true
- AcrossComments: true
- AlignCaseColons: false
-
- Nested configuration flags:
-
- Alignment options.
-
- * ``bool Enabled`` Whether aligning is enabled.
-
- .. code-block:: c++
-
- true:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
- default: return "";
- }
-
- false:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
- default: return "";
- }
-
- * ``bool AcrossEmptyLines`` Whether to align across empty lines.
-
- .. code-block:: c++
-
- true:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
-
- default: return "";
- }
-
- false:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
-
- default: return "";
- }
-
- * ``bool AcrossComments`` Whether to align across comments.
-
- .. code-block:: c++
-
- true:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
- /* A comment. */
- default: return "";
- }
-
- false:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
- /* A comment. */
- default: return "";
- }
-
- * ``bool AlignCaseColons`` Whether aligned case labels are aligned on the colon, or on the
- , or on the tokens after the colon.
-
- .. code-block:: c++
-
- true:
- switch (level) {
- case log::info : return "info:";
- case log::warning: return "warning:";
- default : return "";
- }
-
- false:
- switch (level) {
- case log::info: return "info:";
- case log::warning: return "warning:";
- default: return "";
- }
-
-
.. _AlignEscapedNewlines:
**AlignEscapedNewlines** (``EscapedNewlineAlignmentStyle``) :versionbadge:`clang-format 5` :ref:`¶ <AlignEscapedNewlines>`
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 13fb95b8767c3b..4f82edd0d03d14 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -988,8 +988,6 @@ clang-format
- Add ``KeepEmptyLinesAtEOF`` to keep empty lines at end of file.
- Add ``RemoveParentheses`` to remove redundant parentheses.
- Add ``TypeNames`` to treat listed non-keyword identifiers as type names.
-- Add ``AlignConsecutiveShortCaseStatements`` which can be used to align case
- labels in conjunction with ``AllowShortCaseLabelsOnASingleLine``.
libclang
--------
diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h
index 7b429d51d49b4b..8cb8dd23c19427 100644
--- a/clang/include/clang/Format/Format.h
+++ b/clang/include/clang/Format/Format.h
@@ -299,103 +299,6 @@ struct FormatStyle {
/// \version 3.8
AlignConsecutiveStyle AlignConsecutiveDeclarations;
- /// Alignment options.
- ///
- struct ShortCaseStatementsAlignmentStyle {
- /// Whether aligning is enabled.
- /// \code
- /// true:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- /// default: return "";
- /// }
- ///
- /// false:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- /// default: return "";
- /// }
- /// \endcode
- bool Enabled;
- /// Whether to align across empty lines.
- /// \code
- /// true:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- ///
- /// default: return "";
- /// }
- ///
- /// false:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- ///
- /// default: return "";
- /// }
- /// \endcode
- bool AcrossEmptyLines;
- /// Whether to align across comments.
- /// \code
- /// true:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- /// /* A comment. */
- /// default: return "";
- /// }
- ///
- /// false:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- /// /* A comment. */
- /// default: return "";
- /// }
- /// \endcode
- bool AcrossComments;
- /// Whether aligned case labels are aligned on the colon, or on the
- /// , or on the tokens after the colon.
- /// \code
- /// true:
- /// switch (level) {
- /// case log::info : return "info:";
- /// case log::warning: return "warning:";
- /// default : return "";
- /// }
- ///
- /// false:
- /// switch (level) {
- /// case log::info: return "info:";
- /// case log::warning: return "warning:";
- /// default: return "";
- /// }
- /// \endcode
- bool AlignCaseColons;
- bool operator==(const ShortCaseStatementsAlignmentStyle &R) const {
- return Enabled == R.Enabled && AcrossEmptyLines == R.AcrossEmptyLines &&
- AcrossComments == R.AcrossComments &&
- AlignCaseColons == R.AlignCaseColons;
- }
- };
-
- /// Style of aligning consecutive short case labels.
- /// Only applies if ``AllowShortCaseLabelsOnASingleLine`` is ``true``.
- ///
- /// \code{.yaml}
- /// # Example of usage:
- /// AlignConsecutiveShortCaseStatements:
- /// Enabled: true
- /// AcrossEmptyLines: true
- /// AcrossComments: true
- /// AlignCaseColons: false
- /// \endcode
- /// \version 17
- ShortCaseStatementsAlignmentStyle AlignConsecutiveShortCaseStatements;
-
/// Different styles for aligning escaped newlines.
enum EscapedNewlineAlignmentStyle : int8_t {
/// Don't align escaped newlines.
@@ -4454,8 +4357,6 @@ struct FormatStyle {
AlignConsecutiveBitFields == R.AlignConsecutiveBitFields &&
AlignConsecutiveDeclarations == R.AlignConsecutiveDeclarations &&
AlignConsecutiveMacros == R.AlignConsecutiveMacros &&
- AlignConsecutiveShortCaseStatements ==
- R.AlignConsecutiveShortCaseStatements &&
AlignEscapedNewlines == R.AlignEscapedNewlines &&
AlignOperands == R.AlignOperands &&
AlignTrailingComments == R.AlignTrailingComments &&
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 1d208243544f10..3df1b60d2cb958 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -111,17 +111,6 @@ template <> struct MappingTraits<FormatStyle::AlignConsecutiveStyle> {
}
};
-template <>
-struct MappingTraits<FormatStyle::ShortCaseStatementsAlignmentStyle> {
- static void mapping(IO &IO,
- FormatStyle::ShortCaseStatementsAlignmentStyle &Value) {
- IO.mapOptional("Enabled", Value.Enabled);
- IO.mapOptional("AcrossEmptyLines", Value.AcrossEmptyLines);
- IO.mapOptional("AcrossComments", Value.AcrossComments);
- IO.mapOptional("AlignCaseColons", Value.AlignCaseColons);
- }
-};
-
template <>
struct ScalarEnumerationTraits<FormatStyle::AttributeBreakingStyle> {
static void enumeration(IO &IO, FormatStyle::AttributeBreakingStyle &Value) {
@@ -868,8 +857,6 @@ template <> struct MappingTraits<FormatStyle> {
IO.mapOptional("AlignConsecutiveDeclarations",
Style.AlignConsecutiveDeclarations);
IO.mapOptional("AlignConsecutiveMacros", Style.AlignConsecutiveMacros);
- IO.mapOptional("AlignConsecutiveShortCaseStatements",
- Style.AlignConsecutiveShortCaseStatements);
IO.mapOptional("AlignEscapedNewlines", Style.AlignEscapedNewlines);
IO.mapOptional("AlignOperands", Style.AlignOperands);
IO.mapOptional("AlignTrailingComments", Style.AlignTrailingComments);
@@ -1346,7 +1333,6 @@ FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language) {
LLVMStyle.AlignConsecutiveBitFields = {};
LLVMStyle.AlignConsecutiveDeclarations = {};
LLVMStyle.AlignConsecutiveMacros = {};
- LLVMStyle.AlignConsecutiveShortCaseStatements = {};
LLVMStyle.AlignTrailingComments = {};
LLVMStyle.AlignTrailingComments.Kind = FormatStyle::TCAS_Always;
LLVMStyle.AlignTrailingComments.OverEmptyLines = 0;
diff --git a/clang/lib/Format/WhitespaceManager.cpp b/clang/lib/Format/WhitespaceManager.cpp
index 668ca38ad68362..03dcc31eb09aef 100644
--- a/clang/lib/Format/WhitespaceManager.cpp
+++ b/clang/lib/Format/WhitespaceManager.cpp
@@ -102,7 +102,6 @@ const tooling::Replacements &WhitespaceManager::generateReplacements() {
llvm::sort(Changes, Change::IsBeforeInFile(SourceMgr));
calculateLineBreakInformation();
alignConsecutiveMacros();
- alignConsecutiveShortCaseStatements();
alignConsecutiveDeclarations();
alignConsecutiveBitFields();
alignConsecutiveAssignments();
@@ -676,12 +675,14 @@ static unsigned AlignTokens(const FormatStyle &Style, F &&Matches,
//
// We need to adjust the StartOfTokenColumn of each Change that is on a line
// containing any matching token to be aligned and located after such token.
-static void AlignMatchingTokenSequence(
+static void AlignMacroSequence(
unsigned &StartOfSequence, unsigned &EndOfSequence, unsigned &MinColumn,
- std::function<bool(const WhitespaceManager::Change &C)> Matches,
+ unsigned &MaxColumn, bool &FoundMatchOnLine,
+ std::function<bool(const WhitespaceManager::Change &C)> AlignMacrosMatches,
SmallVector<WhitespaceManager::Change, 16> &Changes) {
if (StartOfSequence > 0 && StartOfSequence < EndOfSequence) {
- bool FoundMatchOnLine = false;
+
+ FoundMatchOnLine = false;
int Shift = 0;
for (unsigned I = StartOfSequence; I != EndOfSequence; ++I) {
@@ -692,8 +693,8 @@ static void AlignMatchingTokenSequence(
// If this is the first matching token to be aligned, remember by how many
// spaces it has to be shifted, so the rest of the changes on the line are
- // shifted by the same amount.
- if (!FoundMatchOnLine && Matches(Changes[I])) {
+ // shifted by the same amount
+ if (!FoundMatchOnLine && AlignMacrosMatches(Changes[I])) {
FoundMatchOnLine = true;
Shift = MinColumn - Changes[I].StartOfTokenColumn;
Changes[I].Spaces += Shift;
@@ -707,6 +708,7 @@ static void AlignMatchingTokenSequence(
}
MinColumn = 0;
+ MaxColumn = UINT_MAX;
StartOfSequence = 0;
EndOfSequence = 0;
}
@@ -745,6 +747,7 @@ void WhitespaceManager::alignConsecutiveMacros() {
};
unsigned MinColumn = 0;
+ unsigned MaxColumn = UINT_MAX;
// Start and end of the token sequence we're processing.
unsigned StartOfSequence = 0;
@@ -772,8 +775,8 @@ void WhitespaceManager::alignConsecutiveMacros() {
!(LineIsComment && Style.AlignConsecutiveMacros.AcrossComments);
if (EmptyLineBreak || NoMatchBreak) {
- AlignMatchingTokenSequence(StartOfSequence, EndOfSequence, MinColumn,
- AlignMacrosMatches, Changes);
+ AlignMacroSequence(StartOfSequence, EndOfSequence, MinColumn, MaxColumn,
+ FoundMatchOnLine, AlignMacrosMatches, Changes);
}
// A new line starts, re-initialize line status tracking bools.
@@ -793,12 +796,18 @@ void WhitespaceManager::alignConsecutiveMacros() {
StartOfSequence = I;
unsigned ChangeMinColumn = Changes[I].StartOfTokenColumn;
+ int LineLengthAfter = -Changes[I].Spaces;
+ for (unsigned j = I; j != E && Changes[j].NewlinesBefore == 0; ++j)
+ LineLengthAfter += Changes[j].Spaces + Changes[j].TokenLength;
+ unsigned ChangeMaxColumn = Style.ColumnLimit - LineLengthAfter;
+
MinColumn = std::max(MinColumn, ChangeMinColumn);
+ MaxColumn = std::min(MaxColumn, ChangeMaxColumn);
}
EndOfSequence = I;
- AlignMatchingTokenSequence(StartOfSequence, EndOfSequence, MinColumn,
- AlignMacrosMatches, Changes);
+ AlignMacroSequence(StartOfSequence, EndOfSequence, MinColumn, MaxColumn,
+ FoundMatchOnLine, AlignMacrosMatches, Changes);
}
void WhitespaceManager::alignConsecutiveAssignments() {
@@ -854,110 +863,6 @@ void WhitespaceManager::alignConsecutiveBitFields() {
Changes, /*StartAt=*/0, Style.AlignConsecutiveBitFields);
}
-void WhitespaceManager::alignConsecutiveShortCaseStatements() {
- if (!Style.AlignConsecutiveShortCaseStatements.Enabled ||
- !Style.AllowShortCaseLabelsOnASingleLine) {
- return;
- }
-
- auto Matches = [&](const Change &C) {
- if (Style.AlignConsecutiveShortCaseStatements.AlignCaseColons)
- return C.Tok->is(TT_CaseLabelColon);
-
- // Ignore 'IsInsideToken' to allow matching trailing comments which
- // need to be reflowed as that causes the token to appear in two
- //
diff erent changes, which will cause incorrect alignment as we'll
- // reflow early due to detecting multiple aligning tokens per line.
- return !C.IsInsideToken && C.Tok->Previous &&
- C.Tok->Previous->is(TT_CaseLabelColon);
- };
-
- unsigned MinColumn = 0;
-
- // Empty case statements don't break the alignment, but don't necessarily
- // match our predicate, so we need to track their column so they can push out
- // our alignment.
- unsigned MinEmptyCaseColumn = 0;
-
- // Start and end of the token sequence we're processing.
- unsigned StartOfSequence = 0;
- unsigned EndOfSequence = 0;
-
- // Whether a matching token has been found on the current line.
- bool FoundMatchOnLine = false;
-
- bool LineIsComment = true;
- bool LineIsEmptyCase = false;
-
- unsigned I = 0;
- for (unsigned E = Changes.size(); I != E; ++I) {
- if (Changes[I].NewlinesBefore != 0) {
- // Whether to break the alignment sequence because of an empty line.
- bool EmptyLineBreak =
- (Changes[I].NewlinesBefore > 1) &&
- !Style.AlignConsecutiveShortCaseStatements.AcrossEmptyLines;
-
- // Whether to break the alignment sequence because of a line without a
- // match.
- bool NoMatchBreak =
- !FoundMatchOnLine &&
- !(LineIsComment &&
- Style.AlignConsecutiveShortCaseStatements.AcrossComments) &&
- !LineIsEmptyCase;
-
- if (EmptyLineBreak || NoMatchBreak) {
- AlignMatchingTokenSequence(StartOfSequence, EndOfSequence, MinColumn,
- Matches, Changes);
- MinEmptyCaseColumn = 0;
- }
-
- // A new line starts, re-initialize line status tracking bools.
- FoundMatchOnLine = false;
- LineIsComment = true;
- LineIsEmptyCase = false;
- }
-
- if (Changes[I].Tok->isNot(tok::comment))
- LineIsComment = false;
-
- if (Changes[I].Tok->is(TT_CaseLabelColon)) {
- LineIsEmptyCase =
- !Changes[I].Tok->Next || Changes[I].Tok->Next->isTrailingComment();
-
- if (LineIsEmptyCase) {
- if (Style.AlignConsecutiveShortCaseStatements.AlignCaseColons) {
- MinEmptyCaseColumn =
- std::max(MinEmptyCaseColumn, Changes[I].StartOfTokenColumn);
- } else {
- MinEmptyCaseColumn =
- std::max(MinEmptyCaseColumn, Changes[I].StartOfTokenColumn + 2);
- }
- }
- }
-
- if (!Matches(Changes[I]))
- continue;
-
- if (LineIsEmptyCase)
- continue;
-
- FoundMatchOnLine = true;
-
- if (StartOfSequence == 0)
- StartOfSequence = I;
-
- EndOfSequence = I + 1;
-
- MinColumn = std::max(MinColumn, Changes[I].StartOfTokenColumn);
-
- // Allow empty case statements to push out our alignment.
- MinColumn = std::max(MinColumn, MinEmptyCaseColumn);
- }
-
- AlignMatchingTokenSequence(StartOfSequence, EndOfSequence, MinColumn, Matches,
- Changes);
-}
-
void WhitespaceManager::alignConsecutiveDeclarations() {
if (!Style.AlignConsecutiveDeclarations.Enabled)
return;
diff --git a/clang/lib/Format/WhitespaceManager.h b/clang/lib/Format/WhitespaceManager.h
index df7e9add1cd446..cadfc1eefa5c5e 100644
--- a/clang/lib/Format/WhitespaceManager.h
+++ b/clang/lib/Format/WhitespaceManager.h
@@ -232,9 +232,6 @@ class WhitespaceManager {
/// Align consecutive declarations over all \c Changes.
void alignChainedConditionals();
- /// Align consecutive short case statements over all \c Changes.
- void alignConsecutiveShortCaseStatements();
-
/// Align trailing comments over all \c Changes.
void alignTrailingComments();
diff --git a/clang/unittests/Format/ConfigParseTest.cpp b/clang/unittests/Format/ConfigParseTest.cpp
index e979aed0b2c6f5..7903db12225f8c 100644
--- a/clang/unittests/Format/ConfigParseTest.cpp
+++ b/clang/unittests/Format/ConfigParseTest.cpp
@@ -195,11 +195,6 @@ TEST(ConfigParseTest, ParsesConfigurationBools) {
CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
CHECK_PARSE_BOOL(VerilogBreakBetweenInstancePorts);
- CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, Enabled);
- CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements,
- AcrossEmptyLines);
- CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AcrossComments);
- CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AlignCaseColons);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index ebf1d759f62211..3e24a996595678 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -19261,240 +19261,6 @@ TEST_F(FormatTest, AlignConsecutiveDeclarations) {
BracedAlign);
}
-TEST_F(FormatTest, AlignConsecutiveShortCaseStatements) {
- FormatStyle Alignment = getLLVMStyle();
- Alignment.AllowShortCaseLabelsOnASingleLine = true;
- Alignment.AlignConsecutiveShortCaseStatements.Enabled = true;
-
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "default: return \"default\";\n"
- "}",
- Alignment);
-
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "}",
- "switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning:\n"
- " return \"warning\";\n"
- "}",
- Alignment);
-
- // Empty case statements push out the alignment, but non-short case labels
- // don't.
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::critical:\n"
- "case log::warning:\n"
- "case log::severe: return \"severe\";\n"
- "case log::extra_severe:\n"
- " // comment\n"
- " return \"extra_severe\";\n"
- "}",
- Alignment);
-
- // Verify comments and empty lines break the alignment.
- verifyNoChange("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "// comment\n"
- "case log::critical: return \"critical\";\n"
- "default: return \"default\";\n"
- "\n"
- "case log::severe: return \"severe\";\n"
- "}",
- Alignment);
-
- // Empty case statements don't break the alignment, and potentially push it
- // out.
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning:\n"
- "case log::critical:\n"
- "default: return \"default\";\n"
- "}",
- Alignment);
-
- // Implicit fallthrough cases can be aligned with either a comment or
- // [[fallthrough]]
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: // fallthrough\n"
- "case log::error: return \"error\";\n"
- "case log::critical: /*fallthrough*/\n"
- "case log::severe: return \"severe\";\n"
- "case log::diag: [[fallthrough]];\n"
- "default: return \"default\";\n"
- "}",
- Alignment);
-
- // Verify trailing comment that needs a reflow also gets aligned properly.
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: // fallthrough\n"
- "case log::error: return \"error\";\n"
- "}",
- "switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: //fallthrough\n"
- "case log::error: return \"error\";\n"
- "}",
- Alignment);
-
- // Verify adjacent non-short case statements don't change the alignment, and
- // properly break the set of consecutive statements.
- verifyFormat("switch (level) {\n"
- "case log::critical:\n"
- " // comment\n"
- " return \"critical\";\n"
- "case log::info: return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "default:\n"
- " // comment\n"
- " return \"\";\n"
- "case log::error: return \"error\";\n"
- "case log::severe: return \"severe\";\n"
- "case log::extra_critical:\n"
- " // comment\n"
- " return \"extra critical\";\n"
- "}",
- Alignment);
-
- Alignment.SpaceBeforeCaseColon = true;
- verifyFormat("switch (level) {\n"
- "case log::info : return \"info\";\n"
- "case log::warning : return \"warning\";\n"
- "default : return \"default\";\n"
- "}",
- Alignment);
- Alignment.SpaceBeforeCaseColon = false;
-
- // Make sure we don't incorrectly align correctly across nested switch cases.
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "case log::other:\n"
- " switch (sublevel) {\n"
- " case log::info: return \"info\";\n"
- " case log::warning: return \"warning\";\n"
- " }\n"
- " break;\n"
- "case log::error: return \"error\";\n"
- "default: return \"default\";\n"
- "}",
- "switch (level) {\n"
- "case log::info: return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "case log::other: switch (sublevel) {\n"
- " case log::info: return \"info\";\n"
- " case log::warning: return \"warning\";\n"
- "}\n"
- "break;\n"
- "case log::error: return \"error\";\n"
- "default: return \"default\";\n"
- "}",
- Alignment);
-
- Alignment.AlignConsecutiveShortCaseStatements.AcrossEmptyLines = true;
-
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "\n"
- "case log::warning: return \"warning\";\n"
- "}",
- "switch (level) {\n"
- "case log::info: return \"info\";\n"
- "\n"
- "case log::warning: return \"warning\";\n"
- "}",
- Alignment);
-
- Alignment.AlignConsecutiveShortCaseStatements.AcrossComments = true;
-
- verifyNoChange("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "\n"
- "/* block comment */\n"
- "\n"
- "// line comment\n"
- "case log::warning: return \"warning\";\n"
- "}",
- Alignment);
-
- Alignment.AlignConsecutiveShortCaseStatements.AcrossEmptyLines = false;
-
- verifyFormat("switch (level) {\n"
- "case log::info: return \"info\";\n"
- "//\n"
- "case log::warning: return \"warning\";\n"
- "}",
- Alignment);
-
- Alignment.AlignConsecutiveShortCaseStatements.AlignCaseColons = true;
-
- verifyFormat("switch (level) {\n"
- "case log::info : return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "default : return \"default\";\n"
- "}",
- Alignment);
-
- // With AlignCaseColons, empty case statements don't break alignment of
- // consecutive case statements (and are aligned).
- verifyFormat("switch (level) {\n"
- "case log::info : return \"info\";\n"
- "case log::warning :\n"
- "case log::critical:\n"
- "default : return \"default\";\n"
- "}",
- Alignment);
-
- // Final non-short case labels shouldn't have their colon aligned
- verifyFormat("switch (level) {\n"
- "case log::info : return \"info\";\n"
- "case log::warning :\n"
- "case log::critical:\n"
- "case log::severe : return \"severe\";\n"
- "default:\n"
- " // comment\n"
- " return \"default\";\n"
- "}",
- Alignment);
-
- // Verify adjacent non-short case statements break the set of consecutive
- // alignments and aren't aligned with adjacent non-short case statements if
- // AlignCaseColons is set.
- verifyFormat("switch (level) {\n"
- "case log::critical:\n"
- " // comment\n"
- " return \"critical\";\n"
- "case log::info : return \"info\";\n"
- "case log::warning: return \"warning\";\n"
- "default:\n"
- " // comment\n"
- " return \"\";\n"
- "case log::error : return \"error\";\n"
- "case log::severe: return \"severe\";\n"
- "case log::extra_critical:\n"
- " // comment\n"
- " return \"extra critical\";\n"
- "}",
- Alignment);
-
- Alignment.SpaceBeforeCaseColon = true;
- verifyFormat("switch (level) {\n"
- "case log::info : return \"info\";\n"
- "case log::warning : return \"warning\";\n"
- "case log::error :\n"
- "default : return \"default\";\n"
- "}",
- Alignment);
-}
-
TEST_F(FormatTest, AlignWithLineBreaks) {
auto Style = getLLVMStyleWithColumns(120);
More information about the cfe-commits
mailing list