@@ -701,16 +701,26 @@ extension SourceKitServer {
701
701
// First, group all occurrences of that USR by the files they occur in.
702
702
var locationsByFile : [ URL : [ RenameLocation ] ] = [ : ]
703
703
704
- var languageServerTypesCache : [ URL : LanguageServerType ? ] = [ : ]
705
- func languageServerType( of url: URL ) -> LanguageServerType ? {
706
- if let cachedValue = languageServerTypesCache [ url] {
707
- return cachedValue
704
+ actor LanguageServerTypesCache {
705
+ let index : IndexStoreDB
706
+ var languageServerTypesCache : [ URL : LanguageServerType ? ] = [ : ]
707
+
708
+ init ( index: IndexStoreDB ) {
709
+ self . index = index
710
+ }
711
+
712
+ func languageServerType( for url: URL ) -> LanguageServerType ? {
713
+ if let cachedValue = languageServerTypesCache [ url] {
714
+ return cachedValue
715
+ }
716
+ let serverType = LanguageServerType ( symbolProvider: index. symbolProvider ( for: url. path) )
717
+ languageServerTypesCache [ url] = serverType
718
+ return serverType
708
719
}
709
- let serverType = LanguageServerType ( symbolProvider: index. symbolProvider ( for: url. path) )
710
- languageServerTypesCache [ url] = serverType
711
- return serverType
712
720
}
713
721
722
+ let languageServerTypesCache = LanguageServerTypesCache ( index: index)
723
+
714
724
let usrsToRename = overridingAndOverriddenUsrs ( of: usr, index: index)
715
725
let occurrencesToRename = usrsToRename. flatMap { index. occurrences ( ofUSR: $0, roles: renameRoles) }
716
726
for occurrence in occurrencesToRename {
@@ -724,7 +734,7 @@ extension SourceKitServer {
724
734
// perform an indexed rename for it.
725
735
continue
726
736
}
727
- switch languageServerType ( of : url) {
737
+ switch await languageServerTypesCache . languageServerType ( for : url) {
728
738
case . swift:
729
739
// sourcekitd only produces AST-based results for the direct calls to this USR. This is because the Swift
730
740
// AST only has upwards references to superclasses and overridden methods, not the other way round. It is
@@ -755,7 +765,7 @@ extension SourceKitServer {
755
765
. concurrentMap { ( url: URL , renameLocations: [ RenameLocation ] ) -> ( DocumentURI , [ TextEdit ] ) ? in
756
766
let uri = DocumentURI ( url)
757
767
let language : Language
758
- switch languageServerType ( of : url) {
768
+ switch await languageServerTypesCache . languageServerType ( for : url) {
759
769
case . clangd:
760
770
// Technically, we still don't know the language of the source file but defaulting to C is sufficient to
761
771
// ensure we get the clang toolchain language server, which is all we care about.
0 commit comments