@@ -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