Skip to content

Commit 841b1b4

Browse files
committed
Release 2.1.1
Merge branch 'develop'.
2 parents 7548473 + 62d285d commit 841b1b4

17 files changed

+305
-105
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
## Changelog
22

3+
#### 2.1.1 - 2015/09/13
4+
**A minor update with improvements and bugfixes, including:**
5+
6+
* Support for Xcode 7
7+
* Nicer list header, now on by default
8+
* Improved Swift support
9+
* Misc bugfixes
10+
311
#### 2.1.0 - 2014/06/04
412
**An update with new features, improvements and bugfixes, including:**
513

FuzzyAutocomplete.xcodeproj/project.pbxproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
1C56EBE11B2646310001979E /* FAOpenQuicklyPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 1C56EBE01B2646310001979E /* FAOpenQuicklyPattern.m */; };
1011
580BC1EC181243D600D53F1F /* DVTFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 580BC1EA181243D600D53F1F /* DVTFoundation.framework */; };
1112
580BC1ED181243D600D53F1F /* DVTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 580BC1EB181243D600D53F1F /* DVTKit.framework */; };
1213
58501C0618165B0600AA3179 /* JRSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = 58501C0518165B0600AA3179 /* JRSwizzle.m */; };
@@ -28,6 +29,7 @@
2829
/* End PBXBuildFile section */
2930

3031
/* Begin PBXFileReference section */
32+
1C56EBE01B2646310001979E /* FAOpenQuicklyPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FAOpenQuicklyPattern.m; sourceTree = "<group>"; };
3133
1C5CF4601918DB6200AF581C /* NSArray+FirstObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+FirstObject.h"; sourceTree = "<group>"; };
3234
580BC1EA181243D600D53F1F /* DVTFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DVTFoundation.framework; path = ../../../../Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework; sourceTree = "<group>"; };
3335
580BC1EB181243D600D53F1F /* DVTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DVTKit.framework; path = ../../../../Applications/Xcode.app/Contents/SharedFrameworks/DVTKit.framework; sourceTree = "<group>"; };
@@ -51,7 +53,7 @@
5153
58DA96F21813D38A00D0082B /* DVTTextCompletionInlinePreviewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DVTTextCompletionInlinePreviewController.h; sourceTree = "<group>"; };
5254
58DA96F31813D48D00D0082B /* DVTTextCompletionItem-Protocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DVTTextCompletionItem-Protocol.h"; sourceTree = "<group>"; };
5355
58E391E7181289A100C18DBF /* IDEIndexCompletionItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IDEIndexCompletionItem.h; sourceTree = "<group>"; };
54-
58E9F98D18139EC5000928AF /* IDEOpenQuicklyPattern.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IDEOpenQuicklyPattern.h; sourceTree = "<group>"; };
56+
58E9F98D18139EC5000928AF /* FAOpenQuicklyPattern.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FAOpenQuicklyPattern.h; sourceTree = "<group>"; };
5557
58E9F98E1813A0FE000928AF /* IDEKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IDEKit.framework; path = ../../../../Applications/Xcode.app/Contents/Frameworks/IDEKit.framework; sourceTree = "<group>"; };
5658
6503E741190AB08D00017267 /* DVTTextStorage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DVTTextStorage.h; sourceTree = "<group>"; };
5759
6503E742190AB08D00017267 /* DVTTextStorageDelegate-Protocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DVTTextStorageDelegate-Protocol.h"; sourceTree = "<group>"; };
@@ -112,7 +114,6 @@
112114
65E3D500190AAD8400A42F56 /* DVTCompletingTextView.h */,
113115
58BA07BF18124BD50070060D /* DVTTextCompletionSession.h */,
114116
58E391E7181289A100C18DBF /* IDEIndexCompletionItem.h */,
115-
58E9F98D18139EC5000928AF /* IDEOpenQuicklyPattern.h */,
116117
658A7C8218A13279007655E0 /* DVTPreferenceSet-Protocol.h */,
117118
65DB740C18A12FBF001CDD83 /* DVTFontAndColorTheme.h */,
118119
);
@@ -182,6 +183,8 @@
182183
65599234189FFFD600C44208 /* DVTTextCompletionInlinePreviewController+FuzzyAutocomplete.m */,
183184
655738C618F47F1E003FD40A /* FATextCompletionListHeaderView.h */,
184185
655738C718F47F1E003FD40A /* FATextCompletionListHeaderView.m */,
186+
58E9F98D18139EC5000928AF /* FAOpenQuicklyPattern.h */,
187+
1C56EBE01B2646310001979E /* FAOpenQuicklyPattern.m */,
185188
650C2FA4190B31600021BCD8 /* FAMatchPattern.h */,
186189
650C2FA5190B31600021BCD8 /* FAMatchPattern.m */,
187190
);
@@ -299,6 +302,7 @@
299302
6540232C18F9F79700D580B3 /* FAItemScoringMethod.m in Sources */,
300303
58501C0618165B0600AA3179 /* JRSwizzle.m in Sources */,
301304
58C3C25A181128140031D9CD /* FuzzyAutocomplete.m in Sources */,
305+
1C56EBE11B2646310001979E /* FAOpenQuicklyPattern.m in Sources */,
302306
650C2FA6190B31600021BCD8 /* FAMatchPattern.m in Sources */,
303307
650D4F5F18E5FCFF00F5DBEE /* FASettings.m in Sources */,
304308
65EAE5DE18ECADF900F0974C /* FATheme.m in Sources */,

