-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathWidgetDataSource.swift
More file actions
109 lines (103 loc) · 4.17 KB
/
WidgetDataSource.swift
File metadata and controls
109 lines (103 loc) · 4.17 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
import ActiveApplicationMonitor
import AppActivator
import AppKit
import ChatService
import ComposableArchitecture
import Foundation
import GitHubCopilotService
import ChatAPIService
import PromptToCodeService
import SuggestionBasic
import SuggestionWidget
import WorkspaceSuggestionService
import Workspace
@MainActor
final class WidgetDataSource {}
extension WidgetDataSource: SuggestionWidgetDataSource {
func suggestionForFile(at url: URL) async -> CodeSuggestionProvider? {
for workspace in Service.shared.workspacePool.workspaces.values {
if let filespace = workspace.filespaces[url],
let suggestion = filespace.presentingSuggestion
{
return .init(
code: suggestion.text,
language: filespace.language.rawValue,
startLineIndex: suggestion.position.line,
suggestionCount: filespace.suggestions.count,
currentSuggestionIndex: filespace.suggestionIndex,
onSelectPreviousSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.presentPreviousSuggestion()
}
},
onSelectNextSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.presentNextSuggestion()
}
},
onRejectSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.rejectSuggestions()
NSWorkspace.activatePreviousActiveXcode()
}
},
onAcceptSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.acceptSuggestion(.codeCompletion)
NSWorkspace.activatePreviousActiveXcode()
}
},
onDismissSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.dismissSuggestion()
NSWorkspace.activatePreviousActiveXcode()
}
}
)
}
}
return nil
}
func nesSuggestionForFile(at url: URL) async -> NESCodeSuggestionProvider? {
for workspace in await Service.shared.workspacePool.workspaces.values {
if let filespace = workspace.filespaces[url],
let nesSuggestion = filespace.presentingNESSuggestion
{
let sourceSnapshot = await getSourceSnapshot(from: filespace)
return .init(
fileURL: url,
code: nesSuggestion.text,
sourceSnapshot: sourceSnapshot,
range: nesSuggestion.range,
language: filespace.language.rawValue,
onRejectSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.rejectNESSuggestions()
}
},
onAcceptNESSuggestionTapped: {
Task {
let handler = PseudoCommandHandler()
await handler.acceptSuggestion(.nes)
NSWorkspace.activatePreviousActiveXcode()
}
},
onDismissNESSuggestionTapped: {
// Refer to Code Completion suggestion, the `dismiss` action is not support
}
)
}
}
return nil
}
}
@WorkspaceActor
private func getSourceSnapshot(from filespace: Filespace) -> FilespaceSuggestionSnapshot {
return filespace.nesSuggestionSourceSnapshot
}