From: Mark Zeren Date: Mon, 5 Feb 2018 14:47:04 +0000 (+0000) Subject: Revert "[clang-format] Fixup #include guard indents after parseFile()" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=df40d20b431807c85c21bd77da2549e1ba925eed;p=clang Revert "[clang-format] Fixup #include guard indents after parseFile()" This reverts r324238 | mzeren-vmw | 2018-02-05 06:35:54 -0800 (Mon, 05 Feb 2018) | 35 lines Incorrect version pushed upstream. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@324239 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Format/UnwrappedLineParser.cpp b/lib/Format/UnwrappedLineParser.cpp index a374ce70c0..1057fabb77 100644 --- a/lib/Format/UnwrappedLineParser.cpp +++ b/lib/Format/UnwrappedLineParser.cpp @@ -234,15 +234,14 @@ UnwrappedLineParser::UnwrappedLineParser(const FormatStyle &Style, CurrentLines(&Lines), Style(Style), Keywords(Keywords), CommentPragmasRegex(Style.CommentPragmas), Tokens(nullptr), Callback(Callback), AllTokens(Tokens), PPBranchLevel(-1), - IncludeGuard(Style.IndentPPDirectives == FormatStyle::PPDIS_None - ? IG_Rejected - : IG_Inited), - IncludeGuardToken(nullptr), FirstStartColumn(FirstStartColumn) {} + IfNdefCondition(nullptr), FoundIncludeGuardStart(false), + IncludeGuardRejected(false), FirstStartColumn(FirstStartColumn) {} void UnwrappedLineParser::reset() { PPBranchLevel = -1; - IncludeGuard = IG_Inited; - IncludeGuardToken = nullptr; + IfNdefCondition = nullptr; + FoundIncludeGuardStart = false; + IncludeGuardRejected = false; Line.reset(new UnwrappedLine); CommentsBeforeNextToken.clear(); FormatTok = nullptr; @@ -265,14 +264,6 @@ void UnwrappedLineParser::parse() { readToken(); parseFile(); - - // If we found an include guard then all preprocessor directives (other than - // the guard) are over-indented by one. - if (IncludeGuard == IG_Found) - for (auto &Line : Lines) - if (Line.InPPDirective && Line.Level > 0) - --Line.Level; - // Create line with eof token. pushToken(FormatTok); addUnwrappedLine(); @@ -733,11 +724,11 @@ void UnwrappedLineParser::parsePPIf(bool IfDef) { // If there's a #ifndef on the first line, and the only lines before it are // comments, it could be an include guard. bool MaybeIncludeGuard = IfNDef; - if (IncludeGuard == IG_Inited && MaybeIncludeGuard) { + if (!IncludeGuardRejected && !FoundIncludeGuardStart && MaybeIncludeGuard) { for (auto &Line : Lines) { if (!Line.Tokens.front().Tok->is(tok::comment)) { MaybeIncludeGuard = false; - IncludeGuard = IG_Rejected; + IncludeGuardRejected = true; break; } } @@ -745,16 +736,14 @@ void UnwrappedLineParser::parsePPIf(bool IfDef) { --PPBranchLevel; parsePPUnknown(); ++PPBranchLevel; - if (IncludeGuard == IG_Inited && MaybeIncludeGuard) { - IncludeGuard = IG_IfNdefed; - IncludeGuardToken = IfCondition; - } + if (!IncludeGuardRejected && !FoundIncludeGuardStart && MaybeIncludeGuard) + IfNdefCondition = IfCondition; } void UnwrappedLineParser::parsePPElse() { // If a potential include guard has an #else, it's not an include guard. - if (IncludeGuard == IG_Defined && PPBranchLevel == 0) - IncludeGuard = IG_Rejected; + if (FoundIncludeGuardStart && PPBranchLevel == 0) + FoundIncludeGuardStart = false; conditionalCompilationAlternative(); if (PPBranchLevel > -1) --PPBranchLevel; @@ -768,37 +757,34 @@ void UnwrappedLineParser::parsePPEndIf() { conditionalCompilationEnd(); parsePPUnknown(); // If the #endif of a potential include guard is the last thing in the file, - // then we found an include guard. + // then we count it as a real include guard and subtract one from every + // preprocessor indent. unsigned TokenPosition = Tokens->getPosition(); FormatToken *PeekNext = AllTokens[TokenPosition]; - if (IncludeGuard == IG_Defined && PPBranchLevel == -1 && - PeekNext->is(tok::eof) && + if (FoundIncludeGuardStart && PPBranchLevel == -1 && PeekNext->is(tok::eof) && Style.IndentPPDirectives != FormatStyle::PPDIS_None) - IncludeGuard = IG_Found; + for (auto &Line : Lines) + if (Line.InPPDirective && Line.Level > 0) + --Line.Level; } void UnwrappedLineParser::parsePPDefine() { nextToken(); if (FormatTok->Tok.getKind() != tok::identifier) { - IncludeGuard = IG_Rejected; - IncludeGuardToken = nullptr; parsePPUnknown(); return; } - - if (IncludeGuard == IG_IfNdefed && - IncludeGuardToken->TokenText == FormatTok->TokenText) { - IncludeGuard = IG_Defined; - IncludeGuardToken = nullptr; + if (IfNdefCondition && IfNdefCondition->TokenText == FormatTok->TokenText) { + FoundIncludeGuardStart = true; for (auto &Line : Lines) { if (!Line.Tokens.front().Tok->isOneOf(tok::comment, tok::hash)) { - IncludeGuard = IG_Rejected; + FoundIncludeGuardStart = false; break; } } } - + IfNdefCondition = nullptr; nextToken(); if (FormatTok->Tok.getKind() == tok::l_paren && FormatTok->WhitespaceRange.getBegin() == @@ -825,6 +811,7 @@ void UnwrappedLineParser::parsePPUnknown() { if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash) Line->Level += PPBranchLevel + 1; addUnwrappedLine(); + IfNdefCondition = nullptr; } // Here we blacklist certain tokens that are not usually the first token in an diff --git a/lib/Format/UnwrappedLineParser.h b/lib/Format/UnwrappedLineParser.h index 99f0209e43..62238aba87 100644 --- a/lib/Format/UnwrappedLineParser.h +++ b/lib/Format/UnwrappedLineParser.h @@ -248,23 +248,10 @@ private: // sequence. std::stack PPChainBranchIndex; - // Include guard search state. Used to fixup preprocessor indent levels - // so that include guards do not participate in indentation. - enum IncludeGuardState { - IG_Inited, - IG_IfNdefed, - IG_Defined, - IG_Found, - IG_Rejected, - }; - - // Current state of include guard search. - IncludeGuardState IncludeGuard; - - // Points to the #ifndef condition for a potential include guard. Null unless - // IncludeGuardState == IG_IfNdefed. - FormatToken *IncludeGuardToken; - + // Contains the #ifndef condition for a potential include guard. + FormatToken *IfNdefCondition; + bool FoundIncludeGuardStart; + bool IncludeGuardRejected; // Contains the first start column where the source begins. This is zero for // normal source code and may be nonzero when formatting a code fragment that // does not start at the beginning of the file. diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index e5e8fde64c..cbabc459c4 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -2547,20 +2547,6 @@ TEST_F(FormatTest, IndentPreprocessorDirectives) { "#elif FOO\n" "#endif", Style); - // Non-identifier #define after potential include guard. - verifyFormat("#ifndef FOO\n" - "# define 1\n" - "#endif\n", - Style); - // #if closes past last non-preprocessor line. - verifyFormat("#ifndef FOO\n" - "#define FOO\n" - "#if 1\n" - "int i;\n" - "# define A 0\n" - "#endif\n" - "#endif\n", - Style); // FIXME: This doesn't handle the case where there's code between the // #ifndef and #define but all other conditions hold. This is because when // the #define line is parsed, UnwrappedLineParser::Lines doesn't hold the