From 03a122dd234b05cdec3b56e62e7daa8633ee89fe Mon Sep 17 00:00:00 2001 From: Alex Hoppen Date: Tue, 9 Jan 2024 12:05:21 -0800 Subject: [PATCH] =?UTF-8?q?Ensure=20rename=20tests=20don=E2=80=99t=20fail?= =?UTF-8?q?=20if=20running=20with=20a=20sourcekitd=20that=20doesn=E2=80=99?= =?UTF-8?q?t=20support=20rename=20yet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Just another case of making sure that sourcekit-lsp’s tests don’t fail after checking out the repo and running its tests using eg. Xcode 15.1 without an open source toolchain snapshot. --- Sources/SourceKitLSP/Rename.swift | 6 ++- Tests/SourceKitLSPTests/RenameTests.swift | 66 +++++++++++++++++------ 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/Sources/SourceKitLSP/Rename.swift b/Sources/SourceKitLSP/Rename.swift index 84e975fd..d69782a8 100644 --- a/Sources/SourceKitLSP/Rename.swift +++ b/Sources/SourceKitLSP/Rename.swift @@ -592,8 +592,10 @@ extension SwiftLanguageServer { in: snapshot, includeNonEditableBaseNames: true ) - guard let name = response.name, - let range = response.relatedIdentifiers.first(where: { $0.range.contains(request.position) })?.range + guard let name = response.name else { + throw ResponseError.unknown("Running sourcekit-lsp with a version of sourcekitd that does not support rename") + } + guard let range = response.relatedIdentifiers.first(where: { $0.range.contains(request.position) })?.range else { return nil } diff --git a/Tests/SourceKitLSPTests/RenameTests.swift b/Tests/SourceKitLSPTests/RenameTests.swift index 4acebea3..4f90a2d9 100644 --- a/Tests/SourceKitLSPTests/RenameTests.swift +++ b/Tests/SourceKitLSPTests/RenameTests.swift @@ -46,13 +46,22 @@ private func assertSingleFileRename( let uri = DocumentURI.for(.swift, testName: testName) let positions = testClient.openDocument(markedSource, uri: uri) for marker in positions.allMarkers { - let response = try await testClient.send( - RenameRequest( - textDocument: TextDocumentIdentifier(uri), - position: positions[marker], - newName: newName + let response: WorkspaceEdit? + do { + response = try await testClient.send( + RenameRequest( + textDocument: TextDocumentIdentifier(uri), + position: positions[marker], + newName: newName + ) ) - ) + } catch let error as ResponseError { + if error.message == "Running sourcekit-lsp with a version of sourcekitd that does not support rename" { + throw XCTSkip(error.message) + } else { + throw error + } + } let edits = try XCTUnwrap(response?.changes?[uri], "while performing rename at \(marker)", file: file, line: line) let source = extractMarkers(markedSource).textWithoutMarkers let renamed = apply(edits: edits, to: source) @@ -127,9 +136,18 @@ private func assertMultiFileRename( ws.testClient.send(DidCloseTextDocumentNotification(textDocument: TextDocumentIdentifier(uri))) } for marker in markers { - let response = try await ws.testClient.send( - RenameRequest(textDocument: TextDocumentIdentifier(uri), position: positions[marker], newName: newName) - ) + let response: WorkspaceEdit? + do { + response = try await ws.testClient.send( + RenameRequest(textDocument: TextDocumentIdentifier(uri), position: positions[marker], newName: newName) + ) + } catch let error as ResponseError { + if error.message == "Running sourcekit-lsp with a version of sourcekitd that does not support rename" { + throw XCTSkip(error.message) + } else { + throw error + } + } let changes = try XCTUnwrap(response?.changes) try assertRenamedSourceMatches( originalFiles: files, @@ -696,9 +714,18 @@ final class RenameTests: XCTestCase { """, uri: uri ) - let response = try await testClient.send( - PrepareRenameRequest(textDocument: TextDocumentIdentifier(uri), position: positions["1️⃣"]) - ) + let response: PrepareRenameResponse? + do { + response = try await testClient.send( + PrepareRenameRequest(textDocument: TextDocumentIdentifier(uri), position: positions["1️⃣"]) + ) + } catch let error as ResponseError { + if error.message == "Running sourcekit-lsp with a version of sourcekitd that does not support rename" { + throw XCTSkip(error.message) + } else { + throw error + } + } let range = try XCTUnwrap(response?.range) let placeholder = try XCTUnwrap(response?.placeholder) XCTAssertEqual(range, positions["1️⃣"]..