Skip to content

Commit e29dca3

Browse files
committed
Merge branch 'feature/performance-fix-for-realtime-suggestion' into develop
2 parents d1fc4d6 + bdc9c0b commit e29dca3

16 files changed

Lines changed: 160 additions & 102 deletions

File tree

Core/Sources/ChatService/CustomCommandTemplateProcessor.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public struct CustomCommandTemplateProcessor {
3939
}
4040

4141
func getEditorInformation() -> EditorInformation {
42-
let editorContent = XcodeInspector.shared.focusedEditor?.content
42+
let editorContent = XcodeInspector.shared.focusedEditor?.getContent()
4343
let documentURL = XcodeInspector.shared.activeDocumentURL
4444
let language = documentURL.map(languageIdentifierFromFileURL) ?? .plaintext
4545

Core/Sources/HostApp/FeatureSettings/SuggestionSettingsView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ struct SuggestionSettingsView: View {
218218
}
219219

220220
HStack {
221-
Slider(value: $settings.realtimeSuggestionDebounce, in: 0...2, step: 0.1) {
221+
Slider(value: $settings.realtimeSuggestionDebounce, in: 0.1...2, step: 0.1) {
222222
Text("Real-time Suggestion Debounce")
223223
}
224224

Core/Sources/Service/GUI/ChatTabFactory.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ enum ChatTabFactory {
4343
guard let editor = XcodeInspector.shared.focusedEditor else {
4444
return .init(selectedText: "", language: "", fileContent: "")
4545
}
46-
let content = editor.content
46+
let content = editor.getContent()
4747
return .init(
4848
selectedText: content.selectedContent,
4949
language: (

Core/Sources/Service/RealtimeSuggestionController.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,12 @@ public actor RealtimeSuggestionController {
110110
}
111111

112112
func triggerPrefetchDebounced(force: Bool = false) {
113-
inflightPrefetchTask = Task { @WorkspaceActor in
113+
inflightPrefetchTask = Task(priority: .utility) { @WorkspaceActor in
114114
try? await Task.sleep(nanoseconds: UInt64((
115-
UserDefaults.shared.value(for: \.realtimeSuggestionDebounce)
115+
max(UserDefaults.shared.value(for: \.realtimeSuggestionDebounce), 0.15)
116116
) * 1_000_000_000))
117+
118+
if Task.isCancelled { return }
117119

118120
guard UserDefaults.shared.value(for: \.realtimeSuggestionToggle)
119121
else { return }

Core/Sources/Service/SuggestionCommandHandler/PseudoCommandHandler.swift

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,32 @@ struct PseudoCommandHandler {
4242

4343
@WorkspaceActor
4444
func generateRealtimeSuggestions(sourceEditor: SourceEditor?) async {
45-
// Can't use handler if content is not available.
46-
guard
47-
let editor = await getEditorContent(sourceEditor: sourceEditor),
48-
let filespace = await getFilespace(),
45+
guard let filespace = await getFilespace(),
4946
let (workspace, _) = try? await Service.shared.workspacePool
5047
.fetchOrCreateWorkspaceAndFilespace(fileURL: filespace.fileURL) else { return }
48+
49+
if Task.isCancelled { return }
50+
51+
// Can't use handler if content is not available.
52+
guard let editor = await getEditorContent(sourceEditor: sourceEditor)
53+
else { return }
5154

5255
let fileURL = filespace.fileURL
5356
let presenter = PresentInWindowSuggestionPresenter()
5457

5558
presenter.markAsProcessing(true)
5659
defer { presenter.markAsProcessing(false) }
5760

58-
// Check if the current suggestion is still valid.
59-
if filespace.validateSuggestions(
60-
lines: editor.lines,
61-
cursorPosition: editor.cursorPosition
62-
) {
63-
return
64-
} else {
65-
presenter.discardSuggestion(fileURL: filespace.fileURL)
61+
if filespace.presentingSuggestion != nil {
62+
// Check if the current suggestion is still valid.
63+
if filespace.validateSuggestions(
64+
lines: editor.lines,
65+
cursorPosition: editor.cursorPosition
66+
) {
67+
return
68+
} else {
69+
presenter.discardSuggestion(fileURL: filespace.fileURL)
70+
}
6671
}
6772

6873
let snapshot = FilespaceSuggestionSnapshot(
@@ -78,9 +83,10 @@ struct PseudoCommandHandler {
7883
editor: editor
7984
)
8085
if let sourceEditor {
86+
let editorContent = sourceEditor.getContent()
8187
_ = filespace.validateSuggestions(
82-
lines: sourceEditor.content.lines,
83-
cursorPosition: sourceEditor.content.cursorPosition
88+
lines: editorContent.lines,
89+
cursorPosition: editorContent.cursorPosition
8490
)
8591
}
8692
if filespace.presentingSuggestion != nil {
@@ -98,9 +104,14 @@ struct PseudoCommandHandler {
98104
guard let (_, filespace) = try? await Service.shared.workspacePool
99105
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL) else { return }
100106

107+
if filespace.presentingSuggestion == nil {
108+
return // skip if there's no suggestion presented.
109+
}
110+
111+
let content = sourceEditor.getContent()
101112
if !filespace.validateSuggestions(
102-
lines: sourceEditor.content.lines,
103-
cursorPosition: sourceEditor.content.cursorPosition
113+
lines: content.lines,
114+
cursorPosition: content.cursorPosition
104115
) {
105116
PresentInWindowSuggestionPresenter().discardSuggestion(fileURL: fileURL)
106117
}
@@ -351,7 +362,8 @@ extension PseudoCommandHandler {
351362
guard let filespace = await getFilespace(),
352363
let sourceEditor = sourceEditor ?? XcodeInspector.shared.focusedEditor
353364
else { return nil }
354-
let content = sourceEditor.content
365+
if Task.isCancelled { return nil }
366+
let content = sourceEditor.getContent()
355367
let uti = filespace.codeMetadata.uti ?? ""
356368
let tabSize = filespace.codeMetadata.tabSize ?? 4
357369
let indentSize = filespace.codeMetadata.indentSize ?? 4

Core/Sources/Service/SuggestionCommandHandler/WindowBaseCommandHandler.swift

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
8080

8181
@WorkspaceActor
8282
private func _presentNextSuggestion(editor: EditorContent) async throws {
83-
presenter.markAsProcessing(true)
84-
defer { presenter.markAsProcessing(false) }
8583
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
8684
let (workspace, filespace) = try await Service.shared.workspacePool
8785
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
@@ -107,8 +105,6 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
107105

108106
@WorkspaceActor
109107
private func _presentPreviousSuggestion(editor: EditorContent) async throws {
110-
presenter.markAsProcessing(true)
111-
defer { presenter.markAsProcessing(false) }
112108
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
113109
let (workspace, filespace) = try await Service.shared.workspacePool
114110
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
@@ -134,8 +130,6 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
134130

135131
@WorkspaceActor
136132
private func _rejectSuggestion(editor: EditorContent) async throws {
137-
presenter.markAsProcessing(true)
138-
defer { presenter.markAsProcessing(false) }
139133
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
140134

141135
let (workspace, _) = try await Service.shared.workspacePool
@@ -146,9 +140,6 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
146140

147141
@WorkspaceActor
148142
func acceptSuggestion(editor: EditorContent) async throws -> UpdatedContent? {
149-
presenter.markAsProcessing(true)
150-
defer { presenter.markAsProcessing(false) }
151-
152143
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return nil }
153144
let (workspace, _) = try await Service.shared.workspacePool
154145
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
@@ -182,9 +173,6 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
182173
}
183174

184175
func acceptPromptToCode(editor: EditorContent) async throws -> UpdatedContent? {
185-
presenter.markAsProcessing(true)
186-
defer { presenter.markAsProcessing(false) }
187-
188176
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return nil }
189177

190178
let injector = SuggestionInjector()
@@ -363,8 +351,6 @@ extension WindowBaseCommandHandler {
363351
generateDescription: Bool?,
364352
name: String?
365353
) async throws {
366-
presenter.markAsProcessing(true)
367-
defer { presenter.markAsProcessing(false) }
368354
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
369355
let (workspace, filespace) = try await Service.shared.workspacePool
370356
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)

Core/Sources/SuggestionWidget/SuggestionWidgetController.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public final class SuggestionWidgetController: NSObject {
223223
dependency.windows.suggestionPanelWindow = suggestionPanelWindow
224224
dependency.windows.fullscreenDetector = fullscreenDetector
225225
dependency.windows.widgetWindow = widgetWindow
226-
226+
227227
store.send(.startup)
228228
}
229229
}
@@ -240,10 +240,12 @@ public extension SuggestionWidgetController {
240240
}
241241

242242
func markAsProcessing(_ isProcessing: Bool) {
243-
if isProcessing {
244-
store.send(.circularWidget(.markIsProcessing))
245-
} else {
246-
store.send(.circularWidget(.endIsProcessing))
243+
store.withState { state in
244+
if isProcessing, !state.circularWidgetState.isProcessing {
245+
store.send(.circularWidget(.markIsProcessing))
246+
} else if !isProcessing, state.circularWidgetState.isProcessing {
247+
store.send(.circularWidget(.endIsProcessing))
248+
}
247249
}
248250
}
249251

Pro

Submodule Pro updated from 58572b0 to 53c37b4

Tool/Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ let package = Package(
182182
dependencies: [
183183
"Highlightr",
184184
"Preferences",
185+
"SuggestionModel",
185186
.product(name: "STTextView", package: "STTextView"),
186187
]
187188
),

Tool/Sources/Preferences/Keys.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ public extension UserDefaultPreferenceKeys {
327327
}
328328

329329
var realtimeSuggestionDebounce: PreferenceKey<Double> {
330-
.init(defaultValue: 0, key: "RealtimeSuggestionDebounce")
330+
.init(defaultValue: 0.2, key: "RealtimeSuggestionDebounce")
331331
}
332332

333333
var acceptSuggestionWithTab: PreferenceKey<Bool> {

0 commit comments

Comments
 (0)