1+ import BuiltinExtension
2+ import struct CopilotForXcodeKit. WorkspaceInfo
13import Foundation
4+ import GitHubCopilotService
25import Preferences
36import SuggestionModel
47import SuggestionProvider
58import UserDefaultsObserver
9+ import Workspace
610
711#if canImport(ProExtension)
812import ProExtension
@@ -11,119 +15,89 @@ import ProExtension
1115public protocol SuggestionServiceType : SuggestionServiceProvider { }
1216
1317public 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
7762public 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