From 26d3fca5dd96f3c1537048ed8d3f46a9533eb0df Mon Sep 17 00:00:00 2001 From: Richard Howell Date: Fri, 4 Oct 2019 15:14:04 -0700 Subject: [PATCH] use LSPResult instead of optionals --- Sources/SKCore/BuildServerBuildSystem.swift | 26 +++++---- Sources/SKCore/BuildSystem.swift | 6 +- Sources/SKCore/BuildSystemList.swift | 4 +- .../CompilationDatabaseBuildSystem.swift | 8 +-- Sources/SKCore/FallbackBuildSystem.swift | 8 +-- .../SKSwiftPMWorkspace/SwiftPMWorkspace.swift | 8 +-- .../BuildServerBuildSystemTests.swift | 58 +++++++++++-------- Tests/SourceKitTests/BuildSystemTests.swift | 8 +-- 8 files changed, 69 insertions(+), 57 deletions(-) diff --git a/Sources/SKCore/BuildServerBuildSystem.swift b/Sources/SKCore/BuildServerBuildSystem.swift index 0cd14772..ed0fd67a 100644 --- a/Sources/SKCore/BuildServerBuildSystem.swift +++ b/Sources/SKCore/BuildServerBuildSystem.swift @@ -184,24 +184,26 @@ extension BuildServerBuildSystem: BuildSystem { } } - public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) { + public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) { let req = BuildTargetSources(targets: targets) - _ = self.buildServer?.send(req, queue: requestQueue) { result in - if let items = result.success?.items { reply(items) } - else { - log("error fetching build target sources: \(result)") - reply(nil) + _ = self.buildServer?.send(req, queue: requestQueue) { response in + switch response { + case .success(let result): + reply(.success(result.items)) + case .failure(let error): + reply(.failure(error)) } } } - public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) { + public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) { let req = BuildTargetOutputPaths(targets: targets) - _ = self.buildServer?.send(req, queue: requestQueue) { result in - if let items = result.success?.items { reply(items) } - else { - log("error fetching build target outputs: \(result)") - reply(nil) + _ = self.buildServer?.send(req, queue: requestQueue) { response in + switch response { + case .success(let result): + reply(.success(result.items)) + case .failure(let error): + reply(.failure(error)) } } } diff --git a/Sources/SKCore/BuildSystem.swift b/Sources/SKCore/BuildSystem.swift index fe50fe23..deb135b7 100644 --- a/Sources/SKCore/BuildSystem.swift +++ b/Sources/SKCore/BuildSystem.swift @@ -55,10 +55,12 @@ public protocol BuildSystem: AnyObject { func buildTargets(reply: @escaping (LSPResult<[BuildTarget]>) -> Void) /// Returns the sources for the requested build targets - func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) + func buildTargetSources(targets: [BuildTargetIdentifier], + reply: @escaping (LSPResult<[SourcesItem]>) -> Void) /// Returns the output paths for the requested build targets - func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) + func buildTargetOutputPaths(targets: [BuildTargetIdentifier], + reply: @escaping (LSPResult<[OutputsItem]>) -> Void) } public let buildTargetsNotSupported = diff --git a/Sources/SKCore/BuildSystemList.swift b/Sources/SKCore/BuildSystemList.swift index 6b1805ff..b1852d83 100644 --- a/Sources/SKCore/BuildSystemList.swift +++ b/Sources/SKCore/BuildSystemList.swift @@ -67,11 +67,11 @@ extension BuildSystemList: BuildSystem { providers.first?.buildTargets(reply: reply) } - public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) { + public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) { providers.first?.buildTargetSources(targets: targets, reply: reply) } - public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) { + public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) { providers.first?.buildTargetOutputPaths(targets: targets, reply: reply) } } diff --git a/Sources/SKCore/CompilationDatabaseBuildSystem.swift b/Sources/SKCore/CompilationDatabaseBuildSystem.swift index 65197c77..0e72ef39 100644 --- a/Sources/SKCore/CompilationDatabaseBuildSystem.swift +++ b/Sources/SKCore/CompilationDatabaseBuildSystem.swift @@ -64,12 +64,12 @@ extension CompilationDatabaseBuildSystem: BuildSystem { reply(.failure(buildTargetsNotSupported)) } - public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) { - reply(nil) + public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } - public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) { - reply(nil) + public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } func database(for url: URL) -> CompilationDatabase? { diff --git a/Sources/SKCore/FallbackBuildSystem.swift b/Sources/SKCore/FallbackBuildSystem.swift index 19519718..b6a50d77 100644 --- a/Sources/SKCore/FallbackBuildSystem.swift +++ b/Sources/SKCore/FallbackBuildSystem.swift @@ -66,12 +66,12 @@ public final class FallbackBuildSystem: BuildSystem { reply(.failure(buildTargetsNotSupported)) } - public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) { - reply(nil) + public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } - public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) { - reply(nil) + public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } func settingsSwift(_ path: AbsolutePath) -> FileBuildSettings { diff --git a/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift b/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift index 07d27bb8..fc7c9eb5 100644 --- a/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift +++ b/Sources/SKSwiftPMWorkspace/SwiftPMWorkspace.swift @@ -239,12 +239,12 @@ extension SwiftPMWorkspace: BuildSystem { reply(.failure(buildTargetsNotSupported)) } - public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) { - reply(nil) + public func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } - public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) { - reply(nil) + public func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } /// Returns the resolved target description for the given file, if one is known. diff --git a/Tests/SKCoreTests/BuildServerBuildSystemTests.swift b/Tests/SKCoreTests/BuildServerBuildSystemTests.swift index d4021a5d..2a9b96f5 100644 --- a/Tests/SKCoreTests/BuildServerBuildSystemTests.swift +++ b/Tests/SKCoreTests/BuildServerBuildSystemTests.swift @@ -114,22 +114,26 @@ final class BuildServerBuildSystemTests: XCTestCase { BuildTargetIdentifier(uri: URL(string: "build://target/a")!), BuildTargetIdentifier(uri: URL(string: "build://target/b")!), ] - buildSystem?.buildTargetSources(targets: targets, reply: { items in - XCTAssertNotNil(items) - XCTAssertEqual(items?[0].target.uri, targets[0].uri) - XCTAssertEqual(items?[1].target.uri, targets[1].uri) - XCTAssertEqual(items?[0].sources[0].uri, URL(fileURLWithPath: "/path/to/a/file")) - XCTAssertEqual(items?[0].sources[0].kind, SourceItemKind.file) - XCTAssertEqual(items?[0].sources[1].uri, URL(fileURLWithPath: "/path/to/a/folder/")) - XCTAssertEqual(items?[0].sources[1].kind, SourceItemKind.directory) - XCTAssertEqual(items?[1].sources[0].uri, URL(fileURLWithPath: "/path/to/b/file")) - XCTAssertEqual(items?[1].sources[0].kind, SourceItemKind.file) - XCTAssertEqual(items?[1].sources[1].uri, URL(fileURLWithPath: "/path/to/b/folder/")) - XCTAssertEqual(items?[1].sources[1].kind, SourceItemKind.directory) - - expectation.fulfill() + buildSystem?.buildTargetSources(targets: targets, reply: { response in + switch(response) { + case .success(let items): + XCTAssertNotNil(items) + XCTAssertEqual(items[0].target.uri, targets[0].uri) + XCTAssertEqual(items[1].target.uri, targets[1].uri) + XCTAssertEqual(items[0].sources[0].uri, URL(fileURLWithPath: "/path/to/a/file")) + XCTAssertEqual(items[0].sources[0].kind, SourceItemKind.file) + XCTAssertEqual(items[0].sources[1].uri, URL(fileURLWithPath: "/path/to/a/folder/")) + XCTAssertEqual(items[0].sources[1].kind, SourceItemKind.directory) + XCTAssertEqual(items[1].sources[0].uri, URL(fileURLWithPath: "/path/to/b/file")) + XCTAssertEqual(items[1].sources[0].kind, SourceItemKind.file) + XCTAssertEqual(items[1].sources[1].uri, URL(fileURLWithPath: "/path/to/b/folder/")) + XCTAssertEqual(items[1].sources[1].kind, SourceItemKind.directory) + expectation.fulfill() + case .failure(let error): + XCTFail(error.message) + } }) - XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: 1), .completed) + XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: 15), .completed) } func testBuildTargetOutputs() { @@ -143,17 +147,21 @@ final class BuildServerBuildSystemTests: XCTestCase { let targets = [ BuildTargetIdentifier(uri: URL(string: "build://target/a")!), ] - buildSystem?.buildTargetOutputPaths(targets: targets, reply: { items in - XCTAssertNotNil(items) - XCTAssertEqual(items?[0].target.uri, targets[0].uri) - XCTAssertEqual(items?[0].outputPaths, [ - URL(fileURLWithPath: "/path/to/a/file"), - URL(fileURLWithPath: "/path/to/a/file2"), - ]) - - expectation.fulfill() + buildSystem?.buildTargetOutputPaths(targets: targets, reply: { response in + switch(response) { + case .success(let items): + XCTAssertNotNil(items) + XCTAssertEqual(items[0].target.uri, targets[0].uri) + XCTAssertEqual(items[0].outputPaths, [ + URL(fileURLWithPath: "/path/to/a/file"), + URL(fileURLWithPath: "/path/to/a/file2"), + ]) + expectation.fulfill() + case .failure(let error): + XCTFail(error.message) + } }) - XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: 1), .completed) + XCTAssertEqual(XCTWaiter.wait(for: [expectation], timeout: 15), .completed) } } diff --git a/Tests/SourceKitTests/BuildSystemTests.swift b/Tests/SourceKitTests/BuildSystemTests.swift index 6cb79340..2a02e84e 100644 --- a/Tests/SourceKitTests/BuildSystemTests.swift +++ b/Tests/SourceKitTests/BuildSystemTests.swift @@ -59,12 +59,12 @@ final class TestBuildSystem: BuildSystem { reply(.failure(buildTargetsNotSupported)) } - func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping ([SourcesItem]?) -> Void) { - reply(nil) + func buildTargetSources(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[SourcesItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } - func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping ([OutputsItem]?) -> Void) { - reply(nil) + func buildTargetOutputPaths(targets: [BuildTargetIdentifier], reply: @escaping (LSPResult<[OutputsItem]>) -> Void) { + reply(.failure(buildTargetsNotSupported)) } }