@@ -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
0 commit comments