Skip to content

Commit fe882ff

Browse files
committed
Revert "fix: refactor autocomplete system for reliability and correct behavior"
This reverts commit 7a87d22.
1 parent 7a87d22 commit fe882ff

12 files changed

Lines changed: 26 additions & 104 deletions

File tree

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/CodeSuggestion/Model/CodeSuggestionDelegate.swift

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ public protocol CodeSuggestionDelegate: AnyObject {
1111

1212
func completionSuggestionsRequested(
1313
textView: TextViewController,
14-
cursorPosition: CursorPosition,
15-
isManualTrigger: Bool
14+
cursorPosition: CursorPosition
1615
) async -> (windowPosition: CursorPosition, items: [CodeSuggestionEntry])?
1716

1817
// This can't be async, we need it to be snappy. At most, it should just be filtering completion items
@@ -37,19 +36,4 @@ public extension CodeSuggestionDelegate {
3736
func completionTriggerCharacters() -> Set<String> { [] }
3837
func completionWindowDidClose() { }
3938
func completionWindowDidSelect(item: CodeSuggestionEntry) { }
40-
41-
func completionSuggestionsRequested(
42-
textView: TextViewController,
43-
cursorPosition: CursorPosition,
44-
isManualTrigger: Bool
45-
) async -> (windowPosition: CursorPosition, items: [CodeSuggestionEntry])? {
46-
await completionSuggestionsRequested(textView: textView, cursorPosition: cursorPosition)
47-
}
48-
49-
func completionSuggestionsRequested(
50-
textView: TextViewController,
51-
cursorPosition: CursorPosition
52-
) async -> (windowPosition: CursorPosition, items: [CodeSuggestionEntry])? {
53-
nil
54-
}
5539
}

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/CodeSuggestion/Model/SuggestionTriggerCharacterModel.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import AppKit
99
import CodeEditTextView
10-
import os
1110
import TextStory
1211

1312
/// Triggers the suggestion window when trigger characters are typed.
@@ -18,14 +17,11 @@ import TextStory
1817
/// essentially a textview delegate ensures both of those promises are upheld.
1918
@MainActor
2019
final class SuggestionTriggerCharacterModel {
21-
private static let logger = Logger(subsystem: "com.TablePro", category: "CompletionTrigger")
22-
2320
weak var controller: TextViewController?
2421
private var lastPosition: NSRange?
2522

2623
func textView(_ textView: TextView, didReplaceContentsIn range: NSRange, with string: String) {
2724
guard let controller, let completionDelegate = controller.completionDelegate else {
28-
Self.logger.debug("Typing trigger skipped: controller=\(self.controller == nil ? "nil" : "set"), completionDelegate=\(self.controller?.completionDelegate == nil ? "nil" : "set")")
2925
return
3026
}
3127

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/CodeSuggestion/Model/SuggestionViewModel.swift

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
//
77

88
import AppKit
9-
import os
109

1110
@MainActor
1211
final class SuggestionViewModel: ObservableObject {
13-
private static let logger = Logger(subsystem: "com.TablePro", category: "SuggestionVM")
1412
/// The items to be displayed in the window
1513
@Published var items: [CodeSuggestionEntry] = []
1614
@Published var selectedIndex: Int = 0
@@ -74,17 +72,13 @@ final class SuggestionViewModel: ObservableObject {
7472
textView: TextViewController,
7573
delegate: CodeSuggestionDelegate,
7674
cursorPosition: CursorPosition,
77-
isManualTrigger: Bool = false,
7875
showWindowOnParent: @escaping @MainActor (NSWindow, NSRect) -> Void
7976
) {
8077
self.activeTextView = nil
8178
self.delegate = nil
8279
itemsRequestTask?.cancel()
8380

84-
guard let targetParentWindow = textView.view.window else {
85-
Self.logger.warning("showCompletions: textView.view.window is nil")
86-
return
87-
}
81+
guard let targetParentWindow = textView.view.window else { return }
8882

8983
self.activeTextView = textView
9084
self.delegate = delegate
@@ -94,15 +88,11 @@ final class SuggestionViewModel: ObservableObject {
9488
do {
9589
guard let completionItems = await delegate.completionSuggestionsRequested(
9690
textView: textView,
97-
cursorPosition: cursorPosition,
98-
isManualTrigger: isManualTrigger
91+
cursorPosition: cursorPosition
9992
) else {
100-
Self.logger.debug("showCompletions: delegate returned nil items")
10193
return
10294
}
10395

104-
Self.logger.debug("showCompletions: got \(completionItems.items.count) items")
105-
10696
try Task.checkCancellation()
10797
try await MainActor.run {
10898
try Task.checkCancellation()
@@ -114,7 +104,6 @@ final class SuggestionViewModel: ObservableObject {
114104
let cursorRect = textView.view.window?.convertToScreen(
115105
textView.textView.convert(cursorRect, to: nil)
116106
) else {
117-
Self.logger.warning("showCompletions: cursor rect resolution failed")
118107
return
119108
}
120109

@@ -136,10 +125,7 @@ final class SuggestionViewModel: ObservableObject {
136125
position: CursorPosition,
137126
close: () -> Void
138127
) {
139-
if itemsRequestTask != nil {
140-
itemsRequestTask?.cancel()
141-
itemsRequestTask = nil
142-
}
128+
guard itemsRequestTask == nil else { return }
143129

144130
if activeTextView !== textView {
145131
close()

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/CodeSuggestion/Window/SuggestionController+Window.swift

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@
88
import AppKit
99
import SwiftUI
1010

11-
final class SuggestionPanel: NSPanel {
12-
override var canBecomeKey: Bool { false }
13-
override var canBecomeMain: Bool { false }
14-
}
15-
1611
extension SuggestionController {
1712
/// Will constrain the window's frame to be within the visible screen
1813
public func constrainWindowToScreenEdges(cursorRect: NSRect, font: NSFont) {
@@ -95,26 +90,25 @@ extension SuggestionController {
9590

9691
// MARK: - Private Methods
9792

98-
static func makeWindow() -> NSPanel {
99-
let panel = SuggestionPanel(
93+
static func makeWindow() -> NSWindow {
94+
let window = NSWindow(
10095
contentRect: .zero,
10196
styleMask: [.resizable, .fullSizeContentView, .nonactivatingPanel, .utilityWindow],
10297
backing: .buffered,
10398
defer: false
10499
)
105100

106-
panel.becomesKeyOnlyIfNeeded = true
107-
panel.titleVisibility = .hidden
108-
panel.titlebarAppearsTransparent = true
109-
panel.isExcludedFromWindowsMenu = true
110-
panel.isReleasedWhenClosed = false
111-
panel.level = .popUpMenu
112-
panel.hasShadow = true
113-
panel.isOpaque = false
114-
panel.tabbingMode = .disallowed
115-
panel.hidesOnDeactivate = true
116-
panel.backgroundColor = .clear
117-
118-
return panel
101+
window.titleVisibility = .hidden
102+
window.titlebarAppearsTransparent = true
103+
window.isExcludedFromWindowsMenu = true
104+
window.isReleasedWhenClosed = false
105+
window.level = .popUpMenu
106+
window.hasShadow = true
107+
window.isOpaque = false
108+
window.tabbingMode = .disallowed
109+
window.hidesOnDeactivate = true
110+
window.backgroundColor = .clear
111+
112+
return window
119113
}
120114
}

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/CodeSuggestion/Window/SuggestionController.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,12 @@ public final class SuggestionController: NSWindowController {
8989
textView: TextViewController,
9090
delegate: CodeSuggestionDelegate,
9191
cursorPosition: CursorPosition,
92-
isManualTrigger: Bool = false,
9392
asPopover: Bool = false
9493
) {
9594
model.showCompletions(
9695
textView: textView,
9796
delegate: delegate,
98-
cursorPosition: cursorPosition,
99-
isManualTrigger: isManualTrigger
97+
cursorPosition: cursorPosition
10098
) { parentWindow, cursorRect in
10199
self.model.updateTheme(from: textView)
102100

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/Controller/TextViewController+Lifecycle.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ extension TextViewController {
206206

207207
func handleEvent(event: NSEvent) -> NSEvent? {
208208
let modifierFlags = event.modifierFlags.intersection(.deviceIndependentFlagsMask)
209-
.subtracting([.capsLock, .function])
210209
switch event.type {
211210
case .keyDown:
212211
let tabKey: UInt16 = 0x30
@@ -310,8 +309,7 @@ extension TextViewController {
310309
SuggestionController.shared.showCompletions(
311310
textView: self,
312311
delegate: completionDelegate,
313-
cursorPosition: cursorPosition,
314-
isManualTrigger: true
312+
cursorPosition: cursorPosition
315313
)
316314
return nil
317315
}

LocalPackages/CodeEditSourceEditor/Sources/CodeEditSourceEditor/SourceEditor/SourceEditor.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ public struct SourceEditor: NSViewControllerRepresentable {
9090
var highlightProviders: [any HighlightProviding]?
9191
var undoManager: CEUndoManager?
9292
var coordinators: [any TextViewCoordinator]
93-
var completionDelegate: CodeSuggestionDelegate?
94-
var jumpToDefinitionDelegate: JumpToDefinitionDelegate?
93+
weak var completionDelegate: CodeSuggestionDelegate?
94+
weak var jumpToDefinitionDelegate: JumpToDefinitionDelegate?
9595

9696
public typealias NSViewControllerType = TextViewController
9797

TablePro/Core/Autocomplete/CompletionEngine.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,6 @@ final class CompletionEngine {
5151
provider.updateFavoriteKeywords(keywords)
5252
}
5353

54-
func retrySchemaIfNeeded() async {
55-
await provider.retrySchemaIfNeeded()
56-
}
57-
5854
/// Get completions for the given text and cursor position
5955
/// This is a pure function - no side effects
6056
func getCompletions(

TablePro/Core/Autocomplete/SQLCompletionProvider.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,6 @@ final class SQLCompletionProvider {
5959
self.favoriteKeywords = keywords
6060
}
6161

62-
func retrySchemaIfNeeded() async {
63-
await schemaProvider.retryLoadSchemaIfNeeded()
64-
}
65-
6662
// MARK: - Public API
6763

6864
/// Get completion suggestions for the current cursor position

TablePro/Core/Autocomplete/SQLSchemaProvider.swift

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ actor SQLSchemaProvider {
1818
private let maxCachedTables = 50
1919
private var isLoading = false
2020
private var lastLoadError: Error?
21-
private var lastRetryAttempt: Date?
22-
private let retryCooldown: TimeInterval = 30
2321

2422
// Store a weak driver reference to avoid retaining it after disconnect (MEM-9)
2523
private weak var cachedDriver: (any DatabaseDriver)?
@@ -85,15 +83,6 @@ actor SQLSchemaProvider {
8583
}
8684
}
8785

88-
func retryLoadSchemaIfNeeded() async {
89-
guard lastLoadError != nil, tables.isEmpty, !isLoading else { return }
90-
guard let driver = cachedDriver else { return }
91-
if let last = lastRetryAttempt, Date().timeIntervalSince(last) < retryCooldown { return }
92-
lastRetryAttempt = Date()
93-
lastLoadError = nil
94-
await loadSchema(using: driver, connection: connectionInfo)
95-
}
96-
9786
/// Check if schema is loaded
9887
func isSchemaLoaded() -> Bool {
9988
!tables.isEmpty

0 commit comments

Comments
 (0)