Skip to content

Commit 8aff5ce

Browse files
NSProgrammerfacebook-github-bot
authored andcommitted
Handle unexpected (out-of-range) cases in switch statements for CompilerWarningLevel.HIGH targets
Summary: For `CompilerWarningLevel.HIGH` targets (except Instagram), let's address `switch` without `default` present Reviewed By: aary Differential Revision: D75460752 fbshipit-source-id: dd0a4594421580b745b7bb866efe4a86d3061d6d
1 parent 6451aee commit 8aff5ce

File tree

6 files changed

+56
-2
lines changed

6 files changed

+56
-2
lines changed

Source/IGListDiffKit/IGListDiff.mm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#import <vector>
1313

1414
#import "IGListCompatibility.h"
15+
#import "IGListMacros.h"
1516

1617
#import "IGListIndexPathResultInternal.h"
1718
#import "IGListIndexSetResultInternal.h"
@@ -213,6 +214,8 @@ static id IGListDiffing(BOOL returnIndexPaths,
213214
entry->updated = YES;
214215
}
215216
break;
217+
default /* unexpected */:
218+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(IGListDiffOption, option);
216219
}
217220
}
218221
if (originalIndex != NSNotFound

Source/IGListDiffKit/IGListMacros.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,20 @@
3838
ig_safe_block(__VA_ARGS__); \
3939
} \
4040
} while (NO)
41+
42+
/*
43+
E.g.
44+
switch (direction) {
45+
case UICollectionViewScrollDirectionHorizontal:
46+
...
47+
case UICollectionViewScrollDirectionVertical:
48+
...
49+
default:
50+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
51+
}
52+
*/
53+
#define IGLK_UNEXPECTED_SWITCH_CASE_ABORT(type, value) ({ \
54+
type value__##__LINE__ = (value); \
55+
fprintf(stderr, "Unexpected " #type " : %ld\n", (long)(value__##__LINE__)); \
56+
abort(); \
57+
})

Source/IGListKit/IGListAdapter.m

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ - (void)scrollToObject:(id)object
261261
case UICollectionViewScrollPositionCenteredVertically:
262262
contentOffset.x = offset.min - contentInset.left;
263263
break;
264+
default: /* unexpected */
265+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollPosition, scrollPosition);
264266
}
265267
const CGFloat maxOffsetX = collectionView.contentSize.width - collectionView.frame.size.width + contentInset.right;
266268
const CGFloat minOffsetX = -contentInset.left;
@@ -286,6 +288,8 @@ - (void)scrollToObject:(id)object
286288
case UICollectionViewScrollPositionCenteredHorizontally:
287289
contentOffset.y = offset.min - contentInset.top;
288290
break;
291+
default: /* unexpected */
292+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollPosition, scrollPosition);
289293
}
290294
// If we don't call [collectionView layoutIfNeeded], the collectionView.contentSize does not get updated.
291295
// So lets use the layout object, since it should have been updated by now.
@@ -297,6 +301,8 @@ - (void)scrollToObject:(id)object
297301
contentOffset.y = MAX(contentOffset.y, minOffsetY);
298302
break;
299303
}
304+
default: /* unexpected */
305+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, scrollDirection);
300306
}
301307

302308
[collectionView setContentOffset:contentOffset animated:animated];
@@ -318,6 +324,8 @@ - (CGFloat)offsetForFirstVisibleItemWithScrollDirection:(UICollectionViewScrollD
318324
return self.collectionView.contentInset.left + self.collectionView.contentOffset.x - offset.min;
319325
case UICollectionViewScrollDirectionVertical:
320326
return self.collectionView.contentInset.top + self.collectionView.contentOffset.y - offset.min;
327+
default: /* unexpected */
328+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, scrollDirection);
321329
}
322330
} else {
323331
return 0;
@@ -371,6 +379,8 @@ - (OffsetRange)_offsetRangeForIndexPath:(NSIndexPath *)indexPath
371379
originMin = CGRectGetMinY(frame);
372380
endMax = CGRectGetMaxY(frame);
373381
break;
382+
default: /* unexpected */
383+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, scrollDirection);
374384
}
375385

376386
// find the minimum origin value of all the layout attributes

Source/IGListKit/IGListCollectionViewLayout.mm

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,48 +25,62 @@ static CGFloat UIEdgeInsetsLeadingInsetInDirection(UIEdgeInsets insets, UICollec
2525
switch (direction) {
2626
case UICollectionViewScrollDirectionVertical: return insets.top;
2727
case UICollectionViewScrollDirectionHorizontal: return insets.left;
28+
default: /* unexpected */
29+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
2830
}
2931
}
3032

