forked from intitni/CopilotForXcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCodeiumExtension.swift
More file actions
116 lines (99 loc) · 4.15 KB
/
CodeiumExtension.swift
File metadata and controls
116 lines (99 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import CopilotForXcodeKit
import Foundation
import Workspace
import Logger
import BuiltinExtension
public final class CodeiumExtension: BuiltinExtension {
public var suggestionService: SuggestionServiceType? { _suggestionService }
public var chatService: ChatServiceType? { nil }
public var promptToCodeService: PromptToCodeServiceType? { nil }
let workspacePool: WorkspacePool
let serviceLocator: ServiceLocator
let _suggestionService: CodeiumSuggestionService
public init(workspacePool: WorkspacePool) {
self.workspacePool = workspacePool
serviceLocator = .init(workspacePool: workspacePool)
_suggestionService = .init(serviceLocator: serviceLocator)
}
public func workspaceDidOpen(_: WorkspaceInfo) {}
public func workspaceDidClose(_: WorkspaceInfo) {}
public func workspace(_ workspace: WorkspaceInfo, didOpenDocumentAt documentURL: URL) {
// check if file size is larger than 15MB, if so, return immediately
if let attrs = try? FileManager.default
.attributesOfItem(atPath: documentURL.path),
let fileSize = attrs[FileAttributeKey.size] as? UInt64,
fileSize > 15 * 1024 * 1024
{ return }
Task {
do {
let content = try String(contentsOf: documentURL, encoding: .utf8)
guard let service = await serviceLocator.getService(from: workspace) else { return }
try await service.notifyOpenTextDocument(fileURL: documentURL, content: content)
} catch {
Logger.gitHubCopilot.error(error.localizedDescription)
}
}
}
public func workspace(_ workspace: WorkspaceInfo, didSaveDocumentAt documentURL: URL) {
// unimplemented
}
public func workspace(_ workspace: WorkspaceInfo, didCloseDocumentAt documentURL: URL) {
Task {
do {
guard let service = await serviceLocator.getService(from: workspace) else { return }
try await service.notifyCloseTextDocument(fileURL: documentURL)
} catch {
Logger.gitHubCopilot.error(error.localizedDescription)
}
}
}
public func workspace(
_ workspace: WorkspaceInfo,
didUpdateDocumentAt documentURL: URL,
content: String
) {
// check if file size is larger than 15MB, if so, return immediately
if let attrs = try? FileManager.default
.attributesOfItem(atPath: documentURL.path),
let fileSize = attrs[FileAttributeKey.size] as? UInt64,
fileSize > 15 * 1024 * 1024
{ return }
Task {
do {
let content = try String(contentsOf: documentURL, encoding: .utf8)
guard let service = await serviceLocator.getService(from: workspace) else { return }
try await service.notifyOpenTextDocument(fileURL: documentURL, content: content)
} catch {
Logger.gitHubCopilot.error(error.localizedDescription)
}
}
}
public func appConfigurationDidChange(_ configuration: AppConfiguration) {
if !configuration.chatServiceInUse && !configuration.suggestionServiceInUse {
for workspace in workspacePool.workspaces.values {
guard let plugin = workspace.plugin(for: CodeiumWorkspacePlugin.self)
else { continue }
plugin.terminate()
}
}
}
public func terminate() {
for workspace in workspacePool.workspaces.values {
guard let plugin = workspace.plugin(for: CodeiumWorkspacePlugin.self)
else { continue }
plugin.terminate()
}
}
}
final class ServiceLocator {
let workspacePool: WorkspacePool
init(workspacePool: WorkspacePool) {
self.workspacePool = workspacePool
}
func getService(from workspace: WorkspaceInfo) async -> CodeiumService? {
guard let workspace = workspacePool.workspaces[workspace.workspaceURL],
let plugin = workspace.plugin(for: CodeiumWorkspacePlugin.self)
else { return nil }
return plugin.codeiumService
}
}