Skip to content

Commit 65a07ef

Browse files
committed
Update SuggestionService to use builtin extensions
1 parent 8105b9c commit 65a07ef

File tree

1 file changed

+46
-72
lines changed

1 file changed

+46
-72
lines changed
Lines changed: 46 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
import BuiltinExtension
2+
import struct CopilotForXcodeKit.WorkspaceInfo
13
import Foundation
4+
import GitHubCopilotService
25
import Preferences
36
import SuggestionModel
47
import SuggestionProvider
58
import UserDefaultsObserver
9+
import Workspace
610

711
#if canImport(ProExtension)
812
import ProExtension
@@ -11,119 +15,89 @@ import ProExtension
1115
public protocol SuggestionServiceType: SuggestionServiceProvider {}
1216

1317
public actor SuggestionService: SuggestionServiceType {
14-
public var configuration: SuggestionServiceConfiguration {
18+
public var configuration: SuggestionProvider.SuggestionServiceConfiguration {
1519
get async { await suggestionProvider.configuration }
1620
}
1721

18-
var middlewares: [SuggestionServiceMiddleware] {
19-
SuggestionServiceMiddlewareContainer.middlewares
20-
}
21-
22-
let projectRootURL: URL
23-
let onServiceLaunched: (SuggestionServiceProvider) -> Void
24-
let providerChangeObserver = UserDefaultsObserver(
25-
object: UserDefaults.shared,
26-
forKeyPaths: [UserDefaultPreferenceKeys().suggestionFeatureProvider.key],
27-
context: nil
28-
)
22+
let middlewares: [SuggestionServiceMiddleware]
2923

30-
lazy var suggestionProvider: SuggestionServiceProvider = buildService()
31-
32-
var serviceType: SuggestionFeatureProvider {
33-
UserDefaults.shared.value(for: \.suggestionFeatureProvider)
34-
}
24+
let suggestionProvider: SuggestionServiceProvider
3525

3626
public init(
37-
projectRootURL: URL,
38-
onServiceLaunched: @escaping (SuggestionServiceProvider) -> Void
27+
provider: any SuggestionServiceProvider,
28+
middlewares: [SuggestionServiceMiddleware] = SuggestionServiceMiddlewareContainer
29+
.middlewares
3930
) {
40-
self.projectRootURL = projectRootURL
41-
self.onServiceLaunched = onServiceLaunched
42-
43-
providerChangeObserver.onChange = { [weak self] in
44-
Task { [weak self] in
45-
guard let self else { return }
46-
await rebuildService()
47-
}
48-
}
31+
suggestionProvider = provider
32+
self.middlewares = middlewares
4933
}
5034

51-
func buildService() -> SuggestionServiceProvider {
35+
public static func service(
36+
for serviceType: SuggestionFeatureProvider = UserDefaults.shared
37+
.value(for: \.suggestionFeatureProvider)
38+
) -> SuggestionService {
5239
#if canImport(ProExtension)
5340
if let provider = ProExtension.suggestionProviderFactory(serviceType) {
54-
return provider
41+
return SuggestionService(provider: provider)
5542
}
5643
#endif
5744

5845
switch serviceType {
5946
case .builtIn(.codeium):
60-
return CodeiumSuggestionProvider(
61-
projectRootURL: projectRootURL,
62-
onServiceLaunched: onServiceLaunched
63-
)
47+
fatalError()
48+
// let provider = CodeiumSuggestionProvider(
49+
// projectRootURL: projectRootURL,
50+
// onServiceLaunched: onServiceLaunched
51+
// )
52+
// return SuggestionService(provider: provider)
6453
case .builtIn(.gitHubCopilot), .extension:
65-
return GitHubCopilotSuggestionProvider(
66-
projectRootURL: projectRootURL,
67-
onServiceLaunched: onServiceLaunched
54+
let provider = BuiltinExtensionSuggestionServiceProvider(
55+
extension: GitHubCopilotExtension.self
6856
)
57+
return SuggestionService(provider: provider)
6958
}
7059
}
71-
72-
func rebuildService() {
73-
suggestionProvider = buildService()
74-
}
7560
}
7661

7762
public extension SuggestionService {
7863
func getSuggestions(
79-
_ request: SuggestionRequest
64+
_ request: SuggestionRequest,
65+
workspaceInfo: CopilotForXcodeKit.WorkspaceInfo
8066
) async throws -> [SuggestionModel.CodeSuggestion] {
81-
var getSuggestion = suggestionProvider.getSuggestions
67+
var getSuggestion = suggestionProvider.getSuggestions(_:workspaceInfo:)
8268
let configuration = await configuration
8369

8470
for middleware in middlewares.reversed() {
85-
getSuggestion = { [getSuggestion] request in
71+
getSuggestion = { [getSuggestion] request, workspaceInfo in
8672
try await middleware.getSuggestion(
8773
request,
8874
configuration: configuration,
89-
next: getSuggestion
75+
next: { [getSuggestion] request in
76+
try await getSuggestion(request, workspaceInfo)
77+
}
9078
)
9179
}
9280
}
9381

94-
return try await getSuggestion(request)
95-
}
96-
97-
func notifyAccepted(_ suggestion: SuggestionModel.CodeSuggestion) async {
98-
await suggestionProvider.notifyAccepted(suggestion)
99-
}
100-
101-
func notifyRejected(_ suggestions: [SuggestionModel.CodeSuggestion]) async {
102-
await suggestionProvider.notifyRejected(suggestions)
103-
}
104-
105-
func notifyOpenTextDocument(fileURL: URL, content: String) async throws {
106-
try await suggestionProvider.notifyOpenTextDocument(fileURL: fileURL, content: content)
107-
}
108-
109-
func notifyChangeTextDocument(fileURL: URL, content: String) async throws {
110-
try await suggestionProvider.notifyChangeTextDocument(fileURL: fileURL, content: content)
111-
}
112-
113-
func notifyCloseTextDocument(fileURL: URL) async throws {
114-
try await suggestionProvider.notifyCloseTextDocument(fileURL: fileURL)
82+
return try await getSuggestion(request, workspaceInfo)
11583
}
11684

117-
func notifySaveTextDocument(fileURL: URL) async throws {
118-
try await suggestionProvider.notifySaveTextDocument(fileURL: fileURL)
85+
func notifyAccepted(
86+
_ suggestion: SuggestionModel.CodeSuggestion,
87+
workspaceInfo: CopilotForXcodeKit.WorkspaceInfo
88+
) async {
89+
await suggestionProvider.notifyAccepted(suggestion, workspaceInfo: workspaceInfo)
11990
}
12091

121-
func cancelRequest() async {
122-
await suggestionProvider.cancelRequest()
92+
func notifyRejected(
93+
_ suggestions: [SuggestionModel.CodeSuggestion],
94+
workspaceInfo: CopilotForXcodeKit.WorkspaceInfo
95+
) async {
96+
await suggestionProvider.notifyRejected(suggestions, workspaceInfo: workspaceInfo)
12397
}
12498

125-
func terminate() async {
126-
await suggestionProvider.terminate()
99+
func cancelRequest(workspaceInfo: CopilotForXcodeKit.WorkspaceInfo) async {
100+
await suggestionProvider.cancelRequest(workspaceInfo: workspaceInfo)
127101
}
128102
}
129103

0 commit comments

Comments
 (0)