Skip to content

Commit b83bfbd

Browse files
authored
Merge pull request #1052 from ahoppen/ahoppen/skip-indexed-rename
Skip tests that require the workspace/indexedRename request if clangd doesn’t have support for it
2 parents b48a9ca + 20e734e commit b83bfbd

File tree

7 files changed

+67
-1
lines changed

7 files changed

+67
-1
lines changed

Sources/SKTestSupport/SkipUnless.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,36 @@ public enum SkipUnless {
139139
}
140140
}
141141

142+
/// Whether clangd has support for the `workspace/indexedRename` request.
143+
public static func clangdSupportsIndexBasedRename(
144+
file: StaticString = #file,
145+
line: UInt = #line
146+
) async throws {
147+
try await skipUnlessSupportedByToolchain(
148+
swiftVersion: SwiftVersion(5, 11),
149+
featureName: "rename support in clangd",
150+
file: file,
151+
line: line
152+
) {
153+
let testClient = try await TestSourceKitLSPClient()
154+
let uri = DocumentURI.for(.c)
155+
let positions = testClient.openDocument("void 1️⃣test() {}", uri: uri)
156+
do {
157+
_ = try await testClient.send(
158+
IndexedRenameRequest(
159+
textDocument: TextDocumentIdentifier(uri),
160+
oldName: "test",
161+
newName: "test2",
162+
positions: [uri: [positions["1️⃣"]]]
163+
)
164+
)
165+
} catch let error as ResponseError {
166+
return error.message != "method not found"
167+
}
168+
return true
169+
}
170+
}
171+
142172
/// SwiftPM moved the location where it stores Swift modules to a subdirectory in
143173
/// https://github.com/apple/swift-package-manager/pull/7103.
144174
///

Sources/SourceKitLSP/Clang/ClangLanguageServer.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,10 @@ extension ClangLanguageServerShim {
609609
throw ResponseError.unknown("unsupported method")
610610
}
611611

612+
func indexedRename(_ request: IndexedRenameRequest) async throws -> WorkspaceEdit? {
613+
return try await forwardRequestToClangd(request)
614+
}
615+
612616
// MARK: - Other
613617

614618
func executeCommand(_ req: ExecuteCommandRequest) async throws -> LSPAny? {

Sources/SourceKitLSP/Rename.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,14 @@ extension SourceKitServer {
759759
prepareRenameResult.placeholder = oldName.definitionName
760760
return prepareRenameResult
761761
}
762+
763+
func indexedRename(
764+
_ request: IndexedRenameRequest,
765+
workspace: Workspace,
766+
languageService: ToolchainLanguageServer
767+
) async throws -> WorkspaceEdit? {
768+
return try await languageService.indexedRename(request)
769+
}
762770
}
763771

764772
// MARK: - Swift

Sources/SourceKitLSP/SourceKitServer.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -919,9 +919,11 @@ extension SourceKitServer: MessageHandler {
919919
await self.handleRequest(for: request, requestHandler: self.documentDiagnostic)
920920
case let request as RequestAndReply<PrepareRenameRequest>:
921921
await self.handleRequest(for: request, requestHandler: self.prepareRename)
922+
case let request as RequestAndReply<IndexedRenameRequest>:
923+
await self.handleRequest(for: request, requestHandler: self.indexedRename)
922924
// IMPORTANT: When adding a new entry to this switch, also add it to the `TaskMetadata` initializer.
923925
default:
924-
reply(.failure(ResponseError.methodNotFound(R.method)))
926+
await request.reply { throw ResponseError.methodNotFound(R.method) }
925927
}
926928
}
927929
}

Sources/SourceKitLSP/Swift/SwiftLanguageServer.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,10 @@ extension SwiftLanguageServer {
812812
}
813813
}
814814

