From ea7a27b847b8eca39e427b430381e6b2cbf349f3 Mon Sep 17 00:00:00 2001 From: Ben Hamilton Date: Tue, 27 Mar 2018 15:01:21 +0000 Subject: [PATCH] [clang-format] Refine ObjC guesser to handle child lines of child lines Summary: This fixes an issue brought up by djasper@ in his review of D44790. We handled top-level child lines, but if those child lines themselves had child lines, we didn't handle them. Rather than use recursion (which could blow out the stack), I use a DenseSet to hold the set of lines we haven't yet checked (since order doesn't matter), and update the set to add the children of each line as we check it. Test Plan: New tests added. Confirmed tests failed before fix and passed after fix. Reviewers: djasper Reviewed By: djasper Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D44831 llvm-svn: 328628 --- clang/lib/Format/Format.cpp | 13 +++---------- clang/unittests/Format/FormatTest.cpp | 6 ++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index ac22d6b4501b..f7e74abab37b 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1514,8 +1514,8 @@ private: "UIView", }; - auto LineContainsObjCCode = [&Keywords](const AnnotatedLine &Line) { - for (const FormatToken *FormatTok = Line.First; FormatTok; + for (auto Line : AnnotatedLines) { + for (const FormatToken *FormatTok = Line->First; FormatTok; FormatTok = FormatTok->Next) { if ((FormatTok->Previous && FormatTok->Previous->is(tok::at) && (FormatTok->isObjCAtKeyword(tok::objc_interface) || @@ -1535,14 +1535,7 @@ private: TT_ObjCMethodSpecifier, TT_ObjCProperty)) { return true; } - } - return false; - }; - for (auto Line : AnnotatedLines) { - if (LineContainsObjCCode(*Line)) - return true; - for (auto ChildLine : Line->Children) { - if (LineContainsObjCCode(*ChildLine)) + if (guessIsObjC(Line->Children, Keywords)) return true; } } diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index c1250283a131..819ab3c44a5b 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -12159,6 +12159,12 @@ TEST_F(FormatTest, GuessLanguageWithChildLines) { guessLanguage("foo.h", "#define FOO ({ std::string s; })")); EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); + EXPECT_EQ( + FormatStyle::LK_Cpp, + guessLanguage("foo.h", "#define FOO ({ foo(); ({ std::string s; }) })")); + EXPECT_EQ( + FormatStyle::LK_ObjC, + guessLanguage("foo.h", "#define FOO ({ foo(); ({ NSString *s; }) })")); } } // end namespace