Skip to content

Commit c83061e

Browse files
committed
Remove reference to ClangLanguageService in Rename.swift
1 parent 10411dd commit c83061e

File tree

2 files changed

+80
-82
lines changed

2 files changed

+80
-82
lines changed

Sources/SourceKitLSP/Clang/ClangLanguageService.swift

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,69 @@ extension ClangLanguageService {
634634
func getReferenceDocument(_ req: GetReferenceDocumentRequest) async throws -> GetReferenceDocumentResponse {
635635
throw ResponseError.unknown("unsupported method")
636636
}
637+
638+
func rename(_ renameRequest: RenameRequest) async throws -> (edits: WorkspaceEdit, usr: String?) {
639+
async let edits = forwardRequestToClangd(renameRequest)
640+
let symbolInfoRequest = SymbolInfoRequest(
641+
textDocument: renameRequest.textDocument,
642+
position: renameRequest.position
643+
)
644+
let symbolDetail = try await forwardRequestToClangd(symbolInfoRequest).only
645+
return (try await edits ?? WorkspaceEdit(), symbolDetail?.usr)
646+
}
647+
648+
func editsToRename(
649+
locations renameLocations: [RenameLocation],
650+
in snapshot: DocumentSnapshot,
651+
oldName oldCrossLanguageName: CrossLanguageName,
652+
newName newCrossLanguageName: CrossLanguageName
653+
) async throws -> [TextEdit] {
654+
let positions = [
655+
snapshot.uri: renameLocations.compactMap { snapshot.position(of: $0) }
656+
]
657+
guard
658+
let oldName = oldCrossLanguageName.clangName,
659+
let newName = newCrossLanguageName.clangName
660+
else {
661+
throw ResponseError.unknown(
662+
"Failed to rename \(snapshot.uri.forLogging) because the clang name for rename is unknown"
663+
)
664+
}
665+
let request = IndexedRenameRequest(
666+
textDocument: TextDocumentIdentifier(snapshot.uri),
667+
oldName: oldName,
668+
newName: newName,
669+
positions: positions
670+
)
671+
do {
672+
let edits = try await forwardRequestToClangd(request)
673+
return edits?.changes?[snapshot.uri] ?? []
674+
} catch {
675+
logger.error("Failed to get indexed rename edits: \(error.forLogging)")
676+
return []
677+
}
678+
}
679+
680+
package func prepareRename(
681+
_ request: PrepareRenameRequest
682+
) async throws -> (prepareRename: PrepareRenameResponse, usr: String?)? {
683+
guard let prepareRename = try await forwardRequestToClangd(request) else {
684+
return nil
685+
}
686+
let symbolInfo = try await forwardRequestToClangd(
687+
SymbolInfoRequest(textDocument: request.textDocument, position: request.position)
688+
)
689+
return (prepareRename, symbolInfo.only?.usr)
690+
}
691+
692+
package func editsToRenameParametersInFunctionBody(
693+
snapshot: DocumentSnapshot,
694+
renameLocation: RenameLocation,
695+
newName: CrossLanguageName
696+
) async -> [TextEdit] {
697+
// When renaming a clang function name, we don't need to rename any references to the arguments.
698+
return []
699+
}
637700
}
638701

639702
/// Clang build settings derived from a `FileBuildSettingsChange`.

Sources/SourceKitLSP/Rename.swift

