Skip to content

Commit 2ffa0f5

Browse files
committed
Fix that realtime suggestion is cancelling itself
1 parent 2815d9e commit 2ffa0f5

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

Core/Sources/Service/SuggestionCommandHandler/CommentBaseCommandHandler.swift

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import XPCShared
66
@ServiceActor
77
struct CommentBaseCommandHandler: SuggestionCommandHanlder {
88
nonisolated init() {}
9-
9+
1010
func presentSuggestions(editor: EditorContent) async throws -> UpdatedContent? {
1111
let fileURL = try await Environment.fetchCurrentFileURL()
12-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
12+
let (workspace, _) = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
1313
try await workspace.generateSuggestions(
1414
forFileAt: fileURL,
1515
content: editor.content,
@@ -33,7 +33,7 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
3333

3434
func presentNextSuggestion(editor: EditorContent) async throws -> UpdatedContent? {
3535
let fileURL = try await Environment.fetchCurrentFileURL()
36-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
36+
let (workspace, _) = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
3737
workspace.selectNextSuggestion(
3838
forFileAt: fileURL,
3939
content: editor.content,
@@ -53,7 +53,7 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
5353

5454
func presentPreviousSuggestion(editor: EditorContent) async throws -> UpdatedContent? {
5555
let fileURL = try await Environment.fetchCurrentFileURL()
56-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
56+
let (workspace, _) = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
5757
workspace.selectPreviousSuggestion(
5858
forFileAt: fileURL,
5959
content: editor.content,
@@ -73,7 +73,7 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
7373

7474
func rejectSuggestion(editor: EditorContent) async throws -> UpdatedContent? {
7575
let fileURL = try await Environment.fetchCurrentFileURL()
76-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
76+
let (workspace, _) = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
7777
workspace.rejectSuggestion(forFileAt: fileURL)
7878

7979
guard let filespace = workspace.filespaces[fileURL] else { return nil }
@@ -89,7 +89,7 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
8989

9090
func acceptSuggestion(editor: EditorContent) async throws -> UpdatedContent? {
9191
let fileURL = try await Environment.fetchCurrentFileURL()
92-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
92+
let (workspace, _) = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
9393

9494
guard let acceptedSuggestion = workspace.acceptSuggestion(forFileAt: fileURL)
9595
else { return nil }
@@ -110,7 +110,6 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
110110
extraInfo: &extraInfo
111111
)
112112

113-
let presenter = PresentInCommentSuggestionPresenter()
114113
return .init(
115114
content: String(lines.joined(separator: "")),
116115
newCursor: cursorPosition,
@@ -120,8 +119,8 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
120119

121120
func presentRealtimeSuggestions(editor: EditorContent) async throws -> UpdatedContent? {
122121
let fileURL = try await Environment.fetchCurrentFileURL()
123-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
124-
guard let filespace = workspace.filespaces[fileURL] else { return nil }
122+
let (workspace, filespace) = try await Workspace
123+
.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
125124

126125
try Task.checkCancellation()
127126

@@ -147,8 +146,8 @@ struct CommentBaseCommandHandler: SuggestionCommandHanlder {
147146
// We don't need to wait for this.
148147
Task { @ServiceActor in
149148
let fileURL = try await Environment.fetchCurrentFileURL()
150-
let workspace = try await Workspace.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
151-
guard let filespace = workspace.filespaces[fileURL] else { return }
149+
let (workspace, filespace) = try await Workspace
150+
.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
152151

153152
try Task.checkCancellation()
154153

Core/Sources/Service/Workspace.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,16 @@ final class Workspace {
7272
return false
7373
}
7474

75-
static func fetchOrCreateWorkspaceIfNeeded(fileURL: URL) async throws -> Workspace {
75+
static func fetchOrCreateWorkspaceIfNeeded(fileURL: URL) async throws -> (workspace: Workspace, filespace: Filespace) {
7676
let projectURL = try await Environment.fetchCurrentProjectRootURL(fileURL)
7777
let workspaceURL = projectURL ?? fileURL
7878
let workspace = workspaces[workspaceURL] ?? Workspace(projectRootURL: workspaceURL)
79+
let filespace = workspace.filespaces[fileURL] ?? .init(fileURL: fileURL)
80+
if workspace.filespaces[fileURL] == nil {
81+
workspace.filespaces[fileURL] = filespace
82+
}
7983
workspaces[workspaceURL] = workspace
80-
return workspace
84+
return (workspace, filespace)
8185
}
8286
}
8387

Core/Sources/Service/XPCService.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,24 +93,30 @@ public class XPCService: NSObject, XPCServiceProtocol {
9393
@discardableResult
9494
private func replyWithUpdatedContent(
9595
editorContent: Data,
96+
file: StaticString = #file,
97+
line: UInt = #line,
98+
cancelInFlightTasks: Bool = true,
9699
withReply reply: @escaping (Data?, Error?) -> Void,
97100
getUpdatedContent: @escaping @ServiceActor (
98101
SuggestionCommandHanlder,
99102
EditorContent
100103
) async throws -> UpdatedContent?
101104
) -> Task<Void, Never> {
102105
Task {
103-
await RealtimeSuggestionController.shared.cancelInFlightTasksAndIgnoreTriggerForAWhile()
106+
if cancelInFlightTasks {
107+
await RealtimeSuggestionController.shared
108+
.cancelInFlightTasksAndIgnoreTriggerForAWhile()
109+
}
104110
do {
105111
let editor = try JSONDecoder().decode(EditorContent.self, from: editorContent)
106-
let handler = await CommentBaseCommandHandler()
112+
let handler = CommentBaseCommandHandler()
107113
guard let updatedContent = try await getUpdatedContent(handler, editor) else {
108114
reply(nil, nil)
109115
return
110116
}
111117
reply(try JSONEncoder().encode(updatedContent), nil)
112118
} catch {
113-
os_log(.error, "%@", error.localizedDescription)
119+
os_log(.error, "%@", "\(file):\(line) \(error.localizedDescription)")
114120
reply(nil, NSError.from(error))
115121
}
116122
}
@@ -167,6 +173,7 @@ public class XPCService: NSObject, XPCServiceProtocol {
167173
) {
168174
let task = replyWithUpdatedContent(
169175
editorContent: editorContent,
176+
cancelInFlightTasks: false,
170177
withReply: reply
171178
) { handler, editor in
172179
try await handler.presentRealtimeSuggestions(editor: editor)
@@ -179,12 +186,9 @@ public class XPCService: NSObject, XPCServiceProtocol {
179186
editorContent: Data,
180187
withReply reply: @escaping () -> Void
181188
) {
182-
// prefetching never wait.
183-
reply()
184-
185189
let task = replyWithUpdatedContent(
186190
editorContent: editorContent,
187-
withReply: { _, _ in }
191+
withReply: { _, _ in reply() }
188192
) { handler, editor in
189193
try await handler.generateRealtimeSuggestions(editor: editor)
190194
}

0 commit comments

Comments
 (0)