Skip to content

Commit abc2bf0

Browse files
committed
Use a heuristic to distinguish Objective-C headers from plain C headers
1 parent a199239 commit abc2bf0

1 file changed

Lines changed: 17 additions & 10 deletions

File tree

clang-format/ClangFormatCommand.mm

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,25 @@ void updateOffsets(std::vector<size_t>& offsets, NSMutableArray<NSString*>* line
1515
}
1616
}
1717

18-
clang::format::FormatStyle::LanguageKind getLanguageFromUTI(NSString* uti) {
19-
if (UTTypeEqual((__bridge CFStringRef)uti, kUTTypeCPlusPlusHeader) ||
20-
UTTypeEqual((__bridge CFStringRef)uti, kUTTypeCPlusPlusSource) ||
21-
UTTypeEqual((__bridge CFStringRef)uti, kUTTypeCHeader) ||
22-
UTTypeEqual((__bridge CFStringRef)uti, kUTTypeCSource)) {
18+
clang::format::FormatStyle::LanguageKind getLanguageKind(XCSourceTextBuffer* buffer) {
19+
CFStringRef uti = (__bridge CFStringRef)buffer.contentUTI;
20+
if (UTTypeEqual(uti, kUTTypeCHeader)) {
21+
// C header files could also be Objective-C. We attempt to detect typical Objective-C keywords.
22+
for (NSString* line in buffer.lines) {
23+
if ([line hasPrefix:@"#import"] || [line hasPrefix:@"@interface"] || [line hasPrefix:@"@protocol"] ||
24+
[line hasPrefix:@"@property"] || [line hasPrefix:@"@end"]) {
25+
return clang::format::FormatStyle::LK_ObjC;
26+
}
27+
}
28+
} else if (UTTypeEqual(uti, kUTTypeCPlusPlusHeader) || UTTypeEqual(uti, kUTTypeCPlusPlusSource) ||
29+
UTTypeEqual(uti, kUTTypeCHeader) || UTTypeEqual(uti, kUTTypeCSource)) {
2330
return clang::format::FormatStyle::LK_Cpp;
24-
} else if (UTTypeEqual((__bridge CFStringRef)uti, kUTTypeObjectiveCSource) ||
25-
UTTypeEqual((__bridge CFStringRef)uti, kUTTypeObjectiveCSource)) {
31+
} else if (UTTypeEqual(uti, kUTTypeObjectiveCSource) ||
32+
UTTypeEqual(uti, kUTTypeObjectiveCSource)) {
2633
return clang::format::FormatStyle::LK_ObjC;
27-
} else if (UTTypeEqual((__bridge CFStringRef)uti, kUTTypeJavaSource)) {
34+
} else if (UTTypeEqual(uti, kUTTypeJavaSource)) {
2835
return clang::format::FormatStyle::LK_Java;
29-
} else if (UTTypeEqual((__bridge CFStringRef)uti, kUTTypeJavaScript)) {
36+
} else if (UTTypeEqual(uti, kUTTypeJavaScript)) {
3037
return clang::format::FormatStyle::LK_JavaScript;
3138
}
3239

@@ -112,7 +119,7 @@ - (void)performCommandWithInvocation:(XCSourceEditorCommandInvocation*)invocatio
112119
defaults = [[NSUserDefaults alloc] initWithSuiteName:@"XcodeClangFormat"];
113120
}
114121

115-
const auto language = getLanguageFromUTI(invocation.buffer.contentUTI);
122+
const auto language = getLanguageKind(invocation.buffer);
116123

117124
NSString* style = [defaults stringForKey:@"style"];
118125
if (!style) {

0 commit comments

Comments
 (0)