Lines changed: 17 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Csourcekitd
1414
import Foundation
1515
import IndexStoreDB
1616
package import LanguageServerProtocol
17+
import LanguageServerProtocolExtensions
1718
import SKLogging
1819
import SKUtilities
1920
import SemanticIndex
@@ -451,11 +452,11 @@ extension SwiftLanguageService {
451452
package struct CrossLanguageName: Sendable {
452453
/// The name of the symbol in clang languages or `nil` if the symbol is defined in Swift, doesn't have any references
453454
/// from clang languages and thus hasn't been translated.
454-
fileprivate let clangName: String?
455+
package let clangName: String?
455456

456457
/// The name of the symbol in Swift or `nil` if the symbol is defined in clang, doesn't have any references from
457458
/// Swift and thus hasn't been translated.
458-
fileprivate let swiftName: String?
459+
package let swiftName: String?
459460

460461
fileprivate var compoundSwiftName: CompoundDeclName? {
461462
if let swiftName {
@@ -465,10 +466,10 @@ package struct CrossLanguageName: Sendable {
465466
}
466467

467468
/// the language that the symbol is defined in.
468-
fileprivate let definitionLanguage: Language
469+
package let definitionLanguage: Language
469470

470471
/// The name of the symbol in the language that it is defined in.
471-
var definitionName: String? {
472+
package var definitionName: String? {
472473
switch definitionLanguage {
473474
case .c, .cpp, .objective_c, .objective_cpp:
474475
return clangName
@@ -576,20 +577,10 @@ extension SourceKitLSPServer {
576577
}
577578
let definitionDocumentUri = definitionOccurrence.location.documentUri
578579

579-
guard
580-
let definitionLanguageService = await self.languageService(
581-
for: definitionDocumentUri,
582-
definitionLanguage,
583-
in: workspace
584-
)
585-
else {
586-
throw ResponseError.unknown("Failed to get language service for the document defining \(usr)")
587-
}
588-
589580
let definitionName = overrideName ?? definitionSymbol.name
590581

591-
switch definitionLanguageService {
592-
case is ClangLanguageService:
582+
switch definitionLanguage.semanticKind {
583+
case .clang:
593584
let swiftName: String?
594585
if let swiftReference = await getReferenceFromSwift(usr: usr, index: index, workspace: workspace) {
595586
let isObjectiveCSelector = definitionLanguage == .objective_c && definitionSymbol.kind.isMethod
@@ -604,7 +595,16 @@ extension SourceKitLSPServer {
604595
swiftName = nil
605596
}
606597
return CrossLanguageName(clangName: definitionName, swiftName: swiftName, definitionLanguage: definitionLanguage)
607-
case let swiftLanguageService as SwiftLanguageService:
598+
case .swift:
599+
guard
600+
let swiftLanguageService = await self.languageService(
601+
for: definitionDocumentUri,
602+
definitionLanguage,
603+
in: workspace
604+
) as? SwiftLanguageService
605+
else {
606+
throw ResponseError.unknown("Failed to get language service for the document defining \(usr)")
607+
}
608608
// Continue iteration if the symbol provider is not clang.
609609
// If we terminate early by returning `false` from the closure, `forEachSymbolOccurrence` returns `true`,
610610
// indicating that we have found a reference from clang.
@@ -1358,71 +1358,6 @@ extension SwiftLanguageService {
13581358

13591359
// MARK: - Clang
13601360

1361-
extension ClangLanguageService {
1362-
func rename(_ renameRequest: RenameRequest) async throws -> (edits: WorkspaceEdit, usr: String?) {
1363-
async let edits = forwardRequestToClangd(renameRequest)
1364-
let symbolInfoRequest = SymbolInfoRequest(
1365-
textDocument: renameRequest.textDocument,
1366-
position: renameRequest.position
1367-
)
1368-
let symbolDetail = try await forwardRequestToClangd(symbolInfoRequest).only
1369-
return (try await edits ?? WorkspaceEdit(), symbolDetail?.usr)
1370-
}
1371-
1372-
func editsToRename(
1373-
locations renameLocations: [RenameLocation],
1374-
in snapshot: DocumentSnapshot,
1375-
oldName oldCrossLanguageName: CrossLanguageName,
1376-
newName newCrossLanguageName: CrossLanguageName
1377-
) async throws -> [TextEdit] {
1378-
let positions = [
1379-
snapshot.uri: renameLocations.compactMap { snapshot.position(of: $0) }
1380-
]
1381-
guard
1382-
let oldName = oldCrossLanguageName.clangName,
1383-
let newName = newCrossLanguageName.clangName
1384-
else {
1385-
throw ResponseError.unknown(
1386-
"Failed to rename \(snapshot.uri.forLogging) because the clang name for rename is unknown"
1387-
)
1388-
}
1389-
let request = IndexedRenameRequest(
1390-
textDocument: TextDocumentIdentifier(snapshot.uri),
1391-
oldName: oldName,
1392-
newName: newName,
1393-
positions: positions
1394-
)
1395-
do {
1396-
let edits = try await forwardRequestToClangd(request)
1397-
return edits?.changes?[snapshot.uri] ?? []
1398-
} catch {
1399-
logger.error("Failed to get indexed rename edits: \(error.forLogging)")
1400-
return []
1401-
}
1402-
}
1403-
1404-
package func prepareRename(
1405-
_ request: PrepareRenameRequest
1406-
) async throws -> (prepareRename: PrepareRenameResponse, usr: String?)? {
1407-
guard let prepareRename = try await forwardRequestToClangd(request) else {
1408-
return nil
1409-
}
1410-
let symbolInfo = try await forwardRequestToClangd(
1411-
SymbolInfoRequest(textDocument: request.textDocument, position: request.position)
1412-
)
1413-
return (prepareRename, symbolInfo.only?.usr)
1414-
}
1415-
1416-
package func editsToRenameParametersInFunctionBody(
1417-
snapshot: DocumentSnapshot,
1418-
renameLocation: RenameLocation,
1419-
newName: CrossLanguageName
1420-
) async -> [TextEdit] {
1421-
// When renaming a clang function name, we don't need to rename any references to the arguments.
1422-
return []
1423-
}
1424-
}
1425-
14261361
fileprivate extension SyntaxProtocol {
14271362
/// Returns the parent node and casts it to the specified type.
14281363
func parent<S: SyntaxProtocol>(as syntaxType: S.Type) -> S? {

0 commit comments

Comments
 (0)