@@ -500,7 +500,7 @@ extension SourceKitLSPServer {
500
500
) async -> ( swiftLanguageService: SwiftLanguageService , snapshot: DocumentSnapshot , location: SymbolLocation ) ? {
501
501
var reference : SymbolOccurrence ? = nil
502
502
index. forEachSymbolOccurrence ( byUSR: usr, roles: renameRoles) {
503
- if index . unchecked . symbolProvider ( for : $0. location . path ) == . swift {
503
+ if $0. symbolProvider == . swift {
504
504
reference = $0
505
505
// We have found a reference from Swift. Stop iteration.
506
506
return false
@@ -631,7 +631,7 @@ extension SourceKitLSPServer {
631
631
// If we terminate early by returning `false` from the closure, `forEachSymbolOccurrence` returns `true`,
632
632
// indicating that we have found a reference from clang.
633
633
let hasReferenceFromClang = !index. forEachSymbolOccurrence ( byUSR: usr, roles: renameRoles) {
634
- return index . unchecked . symbolProvider ( for : $0. location . path ) != . clang
634
+ return $0. symbolProvider != . clang
635
635
}
636
636
let clangName : String ?
637
637
if hasReferenceFromClang {
@@ -730,32 +730,7 @@ extension SourceKitLSPServer {
730
730
731
731
// If we have a USR + old name, perform an index lookup to find workspace-wide symbols to rename.
732
732
// First, group all occurrences of that USR by the files they occur in.
733
- var locationsByFile : [ DocumentURI : [ RenameLocation ] ] = [ : ]
734
-
735
- actor LanguageServerTypesCache {
736
- let index : UncheckedIndex
737
- var languageServerTypesCache : [ DocumentURI : LanguageServerType ? ] = [ : ]
738
-
739
- init ( index: UncheckedIndex ) {
740
- self . index = index
741
- }
742
-
743
- func languageServerType( for uri: DocumentURI ) -> LanguageServerType ? {
744
- if let cachedValue = languageServerTypesCache [ uri] {
745
- return cachedValue
746
- }
747
- let serverType : LanguageServerType ? =
748
- if let fileURL = uri. fileURL {
749
- LanguageServerType ( symbolProvider: index. symbolProvider ( for: fileURL. path) )
750
- } else {
751
- nil
752
- }
753
- languageServerTypesCache [ uri] = serverType
754
- return serverType
755
- }
756
- }
757
-
758
- let languageServerTypesCache = LanguageServerTypesCache ( index: index. unchecked)
733
+ var locationsByFile : [ DocumentURI : ( renameLocations: [ RenameLocation ] , symbolProvider: SymbolProviderKind ) ] = [ : ]
759
734
760
735
let usrsToRename = overridingAndOverriddenUsrs ( of: usr, index: index)
761
736
let occurrencesToRename = usrsToRename. flatMap { index. occurrences ( ofUSR: $0, roles: renameRoles) }
@@ -770,19 +745,16 @@ extension SourceKitLSPServer {
770
745
// perform an indexed rename for it.
771
746
continue
772
747
}
773
- switch await languageServerTypesCache . languageServerType ( for : uri ) {
748
+ switch occurrence . symbolProvider {
774
749
case . swift:
775
750
// sourcekitd only produces AST-based results for the direct calls to this USR. This is because the Swift
776
751
// AST only has upwards references to superclasses and overridden methods, not the other way round. It is
777
752
// thus not possible to (easily) compute an up-down closure like described in `overridingAndOverriddenUsrs`.
778
753
// We thus need to perform an indexed rename for other, related USRs.
779
754
break
780
- case . clangd :
755
+ case . clang :
781
756
// clangd produces AST-based results for the entire class hierarchy, so nothing to do.
782
757
continue
783
- case nil :
784
- // Unknown symbol provider
785
- continue
786
758
}
787
759
}
788
760
@@ -791,25 +763,39 @@ extension SourceKitLSPServer {
791
763
utf8Column: occurrence. location. utf8Column,
792
764
usage: RenameLocation . Usage ( roles: occurrence. roles)
793
765
)
794
- locationsByFile [ uri, default: [ ] ] . append ( renameLocation)
766
+ if let existingLocations = locationsByFile [ uri] {
767
+ if existingLocations. symbolProvider != occurrence. symbolProvider {
768
+ logger. fault (
769
+ """
770
+ Found mismatching symbol providers for \( uri. forLogging) : \
771
+ \( String ( describing: existingLocations. symbolProvider) , privacy: . public) vs \
772
+ \( String ( describing: occurrence. symbolProvider) , privacy: . public)
773
+ """
774
+ )
775
+ }
776
+ locationsByFile [ uri] = ( existingLocations. renameLocations + [ renameLocation] , occurrence. symbolProvider)
777
+ } else {
778
+ locationsByFile [ uri] = ( [ renameLocation] , occurrence. symbolProvider)
779
+ }
795
780
}
796
781
797
782
// Now, call `editsToRename(locations:in:oldName:newName:)` on the language service to convert these ranges into
798
783
// edits.
799
784
let urisAndEdits =
800
785
await locationsByFile
801
- . concurrentMap { ( uri: DocumentURI , renameLocations: [ RenameLocation ] ) -> ( DocumentURI , [ TextEdit ] ) ? in
786
+ . concurrentMap {
787
+ (
788
+ uri: DocumentURI ,
789
+ value: ( renameLocations: [ RenameLocation ] , symbolProvider: SymbolProviderKind )
790
+ ) -> ( DocumentURI , [ TextEdit ] ) ? in
802
791
let language : Language
803
- switch await languageServerTypesCache . languageServerType ( for : uri ) {
804
- case . clangd :
792
+ switch value . symbolProvider {
793
+ case . clang :
805
794
// Technically, we still don't know the language of the source file but defaulting to C is sufficient to
806
795
// ensure we get the clang toolchain language server, which is all we care about.
807
796
language = . c
808
797
case . swift:
809
798
language = . swift
810
- case nil :
811
- logger. error ( " Failed to determine symbol provider for \( uri. forLogging) " )
812
- return nil
813
799
}
814
800
// Create a document snapshot to operate on. If the document is open, load it from the document manager,
815
801
// otherwise conjure one from the file on disk. We need the file in memory to perform UTF-8 to UTF-16 column
@@ -825,13 +811,13 @@ extension SourceKitLSPServer {
825
811
var edits : [ TextEdit ] =
826
812
await orLog ( " Getting edits for rename location " ) {
827
813
return try await languageService. editsToRename (
828
- locations: renameLocations,
814
+ locations: value . renameLocations,
829
815
in: snapshot,
830
816
oldName: oldName,
831
817
newName: newName
832
818
)
833
819
} ?? [ ]
834
- for location in renameLocations where location. usage == . definition {
820
+ for location in value . renameLocations where location. usage == . definition {
835
821
edits += await languageService. editsToRenameParametersInFunctionBody (
836
822
snapshot: snapshot,
837
823
renameLocation: location,
0 commit comments