[clang-format] Improve ObjC guessing heuristic by supporting all @keywords

Summary:
This diff improves the Objective-C guessing heuristic by
replacing the hard-coded list of a subset of Objective-C @keywords
with a general check which supports all @keywords.

I also added a few more Foundation keywords which were missing from
the heuristic.

Test Plan: Unit tests updated. Ran tests with:
  % make -j16 FormatTests && ./tools/clang/unittests/Format/FormatTests

Reviewers: djasper, jolesiak

Reviewed By: djasper

Subscribers: klimek, cfe-commits

Differential Revision: https://reviews.llvm.org/D45521

llvm-svn: 329918
This commit is contained in:
Ben Hamilton 2018-04-12 15:11:53 +00:00
parent df72e9851a
commit b1a7919e4c
2 changed files with 13 additions and 4 deletions

View File

@ -1465,6 +1465,7 @@ private:
"NSAffineTransform",
"NSArray",
"NSAttributedString",
"NSBlockOperation",
"NSBundle",
"NSCache",
"NSCalendar",
@ -1480,6 +1481,7 @@ private:
"NSIndexPath",
"NSIndexSet",
"NSInteger",
"NSInvocationOperation",
"NSLocale",
"NSMapTable",
"NSMutableArray",
@ -1494,9 +1496,13 @@ private:
"NSNumber",
"NSNumberFormatter",
"NSObject",
"NSOperation",
"NSOperationQueue",
"NSOperationQueuePriority",
"NSOrderedSet",
"NSPoint",
"NSPointerArray",
"NSQualityOfService",
"NSRange",
"NSRect",
"NSRegularExpression",
@ -1518,10 +1524,7 @@ private:
for (const FormatToken *FormatTok = Line->First; FormatTok;
FormatTok = FormatTok->Next) {
if ((FormatTok->Previous && FormatTok->Previous->is(tok::at) &&
(FormatTok->isObjCAtKeyword(tok::objc_interface) ||
FormatTok->isObjCAtKeyword(tok::objc_implementation) ||
FormatTok->isObjCAtKeyword(tok::objc_protocol) ||
FormatTok->isObjCAtKeyword(tok::objc_end) ||
(FormatTok->Tok.getObjCKeywordID() != tok::objc_not_keyword ||
FormatTok->isOneOf(tok::numeric_constant, tok::l_square,
tok::l_brace))) ||
(FormatTok->Tok.isAnyIdentifier() &&

View File

@ -12118,6 +12118,12 @@ TEST_F(FormatTest, FileAndCode) {
EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.mm", ""));
EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo.h", ""));
EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@interface Foo\n@end\n"));
EXPECT_EQ(
FormatStyle::LK_ObjC,
guessLanguage("foo.h", "#define TRY(x, y) @try { x; } @finally { y; }"));
EXPECT_EQ(FormatStyle::LK_ObjC,
guessLanguage("foo.h", "#define AVAIL(x) @available(x, *))"));
EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo.h", "@class Foo;"));
EXPECT_EQ(FormatStyle::LK_Cpp, guessLanguage("foo", ""));
EXPECT_EQ(FormatStyle::LK_ObjC, guessLanguage("foo", "@interface Foo\n@end\n"));
EXPECT_EQ(FormatStyle::LK_ObjC,