@@ -43,21 +43,52 @@ struct PseudoCommandHandler {
4343 // Can't use handler if content is not available.
4444 guard
4545 let editor = await getEditorContent ( sourceEditor: sourceEditor) ,
46- let filespace = await getFilespace ( )
47- else { return }
46+ let filespace = await getFilespace ( ) ,
47+ let ( workspace, _) = try ? await Workspace
48+ . fetchOrCreateWorkspaceIfNeeded ( fileURL: filespace. fileURL) else { return }
4849
50+ let fileURL = filespace. fileURL
51+ let presenter = PresentInWindowSuggestionPresenter ( )
52+
53+ presenter. markAsProcessing ( true )
54+ defer { presenter. markAsProcessing ( false ) }
55+
56+ // Check if the current suggestion is still valid.
4957 if await filespace. validateSuggestions (
5058 lines: editor. lines,
5159 cursorPosition: editor. cursorPosition
5260 ) {
5361 return
5462 } else {
55- PresentInWindowSuggestionPresenter ( ) . discardSuggestion ( fileURL: filespace. fileURL)
63+ presenter . discardSuggestion ( fileURL: filespace. fileURL)
5664 }
65+
66+ let snapshot = Filespace . Snapshot (
67+ linesHash: editor. lines. hashValue,
68+ cursorPosition: editor. cursorPosition
69+ )
70+
71+ guard await filespace. suggestionSourceSnapshot != snapshot else { return }
5772
58- // Otherwise, get it from pseudo handler directly.
59- let handler = WindowBaseCommandHandler ( )
60- _ = try ? await handler. generateRealtimeSuggestions ( editor: editor)
73+ do {
74+ try await workspace. generateSuggestions (
75+ forFileAt: fileURL,
76+ editor: editor
77+ )
78+ if let sourceEditor {
79+ _ = await filespace. validateSuggestions (
80+ lines: sourceEditor. content. lines,
81+ cursorPosition: sourceEditor. content. cursorPosition
82+ )
83+ }
84+ if await filespace. presentingSuggestion != nil {
85+ presenter. presentSuggestion ( fileURL: fileURL)
86+ } else {
87+ presenter. discardSuggestion ( fileURL: fileURL)
88+ }
89+ } catch {
90+ return
91+ }
6192 }
6293
6394 func invalidateRealtimeSuggestionsIfNeeded( fileURL: URL , sourceEditor: SourceEditor ) async {
0 commit comments