goldstein.w.n updated this revision to Diff 473489.
goldstein.w.n added a comment.



1. Updating D137181 <https://reviews.llvm.org/D137181>: [clang-format] Don't 
use 'PPIndentWidth' inside multi-line macros #
2. Enter a brief description of the changes included in this update.
3. The first line is used as subject, next lines as comment. #
4. If you intended to create a new revision, use:
5. $ arc diff --create

Make it so that code indentation always starts where 'd' in "define" is.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137181/new/

https://reviews.llvm.org/D137181

Files:
  clang/lib/Format/MacroCallReconstructor.cpp
  clang/lib/Format/Macros.h
  clang/lib/Format/TokenAnnotator.cpp
  clang/lib/Format/TokenAnnotator.h
  clang/lib/Format/UnwrappedLineFormatter.cpp
  clang/lib/Format/UnwrappedLineParser.cpp
  clang/lib/Format/UnwrappedLineParser.h
  clang/unittests/Format/FormatTest.cpp
  clang/unittests/Format/MacroCallReconstructorTest.cpp

Index: clang/unittests/Format/MacroCallReconstructorTest.cpp
===================================================================
--- clang/unittests/Format/MacroCallReconstructorTest.cpp
+++ clang/unittests/Format/MacroCallReconstructorTest.cpp
@@ -194,7 +194,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("X");
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Unexp.addLine(line(Exp.getTokens()));
   EXPECT_TRUE(Unexp.finished());
   Matcher U(Call, Lex);
@@ -206,7 +206,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("C", {"void f()"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line(E.consume("class X {")));
   EXPECT_FALSE(Unexp.finished());
@@ -228,7 +228,7 @@
 
   UnexpandedMap Unexpanded =
       mergeUnexpanded(Exp1.getUnexpanded(), Exp2.getUnexpanded());
-  MacroCallReconstructor Unexp(0, Unexpanded);
+  MacroCallReconstructor Unexp(0, 0, Unexpanded);
   Matcher E(Exp2.getTokens(), Lex);
   Unexp.addLine(line(E.consume("a")));
   EXPECT_FALSE(Unexp.finished());
@@ -257,7 +257,7 @@
   TokenList Call2 = Exp.expand("SEMI");
   TokenList Call3 = Exp.expand("SEMI");
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line(E.consume(";")));
   EXPECT_TRUE(Unexp.finished());
@@ -296,7 +296,7 @@
   // }
   UnexpandedMap Unexpanded =
       mergeUnexpanded(Exp1.getUnexpanded(), Exp2.getUnexpanded());
-  MacroCallReconstructor Unexp(0, Unexpanded);
+  MacroCallReconstructor Unexp(0, 0, Unexpanded);
   Matcher E(Exp2.getTokens(), Lex);
   Unexp.addLine(line(E.consume("{")));
   EXPECT_FALSE(Unexp.finished());
@@ -357,7 +357,7 @@
   UnexpandedMap Unexpanded = mergeUnexpanded(
       Exp1.getUnexpanded(),
       mergeUnexpanded(Exp2.getUnexpanded(), Exp3.getUnexpanded()));
