Index: lib/Format/Format.cpp =================================================================== --- lib/Format/Format.cpp +++ lib/Format/Format.cpp @@ -1514,8 +1514,8 @@ "UIView", }; - for (auto &Line : AnnotatedLines) { - for (FormatToken *FormatTok = Line->First; FormatTok; + auto CheckLineTokens = [&Keywords](const AnnotatedLine &Line) { + for (const FormatToken *FormatTok = Line.First; FormatTok; FormatTok = FormatTok->Next) { if ((FormatTok->Previous && FormatTok->Previous->is(tok::at) && (FormatTok->isObjCAtKeyword(tok::objc_interface) || @@ -1536,6 +1536,15 @@ return true; } } + return false; + }; + for (auto Line : AnnotatedLines) { + if (CheckLineTokens(*Line)) + return true; + for (auto ChildLine : Line->Children) { + if (CheckLineTokens(*ChildLine)) + return true; + } } return false; } Index: unittests/Format/FormatTest.cpp =================================================================== --- unittests/Format/FormatTest.cpp +++ unittests/Format/FormatTest.cpp @@ -12162,6 +12162,13 @@ guessLanguage("foo.h", "int(^foo[(kNumEntries + 10)])(char, float);")); } +TEST_F(FormatTest, GuessLanguageWithChildLines) { + EXPECT_EQ(FormatStyle::LK_Cpp, + guessLanguage("foo.h", "#define FOO ({ std::string s; })")); + EXPECT_EQ(FormatStyle::LK_ObjC, + guessLanguage("foo.h", "#define FOO ({ NSString *s; })")); +} + } // end namespace } // end namespace format } // end namespace clang