FuzzyAutocomplete/DVTTextCompletionInlinePreviewController+FuzzyAutocomplete.m

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,39 @@ @implementation FAPreviewItem {
145145
+ (instancetype)previewItemForItem:(id<DVTTextCompletionItem>)item {
146146
FAPreviewItem * ret = [FAPreviewItem new];
147147
ret->_item = item;
148+
148149
NSString * completionText = item.completionText;
149-
completionText = [completionText stringByReplacingOccurrencesOfString:@"<#" withString:@""];
150-
completionText = [completionText stringByReplacingOccurrencesOfString:@"#>" withString:@""];
150+
NSUInteger length = completionText.length;
151+
152+
NSRange searchRange = NSMakeRange(0, length);
153+
NSUInteger closeToken, middleToken, openToken = [completionText rangeOfString: @"<#" options: 0 range: searchRange].location;
154+
155+
if (openToken != NSNotFound) {
156+
NSMutableString * newCompletionText = [NSMutableString stringWithCapacity: length];
157+
while (openToken != NSNotFound) {
158+
searchRange.length = openToken - searchRange.location;
159+
[newCompletionText appendString: [completionText substringWithRange: searchRange]];
160+
searchRange.location = openToken + 2;
161+
searchRange.length = length - openToken - 2;
162+
closeToken = [completionText rangeOfString: @"#>" options: 0 range: searchRange].location;
163+
if (closeToken != NSNotFound) {
164+
searchRange.length = closeToken - openToken - 2;
165+
middleToken = [completionText rangeOfString: @"##" options: 0 range: searchRange].location;
166+
if (middleToken != NSNotFound) {
167+
searchRange.length = middleToken - openToken - 2;
168+
}
169+
[newCompletionText appendString: [completionText substringWithRange: searchRange]];
170+
searchRange.location = closeToken + 2;
171+
searchRange.length = length - closeToken - 2;
172+
}
173+
openToken = [completionText rangeOfString: @"<#" options: 0 range: searchRange].location;
174+
}
175+
if (searchRange.location < length) {
176+
[newCompletionText appendString: [completionText substringWithRange: searchRange]];
177+
}
178+
completionText = newCompletionText;
179+
}
180+
151181
ret->_completionText = completionText;
152182
return ret;
153183
}

FuzzyAutocomplete/DVTTextCompletionListWindowController+FuzzyAutocomplete.m

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,9 @@ - (void) _fa_updateCurrentDisplayState {
145145
// We modify titleColumnX with score column's width, so that title column is aligned with typed text
146146
- (CGRect) _fa_preferredWindowFrameForTextFrame: (CGRect) textFrame columnsWidth: (double *) widths titleColumnX: (double) titleX {
147147
NSTableView * tableView = [self valueForKey: @"_completionsTableView"];
148-
return [self _fa_preferredWindowFrameForTextFrame: textFrame columnsWidth: widths titleColumnX: titleX + [self _fa_widthForScoreColumn] + tableView.intercellSpacing.width];
148+
NSTableColumn * scoreColumn = [tableView tableColumnWithIdentifier: @"score"];
149+
CGFloat additionalWidth = scoreColumn ? [self _fa_widthForScoreColumn] + tableView.intercellSpacing.width : 0;
150+
return [self _fa_preferredWindowFrameForTextFrame: textFrame columnsWidth: widths titleColumnX: titleX + additionalWidth];
149151
}
150152

151153

@@ -226,10 +228,10 @@ - (void) _fa_getTitleColumnWidth:(double *)titleWidth typeColumnWidth:(double *)
226228
- (CGFloat) _fa_widthForScoreColumn {
227229
NSTableView * tableView = [self valueForKey: @"_completionsTableView"];
228230
NSTableColumn * scoreColumn = [tableView tableColumnWithIdentifier: @"score"];
229-
if (scoreColumn && self.session.fa_nonZeroScores) {
231+
DVTFontAndColorTheme * theme = [DVTFontAndColorTheme currentTheme];
232+
if (scoreColumn && self.session.fa_nonZeroScores && theme.sourcePlainTextFont) {
230233
NSNumberFormatter * formatter = ((NSCell *)scoreColumn.dataCell).formatter;
231234
NSString * sampleValue = [formatter stringFromNumber: @0];
232-
DVTFontAndColorTheme * theme = [DVTFontAndColorTheme currentTheme];
233235
NSDictionary * attributes = @{ NSFontAttributeName : theme.sourcePlainTextFont };
234236
return [[NSAttributedString alloc] initWithString: sampleValue attributes: attributes].size.width + 6;
235237
} else {

FuzzyAutocomplete/DVTTextCompletionSession+FuzzyAutocomplete.m

Lines changed: 77 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ @implementation FAFilteringResults
4040

4141
@end
4242

43+
static NSString * _fa_IDESwiftCompletionItem_name(id self, SEL _cmd);
44+
45+
static IMP __fa_IDESwiftCompletionItem_name = (IMP) _fa_IDESwiftCompletionItem_name;
46+
4347
@implementation DVTTextCompletionSession (FuzzyAutocomplete)
4448

4549
+ (void) fa_swizzleMethods {
@@ -78,6 +82,13 @@ + (void) fa_swizzleMethods {
7882
[self jr_swizzleMethod: @selector(hideCompletionsWithReason:)
7983
withMethod: @selector(_fa_hideCompletionsWithReason:)
8084
error: nil];
85+
86+
Class swiftCompletionClass = NSClassFromString(@"IDESwiftCompletionItem");
87+
if (swiftCompletionClass) {
88+
Method m = class_getInstanceMethod(swiftCompletionClass, NSSelectorFromString(@"name"));
89+
__fa_IDESwiftCompletionItem_name = method_setImplementation(m, __fa_IDESwiftCompletionItem_name);
90+
}
91+
8192
}
8293

8394
#pragma mark - public methods
@@ -213,10 +224,10 @@ - (void) _fa_selectNextPreviousByPriority: (BOOL) next {
213224
NSArray * sorted = nil;
214225
NSDictionary * filteredScores = self.fa_scoresForFilteredCompletions;
215226
if ([FASettings currentSettings].sortByScore) {
216-
sorted = self.filteredCompletionsAlpha.reverseObjectEnumerator.allObjects;
227+
sorted = self.filteredCompletionsAlpha;
217228
} else if (filteredScores) {
218229
sorted = [self.filteredCompletionsAlpha sortedArrayWithOptions: NSSortConcurrent
219-
usingComparator: [self _fa_itemComparatorByScores: filteredScores reverse: NO]];
230+
usingComparator: [self _fa_itemComparatorByScores: filteredScores]];
220231
}
221232
[self setValue: sorted forKey: @"_filteredCompletionsPriority"];
222233
}
@@ -409,6 +420,16 @@ - (void)_fa_setFilteringPrefix: (NSString *) prefix forceFilter: (BOOL) forceFil
409420

410421
self.fa_filteringTime = [NSDate timeIntervalSinceReferenceDate] - start;
411422

423+
if (![self _gotUsefulCompletionsToShowInList: results.filteredItems]) {
424+
BOOL shownExplicitly = [[self valueForKey:@"_shownExplicitly"] boolValue];
425+
if ([self.listWindowController showingWindow] && !shownExplicitly) {
426+
[self.listWindowController hideWindowWithReason: 8];
427+
}
428+
if ([self._inlinePreviewController isShowingInlinePreview]) {
429+
[self._inlinePreviewController hideInlinePreviewWithReason: 8];
430+
}
431+
}
432+
412433
NAMED_TIMER_START(SendNotifications);
413434
// send the notifications in the same way the original does
414435
[self willChangeValueForKey:@"filteredCompletionsAlpha"];
@@ -425,6 +446,14 @@ - (void)_fa_setFilteringPrefix: (NSString *) prefix forceFilter: (BOOL) forceFil
425446
[self didChangeValueForKey:@"selectedCompletionIndex"];
426447
NAMED_TIMER_STOP(SendNotifications);
427448

449+
if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember: [prefix characterAtIndex:0]]) {
450+
BOOL shownExplicitly = [[self valueForKey:@"_shownExplicitly"] boolValue];
451+
if (!shownExplicitly) {
452+
[self._inlinePreviewController hideInlinePreviewWithReason: 2];
453+
[self.listWindowController hideWindowWithReason: 2];
454+
}
455+
}
456+
428457
if (![FASettings currentSettings].showInlinePreview) {
429458
[self._inlinePreviewController hideInlinePreviewWithReason: 0x0];
430459
}
@@ -456,7 +485,7 @@ - (NSUInteger) _fa_getSelectionForFilteringResults: (FAFilteringResults *) resul
456485
if (lastRange.location == lastRangePrev.location && lastRange.length >= lastRangePrev.length) {
457486
NSComparator comparator = nil;
458487
if ([FASettings currentSettings].sortByScore) {
459-
comparator = [self _fa_itemComparatorByScores: results.scores reverse: YES];
488+
comparator = [self _fa_itemComparatorByScores: results.scores];
460489
} else {
461490
comparator = [self _fa_itemComparatorByName];
462491
}
@@ -586,7 +615,7 @@ - (FAFilteringResults *)_fa_calculateResultsForQuery: (NSString *) query {
586615

587616
NAMED_TIMER_START(SortByScore);
588617
if ([FASettings currentSettings].sortByScore) {
589-
[filteredList sortWithOptions: NSSortConcurrent usingComparator: [self _fa_itemComparatorByScores: filteredScores reverse: YES]];
618+
[filteredList sortWithOptions: NSSortConcurrent usingComparator: [self _fa_itemComparatorByScores: filteredScores]];
590619
}
591620
NAMED_TIMER_STOP(SortByScore);
592621

@@ -857,18 +886,11 @@ - (NSComparator) _fa_itemComparatorByName {
857886
}
858887

859888
// gets a comparator for given scores dictionary
860-
- (NSComparator) _fa_itemComparatorByScores: (NSDictionary *) filteredScores reverse: (BOOL) reverse {
861-
if (!reverse) {
862-
return ^(id<DVTTextCompletionItem> obj1, id<DVTTextCompletionItem> obj2) {
863-
NSComparisonResult result = [filteredScores[obj1.name] compare: filteredScores[obj2.name]];
864-
return result == NSOrderedSame ? [obj2.name caseInsensitiveCompare: obj1.name] : result;
865-
};
866-
} else {
867-
return ^(id<DVTTextCompletionItem> obj1, id<DVTTextCompletionItem> obj2) {
868-
NSComparisonResult result = [filteredScores[obj2.name] compare: filteredScores[obj1.name]];
869-
return result == NSOrderedSame ? [obj1.name caseInsensitiveCompare: obj2.name] : result;
870-
};
871-
}
889+
- (NSComparator) _fa_itemComparatorByScores: (NSDictionary *) filteredScores {
890+
return ^(id<DVTTextCompletionItem> obj1, id<DVTTextCompletionItem> obj2) {
891+
NSComparisonResult result = [filteredScores[obj2.name] compare: filteredScores[obj1.name]];
892+
return result == NSOrderedSame ? [obj1.name caseInsensitiveCompare: obj2.name] : result;
893+
};
872894
}
873895

874896
- (void)_fa_debugCompletionsByScore:(NSArray *)completions withQuery:(NSString *)query {
@@ -880,8 +902,8 @@ - (void)_fa_debugCompletionsByScore:(NSArray *)completions withQuery:(NSString *
880902
double matchScore = [pattern scoreCandidate: item.name matchedRanges: &ranges];
881903
double factor = [self _priorityFactorForItem: item];
882904
[completionsWithScore addObject:@{
883-
@"item" : item.name,
884-
@"ranges" : ranges ? ranges : @[],
905+
@"item" : item.name ?: @"",
906+
@"ranges" : ranges ?: @[],
885907
@"factor" : @(factor),
886908
@"priority" : @(item.priority),
887909
@"matchScore" : @(matchScore),
@@ -962,3 +984,40 @@ - (FAFilteringResults *) _fa_lastFilteringResults {
962984
}
963985

964986
@end
987+
988+
static NSString * _fa_IDESwiftCompletionItem_name(id self, SEL _cmd) {
989+
NSString * name = objc_getAssociatedObject(self, _fa_IDESwiftCompletionItem_name);
990+
if (name) {
991+
return name;
992+
}
993+
994+
id <DVTTextCompletionItem> item = self;
995+
name = [item completionText];
996+
NSUInteger length = name.length;
997+
998+
NSRange searchRange = NSMakeRange(0, length);
999+
NSUInteger tokenLocation = [name rangeOfString: @"<#" options: 0 range: searchRange].location;
1000+
1001+
if (tokenLocation != NSNotFound) {
1002+
NSMutableString * newName = [NSMutableString stringWithCapacity: length];
1003+
while (tokenLocation != NSNotFound) {
1004+
searchRange.length = tokenLocation - searchRange.location;
1005+
[newName appendString: [name substringWithRange: searchRange]];
1006+
searchRange.location = tokenLocation + 2;
1007+
searchRange.length = length - tokenLocation - 2;
1008+
tokenLocation = [name rangeOfString: @"#>" options: 0 range: searchRange].location;
1009+
if (tokenLocation != NSNotFound) {
1010+
searchRange.location = tokenLocation + 2;
1011+
searchRange.length = length - tokenLocation - 2;
1012+
tokenLocation = [name rangeOfString: @"<#" options: 0 range: searchRange].location;
1013+
}
1014+
}
1015+
if (searchRange.location < length) {
1016+
[newName appendString: [name substringWithRange: searchRange]];
1017+
}
1018+
name = newName;
1019+
}
1020+
1021+
objc_setAssociatedObject(self, _fa_IDESwiftCompletionItem_name, name, OBJC_ASSOCIATION_RETAIN);
1022+
return name;
1023+
}

FuzzyAutocomplete/FAMatchPattern.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
//
77
//
88

9-
#import "IDEOpenQuicklyPattern.h"
9+
#import "FAOpenQuicklyPattern.h"
1010

1111
/// Fuzzy Autocomplete Match Pattern
12-
@interface FAMatchPattern : IDEOpenQuicklyPattern
12+
@interface FAMatchPattern : FAOpenQuicklyPattern
1313

1414
- (instancetype) initWithPattern: (NSString *) patternString;
1515

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//
2+
// FAOpenQuicklyPattern.h
3+
// FuzzyAutocomplete
4+
//
5+
// Created by Leszek Ślażyński on 08/06/15.
6+
//
7+
//
8+
9+
/// Dummy class to be switched to real open quickly pattern on runtime
10+
@interface FAOpenQuicklyPattern : NSObject {
11+
NSString *_pattern;
12+
BOOL _patternHasSeparators;
13+
char *_charactersInPattern;
14+
unsigned short *_patternCharacters;
15+
unsigned short *_lowerCasePatternCharacters;
16+
NSUInteger _patternLength;
17+
}
18+
19+
@property(readonly) NSString * pattern;
20+
21+
- (instancetype) initWithPattern: (NSString *) patternString;
22+
+ (instancetype) patternWithInput: (NSString *) input;
23+
- (CGFloat) scoreCandidate: (NSString *) candidate matchedRanges: (NSArray **) rangesPtr;
24+
- (NSArray *) matchedRanges: (NSString *) candidate;
25+
- (CGFloat) scoreCandidate: (NSString *) candidate;
26+
- (BOOL) matchesCandidate: (NSString *) candidate;
27+
28+
@end
29+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// FAOpenQuicklyPattern.m
3+
// FuzzyAutocomplete
4+
//
5+
// Created by Leszek Ślażyński on 08/06/15.
6+
//
7+
//
8+
9+
#import "FAOpenQuicklyPattern.h"
10+
11+
@implementation FAOpenQuicklyPattern
12+
13+
- (NSString *) pattern {
14+
return nil;
15+
}
16+
17+
- (instancetype) initWithPattern: (NSString *) patternString {
18+
return nil;
19+
}
20+
21+
+ (instancetype) patternWithInput: (NSString *) input {
22+
return nil;
23+
}
24+
25+
- (CGFloat) scoreCandidate: (NSString *) candidate matchedRanges: (NSArray **) rangesPtr {
26+
return 0;
27+
}
28+
29+
- (NSArray *) matchedRanges: (NSString *) candidate {
30+
return nil;
31+
}
32+
33+
- (CGFloat) scoreCandidate: (NSString *) candidate {
34+
return 0;
35+
}
36+
37+
38+
- (BOOL) matchesCandidate: (NSString *) candidate {
39+
return NO;
40+
}
41+
42+
@end

FuzzyAutocomplete/FASettings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ extern NSString * FASettingsPluginEnabledDidChangeNotification;
6363
/// Should the list header be visible.
6464
@property (nonatomic, readonly) BOOL showListHeader;
6565

66+
/// Should the list header contain number of matches.
67+
@property (nonatomic, readonly) BOOL showNumMatches;
68+
6669
/// Should the timing in the list header be visible.
6770
@property (nonatomic, readonly) BOOL showTiming;
6871

0 commit comments

Comments
 (0)