3133
static CGFloat UIEdgeInsetsTrailingInsetInDirection(UIEdgeInsets insets, UICollectionViewScrollDirection direction) {
3234
switch (direction) {
3335
case UICollectionViewScrollDirectionVertical: return insets.bottom;
3436
case UICollectionViewScrollDirectionHorizontal: return insets.right;
37+
default: /* unexpected */
38+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
3539
}
3640
}
3741

3842
static CGFloat CGPointGetCoordinateInDirection(CGPoint point, UICollectionViewScrollDirection direction) {
3943
switch (direction) {
4044
case UICollectionViewScrollDirectionVertical: return point.y;
4145
case UICollectionViewScrollDirectionHorizontal: return point.x;
46+
default: /* unexpected */
47+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
4248
}
4349
}
4450

4551
static CGFloat CGRectGetLengthInDirection(CGRect rect, UICollectionViewScrollDirection direction) {
4652
switch (direction) {
4753
case UICollectionViewScrollDirectionVertical: return rect.size.height;
4854
case UICollectionViewScrollDirectionHorizontal: return rect.size.width;
55+
default: /* unexpected */
56+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
4957
}
5058
}
5159

5260
static CGFloat CGRectGetMaxInDirection(CGRect rect, UICollectionViewScrollDirection direction) {
5361
switch (direction) {
5462
case UICollectionViewScrollDirectionVertical: return CGRectGetMaxY(rect);
5563
case UICollectionViewScrollDirectionHorizontal: return CGRectGetMaxX(rect);
64+
default: /* unexpected */
65+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
5666
}
5767
}
5868

5969
static CGFloat CGRectGetMinInDirection(CGRect rect, UICollectionViewScrollDirection direction) {
6070
switch (direction) {
6171
case UICollectionViewScrollDirectionVertical: return CGRectGetMinY(rect);
6272
case UICollectionViewScrollDirectionHorizontal: return CGRectGetMinX(rect);
73+
default: /* unexpected */
74+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
6375
}
6476
}
6577

6678
static CGFloat CGSizeGetLengthInDirection(CGSize size, UICollectionViewScrollDirection direction) {
6779
switch (direction) {
6880
case UICollectionViewScrollDirectionVertical: return size.height;
6981
case UICollectionViewScrollDirectionHorizontal: return size.width;
82+
default: /* unexpected */
83+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);
7084
}
7185
}
7286

@@ -77,9 +91,11 @@ static CGFloat CGSizeGetLengthInDirection(CGSize size, UICollectionViewScrollDir
7791
static NSInteger IGListMergeMinimumInvalidatedSection(NSInteger section, NSInteger otherSection) {
7892
if (section == NSNotFound && otherSection == NSNotFound) {
7993
return NSNotFound;
80-
} else if (section == NSNotFound) {
94+
}
95+
if (section == NSNotFound) {
8196
return otherSection;
82-
} else if (otherSection == NSNotFound) {
97+
}
98+
if (otherSection == NSNotFound) {
8399
return section;
84100
}
85101

@@ -331,6 +347,8 @@ - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind
331347
case UICollectionViewScrollDirectionHorizontal:
332348
frame.origin.x = offset;
333349
break;
350+
default: /* unexpected */
351+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, self.scrollDirection);
334352
}
335353
}
336354
} else if ([elementKind isEqualToString:UICollectionElementKindSectionFooter]) {
@@ -370,6 +388,8 @@ - (CGSize)collectionViewContentSize {
370388
case UICollectionViewScrollDirectionHorizontal:
371389
return CGSizeMake(CGRectGetMaxX(section.bounds) + section.insets.right,
372390
CGRectGetHeight(collectionView.bounds) - contentInset.top - contentInset.bottom);
391+
default: /* unexpected */
392+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, self.scrollDirection);
373393
}
374394
}
375395

Source/IGListKit/Internal/IGListAdapterUpdater+DebugDescription.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ @implementation IGListAdapterUpdater (DebugDescription)
4343
case IGListBatchUpdateStateExecutingBatchUpdateBlock:
4444
stateString = @"Executing batch update block";
4545
break;
46+
default: /* unknown */
47+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(IGListBatchUpdateState, state);
4648
}
4749
[debug addObject:[NSString stringWithFormat:@"State: %@", stateString]];
4850

Source/IGListKit/Internal/IGListUpdateTransactionBuilder.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ - (void)addChangesFromBuilder:(IGListUpdateTransactionBuilder *)builder {
179179
itemUpdateBlocks:self.itemUpdateBlocks
180180
completionBlocks:self.completionBlocks];
181181
}
182+
default: /* unexpected */
183+
IGLK_UNEXPECTED_SWITCH_CASE_ABORT(IGListUpdateTransactionBuilderMode, self.mode);
182184
}
183185
}
184186

0 commit comments

Comments
 (0)