Skip to content

Commit a51cda9

Browse files
committed
Support nested swift enums.
1 parent d684e5d commit a51cda9

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

SCXcodeSwitchExpander/DVTTextCompletionController+SCXcodeSwitchExpander.m

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ @interface DVTTextCompletionListWindowController (SCXcodeSwitchExpander)
2626

2727
- (BOOL)tryExpandingSwitchStatement;
2828

29+
- (NSArray<IDEIndexSymbol*>*)findSymbolsWithNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection;
30+
- (NSArray<IDEIndexSymbol*>*)_getSymbolsByName:(NSString*)name fromCollection:(IDEIndexCollection*)collection;
31+
- (NSArray<IDEIndexSymbol*>*)_getSymbolsByNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection;
32+
2933
@end
3034

3135
@implementation DVTTextCompletionController (SCXcodeSwitchExpander)
@@ -53,6 +57,65 @@ - (BOOL)scSwizzledAcceptCurrentCompletion
5357

5458
@implementation DVTTextCompletionListWindowController (SCXcodeSwitchExpander)
5559

60+
- (NSArray<IDEIndexSymbol*>*)_getSymbolsByName:(NSString*)name fromCollection:(IDEIndexCollection*)collection
61+
{
62+
NSMutableArray<IDEIndexSymbol*> *results = [[NSMutableArray alloc] init];
63+
64+
for (IDEIndexSymbol *symbol in collection)
65+
{
66+
if ([symbol.name isEqualToString:name])
67+
{
68+
[results addObject:symbol];
69+
}
70+
}
71+
72+
return [results copy];
73+
}
74+
75+
- (NSArray<IDEIndexSymbol*>*)_getSymbolsByNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection
76+
{
77+
NSString* name = names.firstObject;
78+
NSArray<NSString*> *subNames = [names subarrayWithRange:NSMakeRange(1, names.count - 1)];
79+
80+
for (IDEIndexSymbol *symbol in collection)
81+
{
82+
if ([symbol.name isEqualToString:name] && [symbol isKindOfClass:[IDEIndexContainerSymbol class]])
83+
{
84+
NSArray<IDEIndexSymbol*>* symbols = [self findSymbolsWithNames:subNames fromCollection:[(IDEIndexContainerSymbol*)symbol children]];
85+
86+
if (symbols.count > 0)
87+
{
88+
return symbols;
89+
}
90+
}
91+
}
92+
93+
return nil;
94+
}
95+
96+
- (NSArray<IDEIndexSymbol*>*)findSymbolsWithNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection
97+
{
98+
switch (names.count)
99+
{
100+
case 0:
101+
return @[];
102+
103+
case 1:
104+
return [self _getSymbolsByName:names.firstObject fromCollection:collection];
105+
106+
default:
107+
return [self _getSymbolsByNames:names fromCollection:collection];
108+
}
109+
}
110+
111+
- (NSArray<IDEIndexSymbol*>*)getSymbolsByFullName:(NSString*)fullSymbolName fromIndex:(IDEIndex*)index
112+
{
113+
NSArray<NSString*> *names = [fullSymbolName componentsSeparatedByString:@"."];
114+
IDEIndexCollection *collection = [index allSymbolsMatchingName:names.firstObject kind:nil];
115+
116+
return [self findSymbolsWithNames:names fromCollection:collection];
117+
}
118+
56119
- (BOOL)tryExpandingSwitchStatement
57120
{
58121
IDEIndex *index = [[SCXcodeSwitchExpander sharedSwitchExpander] index];
@@ -68,15 +131,17 @@ - (BOOL)tryExpandingSwitchStatement
68131
symbolName = [[symbolName componentsSeparatedByString:@"::"] lastObject]; // Remove C++ namespaces
69132
symbolName = [[symbolName componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] lastObject]; // Remove enum keyword
70133

71-
IDEIndexCollection *collection = [index allSymbolsMatchingName:symbolName kind:nil];
134+
NSArray<IDEIndexSymbol*> *symbols = [self getSymbolsByFullName:symbolName fromIndex:index];
72135

73136
// Find the first one of them that is a container
74-
for(IDEIndexSymbol *symbol in collection.allObjects) {
137+
for(IDEIndexSymbol *symbol in symbols) {
75138

76139
DVTSourceCodeSymbolKind *symbolKind = symbol.symbolKind;
140+
NSLog(@"%@ (Kind=%@)", symbol.description, symbol.symbolKind);
77141

78142
BOOL isSymbolKindEnum = NO;
79143
for(DVTSourceCodeSymbolKind *conformingSymbol in symbolKind.allConformingSymbolKinds) {
144+
NSLog(@"%@", conformingSymbol.identifier);
80145
isSymbolKindEnum = [self isSymbolKindEnum:conformingSymbol];
81146
}
82147

SCXcodeSwitchExpander/Xcode Headers/IDEIndexCollection.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// Copyright (c) 2014 Stefan Ceriu. All rights reserved.
77
//
88

9-
@interface IDEIndexCollection : NSObject
9+
@interface IDEIndexCollection : NSObject <NSFastEnumeration>
1010

1111
- (id)allObjects;
1212

SCXcodeSwitchExpander/Xcode Headers/IDEIndexSymbol.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
@interface IDEIndexSymbol : NSObject
1212

13+
@property(readonly, nonatomic) NSString *name;
1314
@property(readonly, nonatomic) DVTSourceCodeSymbolKind *symbolKind;
1415

1516
- (id)displayName;

0 commit comments

Comments
 (0)