mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
A number of tests were failing with the -Onone lifetime changes. Regardless of what happens with that change, I'd like to keep our tests passing with the stricter rules since we also test in release builds.
162 lines
6.3 KiB
Swift
162 lines
6.3 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2019 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import LanguageServerProtocol
|
|
import LSPTestSupport
|
|
import SKTestSupport
|
|
import SourceKitLSP
|
|
import XCTest
|
|
|
|
final class ExecuteCommandTests: XCTestCase {
|
|
|
|
/// Connection and lifetime management for the service.
|
|
var connection: TestSourceKitServer! = nil
|
|
|
|
/// The primary interface to make requests to the SourceKitServer.
|
|
var sk: TestClient! = nil
|
|
|
|
override func tearDown() {
|
|
sk = nil
|
|
connection = nil
|
|
}
|
|
|
|
override func setUp() {
|
|
connection = TestSourceKitServer()
|
|
sk = connection.client
|
|
_ = try! sk.sendSync(InitializeRequest(
|
|
processId: nil,
|
|
rootPath: nil,
|
|
rootURI: nil,
|
|
initializationOptions: nil,
|
|
capabilities: ClientCapabilities(workspace: nil, textDocument: nil),
|
|
trace: .off,
|
|
workspaceFolders: nil))
|
|
}
|
|
|
|
func testLocationSemanticRefactoring() throws {
|
|
guard let ws = try staticSourceKitTibsWorkspace(name: "SemanticRefactor") else { return }
|
|
let loc = ws.testLoc("sr:string")
|
|
try ws.openDocument(loc.url, language: .swift)
|
|
|
|
let textDocument = TextDocumentIdentifier(loc.url)
|
|
|
|
let args = SemanticRefactorCommand(title: "Localize String",
|
|
actionString: "source.refactoring.kind.localize.string",
|
|
positionRange: loc.position..<loc.position,
|
|
textDocument: textDocument)
|
|
|
|
let metadata = SourceKitLSPCommandMetadata(textDocument: textDocument)
|
|
|
|
var command = try args.asCommand()
|
|
command.arguments?.append(metadata.encodeToLSPAny())
|
|
|
|
let request = ExecuteCommandRequest(command: command.command, arguments: command.arguments)
|
|
|
|
ws.testServer.client.handleNextRequest { (req: Request<ApplyEditRequest>) in
|
|
req.reply(ApplyEditResponse(applied: true, failureReason: nil))
|
|
}
|
|
|
|
let result = try withExtendedLifetime(ws) { try ws.sk.sendSync(request) }
|
|
|
|
guard case .dictionary(let resultDict) = result else {
|
|
XCTFail("Result is not a dictionary.")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(WorkspaceEdit(fromLSPDictionary: resultDict), WorkspaceEdit(changes: [
|
|
DocumentURI(loc.url): [
|
|
TextEdit(range: Position(line: 1, utf16index: 29)..<Position(line: 1, utf16index: 29),
|
|
newText: "NSLocalizedString("),
|
|
TextEdit(range: Position(line: 1, utf16index: 44)..<Position(line: 1, utf16index: 44),
|
|
newText: ", comment: \"\")")
|
|
]
|
|
]))
|
|
}
|
|
|
|
func testRangeSemanticRefactoring() throws {
|
|
guard let ws = try staticSourceKitTibsWorkspace(name: "SemanticRefactor") else { return }
|
|
let loc = ws.testLoc("sr:foo")
|
|
try ws.openDocument(loc.url, language: .swift)
|
|
|
|
let textDocument = TextDocumentIdentifier(loc.url)
|
|
|
|
let startPosition = Position(line: 1, utf16index: 2)
|
|
let endPosition = Position(line: 2, utf16index: 10)
|
|
|
|
let args = SemanticRefactorCommand(title: "Extract Method",
|
|
actionString: "source.refactoring.kind.extract.function",
|
|
positionRange: startPosition..<endPosition,
|
|
textDocument: textDocument)
|
|
|
|
let metadata = SourceKitLSPCommandMetadata(textDocument: textDocument)
|
|
|
|
var command = try args.asCommand()
|
|
command.arguments?.append(metadata.encodeToLSPAny())
|
|
|
|
let request = ExecuteCommandRequest(command: command.command, arguments: command.arguments)
|
|
|
|
ws.testServer.client.handleNextRequest { (req: Request<ApplyEditRequest>) in
|
|
req.reply(ApplyEditResponse(applied: true, failureReason: nil))
|
|
}
|
|
|
|
let result = try withExtendedLifetime(ws) { try ws.sk.sendSync(request) }
|
|
|
|
guard case .dictionary(let resultDict) = result else {
|
|
XCTFail("Result is not a dictionary.")
|
|
return
|
|
}
|
|
|
|
XCTAssertEqual(WorkspaceEdit(fromLSPDictionary: resultDict), WorkspaceEdit(changes: [
|
|
DocumentURI(loc.url): [
|
|
TextEdit(range: Position(line: 0, utf16index: 0)..<Position(line: 0, utf16index: 0),
|
|
newText: "fileprivate func extractedFunc() -> String {\n/*sr:extractStart*/var a = \"/*sr:string*/\"\n return a\n}\n\n"),
|
|
TextEdit(range: Position(line: 1, utf16index: 2)..<Position(line: 2, utf16index: 10),
|
|
newText: "return extractedFunc()")
|
|
]
|
|
]))
|
|
}
|
|
|
|
func testLSPCommandMetadataRetrieval() {
|
|
var req = ExecuteCommandRequest(command: "", arguments: nil)
|
|
XCTAssertNil(req.metadata)
|
|
req.arguments = [1, 2, ""]
|
|
XCTAssertNil(req.metadata)
|
|
let url = URL(fileURLWithPath: "/a.swift")
|
|
let textDocument = TextDocumentIdentifier(url)
|
|
let metadata = SourceKitLSPCommandMetadata(textDocument: textDocument)
|
|
req.arguments = [metadata.encodeToLSPAny(), 1, 2, ""]
|
|
XCTAssertNil(req.metadata)
|
|
req.arguments = [1, 2, "", [metadata.encodeToLSPAny()]]
|
|
XCTAssertNil(req.metadata)
|
|
req.arguments = [1, 2, "", metadata.encodeToLSPAny()]
|
|
XCTAssertEqual(req.metadata, metadata)
|
|
req.arguments = [metadata.encodeToLSPAny()]
|
|
XCTAssertEqual(req.metadata, metadata)
|
|
}
|
|
|
|
func testLSPCommandMetadataRemoval() {
|
|
var req = ExecuteCommandRequest(command: "", arguments: nil)
|
|
XCTAssertNil(req.argumentsWithoutSourceKitMetadata)
|
|
req.arguments = [1, 2, ""]
|
|
XCTAssertEqual(req.arguments, req.argumentsWithoutSourceKitMetadata)
|
|
let url = URL(fileURLWithPath: "/a.swift")
|
|
let textDocument = TextDocumentIdentifier(url)
|
|
let metadata = SourceKitLSPCommandMetadata(textDocument: textDocument)
|
|
req.arguments = [metadata.encodeToLSPAny(), 1, 2, ""]
|
|
XCTAssertEqual(req.arguments, req.argumentsWithoutSourceKitMetadata)
|
|
req.arguments = [1, 2, "", [metadata.encodeToLSPAny()]]
|
|
XCTAssertEqual(req.arguments, req.argumentsWithoutSourceKitMetadata)
|
|
req.arguments = [1, 2, "", metadata.encodeToLSPAny()]
|
|
XCTAssertEqual([1, 2, ""], req.argumentsWithoutSourceKitMetadata)
|
|
}
|
|
}
|