-  MacroCallReconstructor Unexp(0, Unexpanded);
+  MacroCallReconstructor Unexp(0, 0, Unexpanded);
   Matcher E(Exp3.getTokens(), Lex);
   Unexp.addLine(line(E.consume("{")));
   Unexp.addLine(
@@ -409,7 +409,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("CALL", {std::string("int a"), "int b"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line({
       E.consume("f([] {"),
@@ -430,7 +430,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("CALL", {std::string("x"), "y"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line(E.consume("y + x")));
   EXPECT_TRUE(Unexp.finished());
@@ -444,7 +444,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("ID", {std::string("x; x"), "y"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line(E.consume("x;")));
   Unexp.addLine(line(E.consume("x y")));
@@ -482,7 +482,7 @@
   // 2: }
   UnexpandedMap Unexpanded =
       mergeUnexpanded(Exp1.getUnexpanded(), Exp2.getUnexpanded());
-  MacroCallReconstructor Unexp(0, Unexpanded);
+  MacroCallReconstructor Unexp(0, 0, Unexpanded);
   Matcher E(Exp2.getTokens(), Lex);
   Unexp.addLine(line(E.consume("{")));
   Unexp.addLine(line(E.consume("a * b;")));
@@ -524,7 +524,7 @@
 
   auto Prefix = tokens("int a = []() {");
   auto Postfix = tokens("}();");
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line({
       Prefix,
@@ -560,7 +560,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("X", {"a", "b", "c"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Unexp.addLine(line(Exp.getTokens()));
   EXPECT_TRUE(Unexp.finished());
   Matcher U(Call, Lex);
@@ -573,7 +573,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("X", {std::string("")});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   auto Semi = tokens(";");
   Unexp.addLine(line({E.consume("x"), Semi}));
@@ -588,7 +588,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("CALL", {std::string("{ a;"), "b; }"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   Unexp.addLine(line({
       E.consume("f([]() {"),
@@ -613,7 +613,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("CALL", {std::string("{ a"), "b"});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   auto Semi = tokens(";");
   auto SecondLine = tokens("c d;");
@@ -651,7 +651,7 @@
   Expansion Exp(Lex, *Macros);
   TokenList Call = Exp.expand("M", {std::string("{"), "x", ""});
 
-  MacroCallReconstructor Unexp(0, Exp.getUnexpanded());
+  MacroCallReconstructor Unexp(0, 0, Exp.getUnexpanded());
   Matcher E(Exp.getTokens(), Lex);
   auto Prefix = tokens("({");
   Unexp.addLine(line({
Index: clang/unittests/Format/FormatTest.cpp
===================================================================
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -5040,6 +5040,157 @@
                "  int y = 0;\n"
                "}",
                style);
+
+  style.IndentPPDirectives = FormatStyle::PPDIS_None;
+  verifyFormat("#ifdef foo\n"
+               "#define bar() \\\n"
+               " if (A) {     \\\n"
+               "     B();     \\\n"
+               " }            \\\n"
+               " C();\n"
+               "#endif",
+               style);
+  verifyFormat("if (emacs) {\n"
+               "#ifdef is\n"
+               "#define lit        \\\n"
+               " if (af) {         \\\n"
+               "     return duh(); \\\n"
+               " }\n"
+               "#endif\n"
+               "}",
+               style);
+  verifyFormat("#if abc\n"
+               "#ifdef foo\n"
+               "#define bar() \\\n"
+               " if (A) {     \\\n"
+               "     if (B) { \\\n"
+               "         C(); \\\n"
+               "     }        \\\n"
+               " }            \\\n"
+               " D();\n"
+               "#endif\n"
+               "#endif",
+               style);
+  verifyFormat("#ifndef foo\n"
+               "#define foo\n"
+               "if (emacs) {\n"
+               "#ifdef is\n"
+               "#define lit        \\\n"
+               " if (af) {         \\\n"
+               "     return duh(); \\\n"
+               " }\n"
+               "#endif\n"
+               "}\n"
+               "#endif",
+               style);
+  #if 1
+  style.IndentPPDirectives = FormatStyle::PPDIS_AfterHash;
+  verifyFormat("#ifdef foo\n"
+               "# define bar() \\\n"
+               "  if (A) {     \\\n"
+               "      B();     \\\n"
+               "  }            \\\n"
+               "  C();\n"
+               "#endif",
+               style);
+  verifyFormat("if (emacs) {\n"
+               "#ifdef is\n"
+               "# define lit        \\\n"
+               "  if (af) {         \\\n"
+               "      return duh(); \\\n"
+               "  }\n"
+               "#endif\n"
+               "}",
+               style);
+  verifyFormat("#if abc\n"
+               "# ifdef foo\n"
+               "#  define bar() \\\n"
+               "   if (A) {     \\\n"
+               "       if (B) { \\\n"
+               "           C(); \\\n"
+               "       }        \\\n"
+               "   }            \\\n"
+               "   D();\n"
+               "# endif\n"
+               "#endif",
+               style);
+  verifyFormat("#if abc\n"
+               "# ifdef foo\n"
+               "#  define bar() \\\n"
+               "   if (A) {     \\\n"
+               "       B();     \\\n"
+               "   }            \\\n"
+               "   C();\n"
+               "# endif\n"
+               "#endif",
+               style);
+  verifyFormat("#ifndef foo\n"
+               "#define foo\n"
+               "if (emacs) {\n"
+               "#ifdef is\n"
+               "# define lit        \\\n"
+               "  if (af) {         \\\n"
+               "      return duh(); \\\n"
+               "  }\n"
+               "#endif\n"
+               "}\n"
+               "#endif",
+               style);
+
+  style.IndentPPDirectives = FormatStyle::PPDIS_BeforeHash;
+  verifyFormat("#ifdef foo\n"
+               " #define bar() \\\n"
+               "  if (A) {     \\\n"
+               "      B();     \\\n"
+               "  }            \\\n"
+               "  C();\n"
+               "#endif",
+               style);
+  verifyFormat("if (emacs) {\n"
+               "#ifdef is\n"
+               " #define lit        \\\n"
+               "  if (af) {         \\\n"
+               "      return duh(); \\\n"
+               "  }\n"
+               "#endif\n"
+               "}",
+               style);
+  verifyFormat("#if abc\n"
+               " #ifdef foo\n"
+               "  #define bar() \\\n"
+               "   if (A) {     \\\n"
+               "       if (B) { \\\n"
+               "           C(); \\\n"
+               "       }        \\\n"
+               "   }            \\\n"
+               "   D();\n"
+               " #endif\n"
+               "#endif",
+               style);
+  verifyFormat("#if abc\n"
+               " #ifdef foo\n"
+               "  #define bar() \\\n"
+               "   if (A) {     \\\n"
+               "       B();     \\\n"
+               "   }            \\\n"
+               "   C();\n"
+               " #endif\n"
+               "#endif",
+               style);
+  verifyFormat("#ifndef foo\n"
+               "#define foo\n"
+               "if (emacs) {\n"
+               "#ifdef is\n"
+               " #define lit        \\\n"
+               "  if (af) {         \\\n"
+               "      return duh(); \\\n"
+               "  }\n"
+               "#endif\n"
+               "}\n"
+               "#endif",
+               style);
+  #endif
+
 }
 
 TEST_F(FormatTest, IndentsPPDirectiveInReducedSpace) {
Index: clang/lib/Format/UnwrappedLineParser.h
===================================================================
--- clang/lib/Format/UnwrappedLineParser.h
+++ clang/lib/Format/UnwrappedLineParser.h
@@ -44,6 +44,9 @@
   /// The indent level of the \c UnwrappedLine.
   unsigned Level;
 
+  /// The preprocessor indent level of the \c UnwrappedLine.
+  int PPLevel;
+
   /// Whether this \c UnwrappedLine is part of a preprocessor directive.
   bool InPPDirective;
   /// Whether this \c UnwrappedLine is part of a pramga directive.
Index: clang/lib/Format/UnwrappedLineParser.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineParser.cpp
+++ clang/lib/Format/UnwrappedLineParser.cpp
@@ -109,12 +109,14 @@
   ScopedMacroState(UnwrappedLine &Line, FormatTokenSource *&TokenSource,
                    FormatToken *&ResetToken)
       : Line(Line), TokenSource(TokenSource), ResetToken(ResetToken),
-        PreviousLineLevel(Line.Level), PreviousTokenSource(TokenSource),
-        Token(nullptr), PreviousToken(nullptr) {
+        PreviousLineLevel(Line.Level), PreviousLinePPLevel(Line.PPLevel),
+        PreviousTokenSource(TokenSource), Token(nullptr),
+        PreviousToken(nullptr) {
     FakeEOF.Tok.startToken();
     FakeEOF.Tok.setKind(tok::eof);
     TokenSource = this;
     Line.Level = 0;
+    Line.PPLevel = 0;
     Line.InPPDirective = true;
     // InMacroBody gets set after the `#define x` part.
   }
@@ -125,6 +127,7 @@
     Line.InPPDirective = false;
     Line.InMacroBody = false;
     Line.Level = PreviousLineLevel;
+    Line.PPLevel = PreviousLinePPLevel;
   }
 
   FormatToken *getNextToken() override {
@@ -177,6 +180,7 @@
   FormatTokenSource *&TokenSource;
   FormatToken *&ResetToken;
   unsigned PreviousLineLevel;
+  unsigned PreviousLinePPLevel;
   FormatTokenSource *PreviousTokenSource;
 
   FormatToken *Token;
@@ -197,6 +201,7 @@
     PreBlockLine = std::move(Parser.Line);
     Parser.Line = std::make_unique<UnwrappedLine>();
     Parser.Line->Level = PreBlockLine->Level;
+    Parser.Line->PPLevel = PreBlockLine->PPLevel;
     Parser.Line->InPPDirective = PreBlockLine->InPPDirective;
     Parser.Line->InMacroBody = PreBlockLine->InMacroBody;
   }
@@ -364,8 +369,10 @@
     // the guard) are over-indented by one.
     if (IncludeGuard == IG_Found) {
       for (auto &Line : Lines)
-        if (Line.InPPDirective && Line.Level > 0)
+        if (Line.InPPDirective && Line.Level > 0) {
+          --Line.PPLevel;
           --Line.Level;
+        }
     }
 
     // Create line with eof token.
@@ -590,6 +597,8 @@
       if (!SwitchLabelEncountered &&
           (Style.IndentCaseLabels ||
            (Line->InPPDirective && Line->Level == 1))) {
+        if (Line->InPPDirective)
+          ++Line->PPLevel;
         ++Line->Level;
       }
       SwitchLabelEncountered = true;
@@ -873,6 +882,7 @@
   size_t PPStartHash = computePPHash();
 
   const unsigned InitialLevel = Line->Level;
+  const int InitialPPLevel = Line->PPLevel;
   if (VerilogHierarchy) {
     AddLevels += parseVerilogHierarchyHeader();
   } else {
@@ -916,6 +926,7 @@
   if (MacroBlock ? !FormatTok->is(TT_MacroBlockEnd)
                  : !FormatTok->is(tok::r_brace)) {
     Line->Level = InitialLevel;
+    Line->PPLevel = InitialPPLevel;
     FormatTok->setBlockKind(BK_Block);
     return IfLBrace;
   }
@@ -979,6 +990,7 @@
     parseParens();
 
   Line->Level = InitialLevel;
+  Line->PPLevel = InitialPPLevel;
 
   if (FormatTok->is(tok::kw_noexcept)) {
     // A noexcept in a requires expression.
@@ -1269,10 +1281,13 @@
       !FormatTok->hasWhitespaceBefore()) {
     parseParens();
   }
-  if (Style.IndentPPDirectives != FormatStyle::PPDIS_None)
+  if (Style.IndentPPDirectives != FormatStyle::PPDIS_None) {
     Line->Level += PPBranchLevel + 1;
+    Line->PPLevel += PPBranchLevel + 1;
+  }
   addUnwrappedLine();
   ++Line->Level;
+  ++Line->PPLevel;
   Line->InMacroBody = true;
 
   // Errors during a preprocessor directive can only affect the layout of the
@@ -1292,8 +1307,10 @@
   do {
     nextToken();
   } while (!eof());
-  if (Style.IndentPPDirectives != FormatStyle::PPDIS_None)
+  if (Style.IndentPPDirectives != FormatStyle::PPDIS_None) {
     Line->Level += PPBranchLevel + 1;
+    Line->PPLevel += PPBranchLevel + 1;
+  }
   addUnwrappedLine();
 }
 
@@ -3110,8 +3127,12 @@
 void UnwrappedLineParser::parseLabel(bool LeftAlignLabel) {
   nextToken();
   unsigned OldLineLevel = Line->Level;
-  if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0))
+  unsigned OldLinePPLevel = Line->PPLevel;
+  if (Line->Level > 1 || (!Line->InPPDirective && Line->Level > 0)) {
+    if (Line->InPPDirective)
+      --Line->PPLevel;
     --Line->Level;
+  }
   if (LeftAlignLabel)
     Line->Level = 0;
 
@@ -3140,6 +3161,7 @@
     addUnwrappedLine();
   }
   Line->Level = OldLineLevel;
+  Line->PPLevel = OldLinePPLevel;
   if (FormatTok->isNot(tok::l_brace)) {
     parseStructuralElement();
     addUnwrappedLine();
@@ -4297,10 +4319,13 @@
   // don't know whether this colon is a label or a ternary expression at this
   // point.
   auto OrigLevel = Line->Level;
+  auto OrigPPLevel = Line->PPLevel;
   auto FirstLine = CurrentLines->size();
-  if (Line->Level == 0 || (Line->InPPDirective && Line->Level <= 1))
+  if (Line->Level == 0 || (Line->InPPDirective && Line->Level <= 1)) {
+    if (Line->InPPDirective)
+      ++Line->PPLevel;
     ++Line->Level;
-  else if (!Style.IndentCaseBlocks && Keywords.isVerilogBegin(*FormatTok))
+  } else if (!Style.IndentCaseBlocks && Keywords.isVerilogBegin(*FormatTok))
     --Line->Level;
   parseStructuralElement();
   // Restore the indentation in both the new line and the line that has the
@@ -4308,6 +4333,7 @@
   if (CurrentLines->size() > FirstLine)
     (*CurrentLines)[FirstLine].Level = OrigLevel;
   Line->Level = OrigLevel;
+  Line->PPLevel = OrigPPLevel;
 }
 
 LLVM_ATTRIBUTE_UNUSED static void printDebugInfo(const UnwrappedLine &Line,
@@ -4632,6 +4658,7 @@
       if (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash &&
           PPBranchLevel > 0) {
         Line->Level += PPBranchLevel;
+        Line->PPLevel += PPBranchLevel;
       }
       flushComments(isOnNewLine(*FormatTok));
       parsePPDirective();
Index: clang/lib/Format/UnwrappedLineFormatter.cpp
===================================================================
--- clang/lib/Format/UnwrappedLineFormatter.cpp
+++ clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -63,9 +63,18 @@
     if (Line.InPPDirective ||
         (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash &&
          Line.Type == LT_CommentAbovePPDirective)) {
-      unsigned IndentWidth =
+      unsigned PPIndentWidth =
           (Style.PPIndentWidth >= 0) ? Style.PPIndentWidth : Style.IndentWidth;
-      Indent = Line.Level * IndentWidth + AdditionalIndent;
+
+      if (Line.InMacroBody && Line.PPLevel > 0 &&
+          static_cast<unsigned>(Line.PPLevel) <= Line.Level) {
+
+        Indent = Line.PPLevel * PPIndentWidth;
+        Indent += (Line.Level - Line.PPLevel) * Style.IndentWidth;
+      } else {
+        Indent = Line.Level * PPIndentWidth;
+      }
+      Indent += AdditionalIndent;
     } else {
       Indent = getIndent(Line.Level);
     }
@@ -78,9 +87,9 @@
   /// Update the indent state given that \p Line indent should be
   /// skipped.
   void skipLine(const AnnotatedLine &Line, bool UnknownIndent = false) {
-    if (Line.Level >= IndentForLevel.size())
-      IndentForLevel.resize(Line.Level + 1, UnknownIndent ? -1 : Indent);
-  }
+  if (Line.Level >= IndentForLevel.size())
+    IndentForLevel.resize(Line.Level + 1, UnknownIndent ? -1 : Indent);
+}
 
   /// Update the level indent to adapt to the given \p Line.
   ///
Index: clang/lib/Format/TokenAnnotator.h
===================================================================
--- clang/lib/Format/TokenAnnotator.h
+++ clang/lib/Format/TokenAnnotator.h
@@ -38,6 +38,7 @@
 public:
   AnnotatedLine(const UnwrappedLine &Line)
       : First(Line.Tokens.front().Tok), Level(Line.Level),
+        PPLevel(Line.PPLevel),
         MatchingOpeningBlockLineIndex(Line.MatchingOpeningBlockLineIndex),
         MatchingClosingBlockLineIndex(Line.MatchingClosingBlockLineIndex),
         InPPDirective(Line.InPPDirective),
@@ -129,6 +130,7 @@
 
   LineType Type;
   unsigned Level;
+  int PPLevel;
   size_t MatchingOpeningBlockLineIndex;
   size_t MatchingClosingBlockLineIndex;
   bool InPPDirective;
Index: clang/lib/Format/TokenAnnotator.cpp
===================================================================
--- clang/lib/Format/TokenAnnotator.cpp
+++ clang/lib/Format/TokenAnnotator.cpp
@@ -973,7 +973,9 @@
           // Colons from ?: are annotated in parseConditional().
           Tok->setType(TT_GotoLabelColon);
           if (Line.Level > 1 || (!Line.InPPDirective && Line.Level > 0))
-            --Line.Level;
+            if (Line.InPPDirective)
+                --Line.PPLevel;
+          --Line.Level;
         }
         break;
       }
@@ -1253,6 +1255,8 @@
       // Unindent case labels.
       if (Style.isVerilog() && Keywords.isVerilogEndOfLabel(*Tok) &&
           (Line.Level > 1 || (!Line.InPPDirective && Line.Level > 0))) {
+        if (Line.InPPDirective)
+          --Line.PPLevel;
         --Line.Level;
       }
       break;
Index: clang/lib/Format/Macros.h
===================================================================
--- clang/lib/Format/Macros.h
+++ clang/lib/Format/Macros.h
@@ -176,6 +176,7 @@
   /// tokens of the spelled macro call.
   MacroCallReconstructor(
       unsigned Level,
+      int PPLevel,
       const llvm::DenseMap<FormatToken *, std::unique_ptr<UnwrappedLine>>
           &ActiveExpansions);
 
@@ -237,7 +238,8 @@
   struct ReconstructedLine;
 
   void appendToken(FormatToken *Token, ReconstructedLine *L = nullptr);
-  UnwrappedLine createUnwrappedLine(const ReconstructedLine &Line, int Level);
+  UnwrappedLine createUnwrappedLine(const ReconstructedLine &Line, int Level,
+                                    int PPLevel);
   void debug(const ReconstructedLine &Line, int Level);
   ReconstructedLine &parentLine();
   ReconstructedLine *currentLine();
@@ -369,6 +371,9 @@
   // Level the generated UnwrappedLine will be at.
   const unsigned Level;
 
+  // PPLevel the generated UnwrappedLine will be at.
+  const int PPLevel;
+
   // Maps from identifier of the macro call to an unwrapped line containing
   // all tokens of the macro call.
   const llvm::DenseMap<FormatToken *, std::unique_ptr<UnwrappedLine>>
Index: clang/lib/Format/MacroCallReconstructor.cpp
===================================================================
--- clang/lib/Format/MacroCallReconstructor.cpp
+++ clang/lib/Format/MacroCallReconstructor.cpp
@@ -41,10 +41,10 @@
 }
 
 MacroCallReconstructor::MacroCallReconstructor(
-    unsigned Level,
+    unsigned Level, int PPLevel,
     const llvm::DenseMap<FormatToken *, std::unique_ptr<UnwrappedLine>>
         &ActiveExpansions)
-    : Level(Level), IdToReconstructed(ActiveExpansions) {
+    : Level(Level), PPLevel(PPLevel), IdToReconstructed(ActiveExpansions) {
   Result.Tokens.push_back(std::make_unique<LineNode>());
   ActiveReconstructedLines.push_back(&Result);
 }
@@ -63,7 +63,7 @@
   assert(Result.Tokens.size() == 1 &&
          Result.Tokens.front()->Children.size() == 1);
   UnwrappedLine Final =
-      createUnwrappedLine(*Result.Tokens.front()->Children.front(), Level);
+      createUnwrappedLine(*Result.Tokens.front()->Children.front(), Level, PPLevel);
   assert(!Final.Tokens.empty());
   return Final;
 }
@@ -502,16 +502,17 @@
 
 UnwrappedLine
 MacroCallReconstructor::createUnwrappedLine(const ReconstructedLine &Line,
-                                            int Level) {
+                                            int Level, int PPLevel) {
   UnwrappedLine Result;
   Result.Level = Level;
+  Result.PPLevel = PPLevel;
   for (const auto &N : Line.Tokens) {
     Result.Tokens.push_back(N->Tok);
     UnwrappedLineNode &Current = Result.Tokens.back();
     for (const auto &Child : N->Children) {
       if (Child->Tokens.empty())
         continue;
-      Current.Children.push_back(createUnwrappedLine(*Child, Level + 1));
+      Current.Children.push_back(createUnwrappedLine(*Child, Level + 1, PPLevel));
     }
     if (Current.Children.size() == 1 &&
         Current.Tok->isOneOf(tok::l_paren, tok::comma)) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to