|
26 | 26 |
|
27 | 27 | #import <objc/objc-class.h>
|
28 | 28 |
|
| 29 | +/// Returns namespace name by symbol's resolution. |
| 30 | +NSString* namespaceFromResolutionOfSymbol(IDEIndexSymbol* symbol); |
| 31 | + |
29 | 32 | /// Returns symbol names from swift style full symbol name (e.g. from `Mirror.DisplayStyle` to `[Mirror, DisplayStyle]`).
|
30 | 33 | NSArray<NSString*>* symbolNamesFromFullSymbolName(NSString* fullSymbolName, DVTSourceCodeLanguageKind language);
|
31 | 34 |
|
|
38 | 41 | /// Returns a symbol name replaced syntax suggered optional to formal type name type in Swift (e.g. `Int?` to `Optional).
|
39 | 42 | NSString* symbolNameReplacingOptionalName(NSString* symbolName, DVTSourceCodeLanguageKind language);
|
40 | 43 |
|
| 44 | + |
| 45 | +NSString* namespaceFromResolutionOfSymbol(IDEIndexSymbol* symbol) |
| 46 | +{ |
| 47 | + NSString *resolution = symbol.resolution; |
| 48 | + |
| 49 | + return [resolution stringByReplacingOccurrencesOfString:@"^s:\\w+16" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, resolution.length)]; |
| 50 | +} |
| 51 | + |
41 | 52 | NSArray<NSString*>* symbolNamesFromFullSymbolName(NSString* fullSymbolName, DVTSourceCodeLanguageKind language)
|
42 | 53 | {
|
43 | 54 | NSMutableArray<NSString*> *names = [[fullSymbolName componentsSeparatedByString:@"."] mutableCopy];
|
@@ -113,18 +124,6 @@ @interface DVTTextCompletionListWindowController (SCXcodeSwitchExpander)
|
113 | 124 |
|
114 | 125 | - (BOOL)tryExpandingSwitchStatementForLanguage:(DVTSourceCodeLanguageKind)language;
|
115 | 126 |
|
116 |
| -/// Returns symbols specified by `fullSymbolName` in Index. |
117 |
| -- (NSArray<IDEIndexSymbol*>*)getSymbolsByFullName:(NSString*)fullSymbolName forLanguage:(DVTSourceCodeLanguageKind)language fromIndex:(IDEIndex*)index; |
118 |
| - |
119 |
| -/// Returns symbols that found in top `collection` by names recursively. |
120 |
| -- (NSArray<IDEIndexSymbol*>*)findSymbolsWithNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection; |
121 |
| - |
122 |
| -/// Returns symbols named `name` in `collection` |
123 |
| -- (NSArray<IDEIndexSymbol*>*)_getSymbolsByName:(NSString*)name fromCollection:(IDEIndexCollection*)collection; |
124 |
| - |
125 |
| -/// Returns symbols named `name[0].name[1].name[2]...` in `collection` recursively. |
126 |
| -- (NSArray<IDEIndexSymbol*>*)_getSymbolsByNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection; |
127 |
| - |
128 | 127 | /// Returns a boolean value whether `symbolKind` means a enum type.
|
129 | 128 | - (BOOL)isSymbolKindEnum:(DVTSourceCodeSymbolKind *)symbol;
|
130 | 129 |
|
@@ -167,63 +166,46 @@ - (DVTSourceCodeLanguageKind)currentLanguage
|
167 | 166 |
|
168 | 167 | @implementation DVTTextCompletionListWindowController (SCXcodeSwitchExpander)
|
169 | 168 |
|
170 |
| -- (NSArray<IDEIndexSymbol*>*)_getSymbolsByName:(NSString*)name fromCollection:(IDEIndexCollection*)collection |
171 |
| -{ |
172 |
| - NSMutableArray<IDEIndexSymbol*> *results = [[NSMutableArray alloc] init]; |
173 |
| - |
174 |
| - for (IDEIndexSymbol *symbol in collection) |
175 |
| - { |
176 |
| - if ([symbol.name isEqualToString:name]) |
177 |
| - { |
178 |
| - [results addObject:symbol]; |
179 |
| - } |
180 |
| - } |
181 |
| - |
182 |
| - return [results copy]; |
183 |
| -} |
184 | 169 |
|
185 |
| -- (NSArray<IDEIndexSymbol*>*)_getSymbolsByNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection |
| 170 | +- (NSArray<IDEIndexSymbol*>*)getSymbolsByFullName:(NSString*)fullSymbolName forLanguage:(DVTSourceCodeLanguageKind)language fromIndex:(IDEIndex*)index |
186 | 171 | {
|
187 |
| - NSString* name = names.firstObject; |
188 |
| - NSArray<NSString*> *subNames = [names subarrayWithRange:NSMakeRange(1, names.count - 1)]; |
| 172 | + NSArray<NSString*> *names = symbolNamesFromFullSymbolName(fullSymbolName, language); |
| 173 | + NSString *lastName = names.lastObject; |
189 | 174 |
|
190 |
| - for (IDEIndexSymbol *symbol in collection) |
| 175 | + NSArray<IDEIndexSymbol*> *symbols = [[index allSymbolsMatchingName:lastName kind:nil] allObjects]; |
| 176 | + NSIndexSet *enumSymbolIndexes = [symbols indexesOfObjectsPassingTest:^BOOL(IDEIndexSymbol * _Nonnull symbol, NSUInteger idx, BOOL * _Nonnull stop) { |
| 177 | + return [self isSymbolKindEnum:symbol.symbolKind]; |
| 178 | + }]; |
| 179 | + NSArray<IDEIndexSymbol*> *enumSymbols = [symbols objectsAtIndexes:enumSymbolIndexes]; |
| 180 | + |
| 181 | + for (NSInteger nameIndex = names.count - 2; nameIndex != -1; ++nameIndex) |
191 | 182 | {
|
192 |
| - if ([symbol.name isEqualToString:name] && [symbol isKindOfClass:[IDEIndexContainerSymbol class]]) |
| 183 | + if (enumSymbols.count <= 1) |
193 | 184 | {
|
194 |
| - NSArray<IDEIndexSymbol*>* symbols = [self findSymbolsWithNames:subNames fromCollection:[(IDEIndexContainerSymbol*)symbol children]]; |
| 185 | + break; |
| 186 | + } |
| 187 | + |
| 188 | + NSString *currentName = [names objectAtIndex:nameIndex]; |
| 189 | + NSArray<IDEIndexSymbol*> *currentSymbols = [[index allSymbolsMatchingName:currentName kind:nil] allObjects]; |
195 | 190 |
|
196 |
| - if (symbols.count > 0) |
| 191 | + NSIndexSet *validEnumSymbolIndexes = [enumSymbols indexesOfObjectsPassingTest:^BOOL(IDEIndexSymbol * _Nonnull enumSymbol, NSUInteger idx, BOOL * _Nonnull stop) { |
| 192 | + NSString *enumSymbolNamespace = namespaceFromResolutionOfSymbol(enumSymbol); |
| 193 | + for (IDEIndexSymbol *currentSymbol in currentSymbols) |
197 | 194 | {
|
198 |
| - return symbols; |
| 195 | + NSString *currentSymbolNamespace = namespaceFromResolutionOfSymbol(currentSymbol); |
| 196 | + if ([enumSymbolNamespace hasPrefix:currentSymbolNamespace]) |
| 197 | + { |
| 198 | + return true; |
| 199 | + } |
199 | 200 | }
|
200 |
| - } |
| 201 | + return false; |
| 202 | + }]; |
| 203 | + |
| 204 | + enumSymbols = [enumSymbols objectsAtIndexes:validEnumSymbolIndexes]; |
201 | 205 | }
|
202 | 206 |
|
203 |
| - return nil; |
204 |
| -} |
205 |
| - |
206 |
| -- (NSArray<IDEIndexSymbol*>*)findSymbolsWithNames:(NSArray<NSString*>*)names fromCollection:(IDEIndexCollection*)collection |
207 |
| -{ |
208 |
| - switch (names.count) |
209 |
| - { |
210 |
| - case 0: |
211 |
| - return @[]; |
212 |
| - |
213 |
| - case 1: |
214 |
| - return [self _getSymbolsByName:names.firstObject fromCollection:collection]; |
215 |
| - |
216 |
| - default: |
217 |
| - return [self _getSymbolsByNames:names fromCollection:collection]; |
218 |
| - } |
219 |
| -} |
220 |
| - |
221 |
| -- (NSArray<IDEIndexSymbol*>*)getSymbolsByFullName:(NSString*)fullSymbolName forLanguage:(DVTSourceCodeLanguageKind)language fromIndex:(IDEIndex*)index |
222 |
| -{ |
223 |
| - NSArray<NSString*> *names = symbolNamesFromFullSymbolName(fullSymbolName, language); |
224 |
| - IDEIndexCollection *collection = [index allSymbolsMatchingName:names.firstObject kind:nil]; |
225 |
| - |
226 |
| - return [self findSymbolsWithNames:names fromCollection:collection]; |
| 207 | +// return [self findSymbolsWithNames:names fromCollection:collection]; |
| 208 | + return enumSymbols; |
227 | 209 | }
|
228 | 210 |
|
229 | 211 | - (BOOL)tryExpandingSwitchStatementForLanguage:(DVTSourceCodeLanguageKind)language
|
|
0 commit comments