Unverified Commit be11e2b3 authored by Gedare Bloom's avatar Gedare Bloom Committed by GitHub
Browse files

[clang-format] Fix nested parsing of AlignAfterOpenBracket (#192283)

When parsing AlignAfterOpenBracket a default backward compatibility
option is always used even if an inherited style option was set. Avoid
using the default setting unless one of the backward compatible enum
type options is found.

Fixes #183845
Fixes #190758
parent f242ad87
Loading
Loading
Loading
Loading
+43 −14
Original line number Diff line number Diff line
@@ -39,7 +39,8 @@ enum BracketAlignmentStyle : int8_t {
  BAS_Align,
  BAS_DontAlign,
  BAS_AlwaysBreak,
  BAS_BlockIndent
  BAS_BlockIndent,
  BAS_Ignore
};

namespace llvm {
@@ -1109,7 +1110,7 @@ template <> struct MappingTraits<FormatStyle> {
      IO.mapOptional("AlignAfterOpenBracket", Style.AlignAfterOpenBracket);
    } else {
      // For backward compatibility.
      BracketAlignmentStyle LocalBAS = BAS_Align;
      BracketAlignmentStyle LocalBAS = BAS_Ignore;
      if (IsGoogleOrChromium) {
        FormatStyle::LanguageKind Language = Style.Language;
        if (Language == FormatStyle::LK_None)
@@ -1122,6 +1123,10 @@ template <> struct MappingTraits<FormatStyle> {
        LocalBAS = BAS_DontAlign;
      }
      IO.mapOptional("AlignAfterOpenBracket", LocalBAS);

      switch (LocalBAS) {
      case BAS_DontAlign:
        Style.AlignAfterOpenBracket = false;
        Style.BreakAfterOpenBracketBracedList = false;
        Style.BreakAfterOpenBracketFunction = false;
        Style.BreakAfterOpenBracketIf = false;
@@ -1132,23 +1137,47 @@ template <> struct MappingTraits<FormatStyle> {
        Style.BreakBeforeCloseBracketIf = false;
        Style.BreakBeforeCloseBracketLoop = false;
        Style.BreakBeforeCloseBracketSwitch = false;

      switch (LocalBAS) {
      case BAS_DontAlign:
        Style.AlignAfterOpenBracket = false;
        break;
      case BAS_BlockIndent:
        Style.AlignAfterOpenBracket = true;
        Style.BreakBeforeCloseBracketBracedList = true;
        Style.BreakBeforeCloseBracketFunction = true;
        Style.BreakBeforeCloseBracketIf = true;
        [[fallthrough]];
        Style.BreakAfterOpenBracketLoop = false;
        Style.BreakAfterOpenBracketSwitch = false;
        Style.BreakBeforeCloseBracketBracedList = false;
        Style.BreakBeforeCloseBracketFunction = false;
        Style.BreakBeforeCloseBracketIf = false;
        Style.BreakBeforeCloseBracketLoop = false;
        Style.BreakBeforeCloseBracketSwitch = false;
        break;
      case BAS_AlwaysBreak:
        Style.AlignAfterOpenBracket = true;
        Style.BreakAfterOpenBracketBracedList = true;
        Style.BreakAfterOpenBracketFunction = true;
        Style.BreakAfterOpenBracketIf = true;
        [[fallthrough]];
        Style.BreakAfterOpenBracketLoop = false;
        Style.BreakAfterOpenBracketSwitch = false;
        Style.BreakBeforeCloseBracketBracedList = false;
        Style.BreakBeforeCloseBracketFunction = false;
        Style.BreakBeforeCloseBracketIf = false;
        Style.BreakBeforeCloseBracketLoop = false;
        Style.BreakBeforeCloseBracketSwitch = false;
        break;
      case BAS_Align:
        Style.AlignAfterOpenBracket = true;
        Style.BreakAfterOpenBracketBracedList = false;
        Style.BreakAfterOpenBracketFunction = false;
        Style.BreakAfterOpenBracketIf = false;
        Style.BreakAfterOpenBracketLoop = false;
        Style.BreakAfterOpenBracketSwitch = false;
        Style.BreakBeforeCloseBracketBracedList = false;
        Style.BreakBeforeCloseBracketFunction = false;
        Style.BreakBeforeCloseBracketIf = false;
        Style.BreakBeforeCloseBracketLoop = false;
        Style.BreakBeforeCloseBracketSwitch = false;
        break;
      case BAS_Ignore:
        break;
      }
    }
+4 −1
Original line number Diff line number Diff line
@@ -1712,7 +1712,8 @@ TEST(ConfigParseTest, GetStyleOfFile) {
  // Test 9.8: use inheritance from a file without BasedOnStyle
  ASSERT_TRUE(FS.addFile(
      "/e/withoutbase/.clang-format", 0,
      llvm::MemoryBuffer::getMemBuffer("BracedInitializerIndentWidth: 2\n"
      llvm::MemoryBuffer::getMemBuffer("AlignAfterOpenBracket: false\n"
                                       "BracedInitializerIndentWidth: 2\n"
                                       "ColumnLimit: 123")));
  ASSERT_TRUE(
      FS.addFile("/e/withoutbase/sub/.clang-format", 0,
@@ -1723,6 +1724,7 @@ TEST(ConfigParseTest, GetStyleOfFile) {
  ASSERT_TRUE(static_cast<bool>(Style9));
  ASSERT_EQ(*Style9, [] {
    auto Style = getLLVMStyle();
    Style.AlignAfterOpenBracket = false;
    Style.BracedInitializerIndentWidth = 2;
    Style.ColumnLimit = 123;
    return Style;
@@ -1732,6 +1734,7 @@ TEST(ConfigParseTest, GetStyleOfFile) {
  ASSERT_TRUE(static_cast<bool>(Style9));
  ASSERT_EQ(*Style9, [] {
    auto Style = getLLVMStyle();
    Style.AlignAfterOpenBracket = false;
    Style.BracedInitializerIndentWidth = 2;
    Style.ColumnLimit = 123;
    Style.IndentWidth = 7;