@@ -2,7 +2,6 @@ import ActiveApplicationMonitor
22import AppKit
33import AsyncAlgorithms
44import AXExtension
5- import Combine
65import Foundation
76import Logger
87import Preferences
@@ -11,15 +10,14 @@ import Workspace
1110import XcodeInspector
1211
1312public actor RealtimeSuggestionController {
14- private var cancellable : Set < AnyCancellable > = [ ]
13+ private var xcodeChangeObservationTask : Task < Void , Error > ?
1514 private var inflightPrefetchTask : Task < Void , Error > ?
1615 private var editorObservationTask : Task < Void , Error > ?
1716 private var sourceEditor : SourceEditor ?
1817
1918 init ( ) { }
2019
2120 deinit {
22- cancellable. forEach { $0. cancel ( ) }
2321 inflightPrefetchTask? . cancel ( )
2422 editorObservationTask? . cancel ( )
2523 }
@@ -30,16 +28,18 @@ public actor RealtimeSuggestionController {
3028 }
3129
3230 private func observeXcodeChange( ) {
33- cancellable . forEach { $0 . cancel ( ) }
31+ xcodeChangeObservationTask ? . cancel ( )
3432
35- XcodeInspector . shared. $focusedEditor
36- . sink { [ weak self] editor in
33+ xcodeChangeObservationTask = Task { [ weak self] in
34+ for await _ in NotificationCenter . default
35+ . notifications ( named: . focusedEditorDidChange)
36+ {
3737 guard let self else { return }
38- Task {
39- guard let editor else { return }
40- await self . handleFocusElementChange ( editor)
41- }
42- } . store ( in : & cancellable )
38+ try Task . checkCancellation ( )
39+ guard let editor = await XcodeInspector . shared . focusedEditor else { continue }
40+ await self . handleFocusElementChange ( editor)
41+ }
42+ }
4343 }
4444
4545 private func handleFocusElementChange( _ sourceEditor: SourceEditor ) {
@@ -51,7 +51,7 @@ public actor RealtimeSuggestionController {
5151 editorObservationTask = nil
5252
5353 editorObservationTask = Task { [ weak self] in
54- if let fileURL = await XcodeInspector . shared. safe . realtimeActiveDocumentURL {
54+ if let fileURL = XcodeInspector . shared. realtimeActiveDocumentURL {
5555 await PseudoCommandHandler ( ) . invalidateRealtimeSuggestionsIfNeeded (
5656 fileURL: fileURL,
5757 sourceEditor: sourceEditor
@@ -86,7 +86,7 @@ public actor RealtimeSuggestionController {
8686 }
8787 group. addTask {
8888 let handler = {
89- guard let fileURL = await XcodeInspector . shared. safe . activeDocumentURL
89+ guard let fileURL = await XcodeInspector . shared. activeDocumentURL
9090 else { return }
9191 await PseudoCommandHandler ( ) . invalidateRealtimeSuggestionsIfNeeded (
9292 fileURL: fileURL,
@@ -113,7 +113,7 @@ public actor RealtimeSuggestionController {
113113
114114 Task { @WorkspaceActor in // Get cache ready for real-time suggestions.
115115 guard UserDefaults . shared. value ( for: \. preCacheOnFileOpen) else { return }
116- guard let fileURL = await XcodeInspector . shared. safe . realtimeActiveDocumentURL
116+ guard let fileURL = XcodeInspector . shared. realtimeActiveDocumentURL
117117 else { return }
118118 let ( _, filespace) = try await Service . shared. workspacePool
119119 . fetchOrCreateWorkspaceAndFilespace ( fileURL: fileURL)
@@ -123,7 +123,7 @@ public actor RealtimeSuggestionController {
123123 // avoid the command get called twice
124124 filespace. codeMetadata. uti = " "
125125 do {
126- try await XcodeInspector . shared. safe . latestActiveXcode?
126+ try await XcodeInspector . shared. latestActiveXcode?
127127 . triggerCopilotCommand ( name: " Prepare for Real-time Suggestions " )
128128 } catch {
129129 if filespace. codeMetadata. uti? . isEmpty ?? true {
@@ -147,7 +147,7 @@ public actor RealtimeSuggestionController {
147147 else { return }
148148
149149 if UserDefaults . shared. value ( for: \. disableSuggestionFeatureGlobally) ,
150- let fileURL = await XcodeInspector . shared. safe . activeDocumentURL,
150+ let fileURL = await XcodeInspector . shared. activeDocumentURL,
151151 let ( workspace, _) = try ? await Service . shared. workspacePool
152152 . fetchOrCreateWorkspaceAndFilespace ( fileURL: fileURL)
153153 {
@@ -184,7 +184,7 @@ public actor RealtimeSuggestionController {
184184 }
185185
186186 func notifyEditingFileChange( editor: AXUIElement ) async {
187- guard let fileURL = await XcodeInspector . shared. safe . activeDocumentURL,
187+ guard let fileURL = await XcodeInspector . shared. activeDocumentURL,
188188 let ( workspace, _) = try ? await Service . shared. workspacePool
189189 . fetchOrCreateWorkspaceAndFilespace ( fileURL: fileURL)
190190 else { return }
0 commit comments