815+
public func indexedRename(_ request: IndexedRenameRequest) async throws -> WorkspaceEdit? {
816+
throw ResponseError.unknown("unsupported method")
817+
}
818+
815819
public func executeCommand(_ req: ExecuteCommandRequest) async throws -> LSPAny? {
816820
// TODO: If there's support for several types of commands, we might need to structure this similarly to the code actions request.
817821
guard let sourceKitServer else {

Sources/SourceKitLSP/ToolchainLanguageServer.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ public protocol ToolchainLanguageServer: AnyObject {
165165
/// Return compound decl name that will be used as a placeholder for a rename request at a specific position.
166166
func prepareRename(_ request: PrepareRenameRequest) async throws -> PrepareRenameResponse?
167167

168+
func indexedRename(_ request: IndexedRenameRequest) async throws -> WorkspaceEdit?
169+
168170
// MARK: - Other
169171

170172
func executeCommand(_ req: ExecuteCommandRequest) async throws -> LSPAny?

Tests/SourceKitLSPTests/RenameTests.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@ final class RenameTests: XCTestCase {
782782
}
783783

784784
func testGlobalRenameC() async throws {
785+
try await SkipUnless.clangdSupportsIndexBasedRename()
785786
try await assertMultiFileRename(
786787
files: [
787788
"Sources/MyLibrary/include/lib.h": """
@@ -814,6 +815,7 @@ final class RenameTests: XCTestCase {
814815
}
815816

816817
func testGlobalRenameObjC() async throws {
818+
try await SkipUnless.clangdSupportsIndexBasedRename()
817819
try await assertMultiFileRename(
818820
files: [
819821
"Sources/MyLibrary/include/lib.h": """
@@ -856,6 +858,7 @@ final class RenameTests: XCTestCase {
856858

857859
final class CrossLanguageRenameTests: XCTestCase {
858860
func testZeroArgCFunction() async throws {
861+
try await SkipUnless.clangdSupportsIndexBasedRename()
859862
try await assertMultiFileRename(
860863
files: [
861864
"LibA/include/LibA.h": """
@@ -897,6 +900,7 @@ final class CrossLanguageRenameTests: XCTestCase {
897900
}
898901

899902
func testMultiArgCFunction() async throws {
903+
try await SkipUnless.clangdSupportsIndexBasedRename()
900904
try await assertMultiFileRename(
901905
files: [
902906
"LibA/include/LibA.h": """
@@ -937,6 +941,7 @@ final class CrossLanguageRenameTests: XCTestCase {
937941
}
938942

939943
func testCFunctionWithSwiftNameAnnotation() async throws {
944+
try await SkipUnless.clangdSupportsIndexBasedRename()
940945
try await assertMultiFileRename(
941946
files: [
942947
"LibA/include/LibA.h": """
@@ -979,6 +984,7 @@ final class CrossLanguageRenameTests: XCTestCase {
979984

980985
func testZeroArgObjCSelector() async throws {
981986
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
987+
try await SkipUnless.clangdSupportsIndexBasedRename()
982988
try await assertMultiFileRename(
983989
files: [
984990
"LibA/include/LibA.h": """
@@ -1033,6 +1039,7 @@ final class CrossLanguageRenameTests: XCTestCase {
10331039

10341040
func testZeroArgObjCClassSelector() async throws {
10351041
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1042+
try await SkipUnless.clangdSupportsIndexBasedRename()
10361043
try await assertMultiFileRename(
10371044
files: [
10381045
"LibA/include/LibA.h": """
@@ -1087,6 +1094,7 @@ final class CrossLanguageRenameTests: XCTestCase {
10871094

10881095
func testOneArgObjCSelector() async throws {
10891096
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1097+
try await SkipUnless.clangdSupportsIndexBasedRename()
10901098
try await assertMultiFileRename(
10911099
files: [
10921100
"LibA/include/LibA.h": """
@@ -1141,6 +1149,7 @@ final class CrossLanguageRenameTests: XCTestCase {
11411149

11421150
func testMultiArgObjCSelector() async throws {
11431151
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1152+
try await SkipUnless.clangdSupportsIndexBasedRename()
11441153
try await assertMultiFileRename(
11451154
files: [
11461155
"LibA/include/LibA.h": """
@@ -1195,6 +1204,7 @@ final class CrossLanguageRenameTests: XCTestCase {
11951204

11961205
func testObjCSelectorWithSwiftNameAnnotation() async throws {
11971206
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1207+
try await SkipUnless.clangdSupportsIndexBasedRename()
11981208
try await assertMultiFileRename(
11991209
files: [
12001210
"LibA/include/LibA.h": """
@@ -1249,6 +1259,7 @@ final class CrossLanguageRenameTests: XCTestCase {
12491259

12501260
func testObjCClass() async throws {
12511261
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1262+
try await SkipUnless.clangdSupportsIndexBasedRename()
12521263
try await assertMultiFileRename(
12531264
files: [
12541265
"LibA/include/LibA.h": """
@@ -1293,6 +1304,7 @@ final class CrossLanguageRenameTests: XCTestCase {
12931304

12941305
func testObjCClassWithSwiftNameAnnotation() async throws {
12951306
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1307+
try await SkipUnless.clangdSupportsIndexBasedRename()
12961308
try await assertMultiFileRename(
12971309
files: [
12981310
"LibA/include/LibA.h": """
@@ -1338,6 +1350,7 @@ final class CrossLanguageRenameTests: XCTestCase {
13381350
}
13391351

13401352
func testCppMethod() async throws {
1353+
try await SkipUnless.clangdSupportsIndexBasedRename()
13411354
try await assertMultiFileRename(
13421355
files: [
13431356
"LibA/include/LibA.h": """
@@ -1395,6 +1408,7 @@ final class CrossLanguageRenameTests: XCTestCase {
13951408
}
13961409

13971410
func testCppMethodWithSwiftName() async throws {
1411+
try await SkipUnless.clangdSupportsIndexBasedRename()
13981412
try await assertMultiFileRename(
13991413
files: [
14001414
"LibA/include/LibA.h": """
@@ -1452,6 +1466,7 @@ final class CrossLanguageRenameTests: XCTestCase {
14521466
}
14531467

14541468
func testCppMethodInObjCpp() async throws {
1469+
try await SkipUnless.clangdSupportsIndexBasedRename()
14551470
try await assertMultiFileRename(
14561471
files: [
14571472
"LibA/include/LibA.h": """
@@ -1510,6 +1525,7 @@ final class CrossLanguageRenameTests: XCTestCase {
15101525

15111526
func testZeroArgObjCClassSelectorInObjCpp() async throws {
15121527
try SkipUnless.platformIsDarwin("Non-Darwin platforms don't support Objective-C")
1528+
try await SkipUnless.clangdSupportsIndexBasedRename()
15131529
try await assertMultiFileRename(
15141530
files: [
15151531
"LibA/include/LibA.h": """

0 commit comments

Comments
 (0)