Skip to content

Commit e0b2687

Browse files
committed
Support presenting suggestion error when needed
1 parent d456d58 commit e0b2687

File tree

3 files changed

+41
-20
lines changed

3 files changed

+41
-20
lines changed

Core/Sources/Service/SuggestionCommandHandler/PseudoCommandHandler.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import ActiveApplicationMonitor
22
import AppKit
33
import CodeiumService
4+
import enum CopilotForXcodeKit.SuggestionServiceError
45
import Dependencies
6+
import Logger
57
import PlusFeatureFlag
68
import Preferences
79
import SuggestionInjector
@@ -107,7 +109,16 @@ struct PseudoCommandHandler {
107109
} else {
108110
presenter.discardSuggestion(fileURL: fileURL)
109111
}
112+
} catch let error as SuggestionServiceError {
113+
switch error {
114+
case let .notice(error):
115+
presenter.presentErrorMessage(error.localizedDescription)
116+
case .silent:
117+
Logger.service.error(error.localizedDescription)
118+
return
119+
}
110120
} catch {
121+
Logger.service.error(error.localizedDescription)
111122
return
112123
}
113124
}

Core/Sources/SuggestionService/SuggestionService.swift

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import BuiltinExtension
22
import CodeiumService
33
import struct CopilotForXcodeKit.WorkspaceInfo
4+
import enum CopilotForXcodeKit.SuggestionServiceError
45
import Foundation
56
import GitHubCopilotService
67
import Preferences
@@ -63,22 +64,28 @@ public extension SuggestionService {
6364
_ request: SuggestionRequest,
6465
workspaceInfo: CopilotForXcodeKit.WorkspaceInfo
6566
) async throws -> [SuggestionModel.CodeSuggestion] {
66-
var getSuggestion = suggestionProvider.getSuggestions(_:workspaceInfo:)
67-
let configuration = await configuration
68-
69-
for middleware in middlewares.reversed() {
70-
getSuggestion = { [getSuggestion] request, workspaceInfo in
71-
try await middleware.getSuggestion(
72-
request,
73-
configuration: configuration,
74-
next: { [getSuggestion] request in
75-
try await getSuggestion(request, workspaceInfo)
76-
}
77-
)
67+
do {
68+
var getSuggestion = suggestionProvider.getSuggestions(_:workspaceInfo:)
69+
let configuration = await configuration
70+
71+
for middleware in middlewares.reversed() {
72+
getSuggestion = { [getSuggestion] request, workspaceInfo in
73+
try await middleware.getSuggestion(
74+
request,
75+
configuration: configuration,
76+
next: { [getSuggestion] request in
77+
try await getSuggestion(request, workspaceInfo)
78+
}
79+
)
80+
}
7881
}
82+
83+
return try await getSuggestion(request, workspaceInfo)
84+
} catch let error as SuggestionServiceError {
85+
throw error
86+
} catch {
87+
throw SuggestionServiceError.silent(error)
7988
}
80-
81-
return try await getSuggestion(request, workspaceInfo)
8289
}
8390

8491
func notifyAccepted(

Tool/Sources/GitHubCopilotService/LanguageServer/GitHubCopilotService.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import AppKit
2+
import enum CopilotForXcodeKit.SuggestionServiceError
23
import Foundation
34
import LanguageClient
45
import LanguageServerProtocol
@@ -95,7 +96,7 @@ public class GitHubCopilotBaseService {
9596
let projectRootURL: URL
9697
var server: GitHubCopilotLSP
9798
var localProcessServer: CopilotLocalProcessServer?
98-
99+
99100
deinit {
100101
localProcessServer?.terminate()
101102
}
@@ -111,7 +112,7 @@ public class GitHubCopilotBaseService {
111112
let urls = try GitHubCopilotBaseService.createFoldersIfNeeded()
112113
let executionParams: Process.ExecutionParameters
113114
let runner = UserDefaults.shared.value(for: \.runNodeWith)
114-
115+
115116
guard let agentJSURL = {
116117
let languageServerDotJS = urls.executableURL
117118
.appendingPathComponent("copilot/dist/language-server.js")
@@ -129,7 +130,8 @@ public class GitHubCopilotBaseService {
129130

130131
let indexJSURL: URL = try {
131132
if UserDefaults.shared.value(for: \.gitHubCopilotLoadKeyChainCertificates) {
132-
let url = urls.executableURL.appendingPathComponent("load-self-signed-cert-1.34.0.js")
133+
let url = urls.executableURL
134+
.appendingPathComponent("load-self-signed-cert-1.34.0.js")
133135
if !FileManager.default.fileExists(atPath: url.path) {
134136
let file = Bundle.module.url(
135137
forResource: "load-self-signed-cert-1.34.0",
@@ -409,8 +411,9 @@ public final class GitHubCopilotService: GitHubCopilotBaseService,
409411
return completions
410412
} catch let error as ServerError {
411413
switch error {
412-
case .serverError(1000, _, _):
413-
throw GitHubCopilotError.languageServerError(error)
414+
case .serverError(1000, _, _): // not logged-in error
415+
throw SuggestionServiceError
416+
.notice(GitHubCopilotError.languageServerError(error))
414417
case .serverError:
415418
// sometimes the content inside language server is not new enough, which can
416419
// lead to an version mismatch error. We can try a few times until the content
@@ -429,7 +432,7 @@ public final class GitHubCopilotService: GitHubCopilotBaseService,
429432
throw error
430433
}
431434
}
432-
435+
433436
func recoverContent() async {
434437
try? await notifyChangeTextDocument(
435438
fileURL: fileURL,

0 commit comments

Comments
 (0)