@@ -554,24 +554,50 @@ extension SourceKitServer {
554
554
index: IndexStoreDB
555
555
) async throws -> CrossLanguageName ? {
556
556
let definitions = index. occurrences ( ofUSR: usr, roles: [ . definition] )
557
+ if definitions. isEmpty {
558
+ logger. error ( " no definitions for \( usr) found " )
559
+ return nil
560
+ }
557
561
if definitions. count > 1 {
558
562
logger. log ( " Multiple definitions for \( usr) found " )
559
563
}
560
564
// There might be multiple definitions of the same symbol eg. in different `#if` branches. In this case pick any of
561
565
// them because with very high likelihood they all translate to the same clang and Swift name. Sort the entries to
562
566
// ensure that we deterministically pick the same entry every time.
563
- guard let definitionSymbol = definitions. sorted ( ) . first else {
564
- logger. error ( " no definitions for \( usr) found " )
565
- return nil
567
+ for definitionOccurrence in definitions. sorted ( ) {
568
+ do {
569
+ return try await getCrossLanguageName (
570
+ forDefinitionOccurrence: definitionOccurrence,
571
+ overrideName: overrideName,
572
+ workspace: workspace,
573
+ index: index
574
+ )
575
+ } catch {
576
+ // If getting the cross-language name fails for this occurrence, try the next definition, if there are multiple.
577
+ logger. log (
578
+ " Getting cross-language name for occurrence at \( definitionOccurrence. location) failed. \( error. forLogging) "
579
+ )
580
+ }
566
581
}
582
+ return nil
583
+ }
584
+
585
+ private func getCrossLanguageName(
586
+ forDefinitionOccurrence definitionOccurrence: SymbolOccurrence ,
587
+ overrideName: String ? = nil ,
588
+ workspace: Workspace ,
589
+ index: IndexStoreDB
590
+ ) async throws -> CrossLanguageName {
591
+ let definitionSymbol = definitionOccurrence. symbol
592
+ let usr = definitionSymbol. usr
567
593
let definitionLanguage : Language =
568
- switch definitionSymbol. symbol . language {
594
+ switch definitionSymbol. language {
569
595
case . c: . c
570
596
case . cxx: . cpp
571
597
case . objc: . objective_c
572
598
case . swift: . swift
573
599
}
574
- let definitionDocumentUri = DocumentURI ( URL ( fileURLWithPath: definitionSymbol . location. path) )
600
+ let definitionDocumentUri = DocumentURI ( URL ( fileURLWithPath: definitionOccurrence . location. path) )
575
601
576
602
guard
577
603
let definitionLanguageService = await self . languageService (
@@ -580,25 +606,24 @@ extension SourceKitServer {
580
606
in: workspace
581
607
)
582
608
else {
583
- logger. fault ( " Failed to get language service for the document defining \( usr) " )
584
- return nil
609
+ throw ResponseError . unknown ( " Failed to get language service for the document defining \( usr) " )
585
610
}
586
611
587
- let definitionName = overrideName ?? definitionSymbol. symbol . name
612
+ let definitionName = overrideName ?? definitionSymbol. name
588
613
589
614
switch definitionLanguageService {
590
615
case is ClangLanguageServerShim :
591
616
let swiftName : String ?
592
617
if let swiftReference = await getReferenceFromSwift ( usr: usr, index: index, workspace: workspace) {
593
- let isObjectiveCSelector = definitionLanguage == . objective_c && definitionSymbol. symbol . kind. isMethod
618
+ let isObjectiveCSelector = definitionLanguage == . objective_c && definitionSymbol. kind. isMethod
594
619
swiftName = try await swiftReference. languageServer. translateClangNameToSwift (
595
620
at: swiftReference. location,
596
621
in: swiftReference. snapshot,
597
622
isObjectiveCSelector: isObjectiveCSelector,
598
623
name: definitionName
599
624
)
600
625
} else {
601
- logger. debug ( " Not translating \( usr ) to Swift because it is not referenced from Swift " )
626
+ logger. debug ( " Not translating \( definitionSymbol ) to Swift because it is not referenced from Swift " )
602
627
swiftName = nil
603
628
}
604
629
return CrossLanguageName ( clangName: definitionName, swiftName: swiftName, definitionLanguage: definitionLanguage)
@@ -612,7 +637,7 @@ extension SourceKitServer {
612
637
let clangName : String ?
613
638
if hasReferenceFromClang {
614
639
clangName = try await swiftLanguageServer. translateSwiftNameToClang (
615
- at: definitionSymbol . location,
640
+ at: definitionOccurrence . location,
616
641
in: definitionDocumentUri,
617
642
name: CompoundDeclName ( definitionName)
618
643
)
0 commit comments