Skip to content

Commit e61b0ac

Browse files
committed
Merge branch 'feature/suggestion-typed-dim' into develop
2 parents 028ed92 + ffaa183 commit e61b0ac

11 files changed

Lines changed: 621 additions & 271 deletions

File tree

Core/Sources/ChatGPTChatTab/CodeBlockHighlighter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ struct AsyncCodeBlockView: View {
4545
highlightTask = Task {
4646
let string = await withUnsafeContinuation { continuation in
4747
Self.queue.async {
48-
let content = highlightedCodeBlock(
48+
let content = CodeHighlighting.highlightedCodeBlock(
4949
code: content,
5050
language: language,
5151
scenario: "chat",
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import Combine
2+
import Foundation
3+
import Perception
4+
import SuggestionModel
5+
import XcodeInspector
6+
7+
@Perceptible
8+
final class CursorPositionTracker {
9+
@MainActor
10+
var cursorPosition: CursorPosition = .zero
11+
12+
@PerceptionIgnored var editorObservationTask: Set<AnyCancellable> = []
13+
@PerceptionIgnored var eventObservationTask: Task<Void, Never>?
14+
15+
init() {
16+
observeAppChange()
17+
}
18+
19+
deinit {
20+
eventObservationTask?.cancel()
21+
}
22+
23+
private func observeAppChange() {
24+
editorObservationTask = []
25+
Task {
26+
await XcodeInspector.shared.safe.$focusedEditor.sink { [weak self] editor in
27+
guard let editor, let self else { return }
28+
Task { @MainActor in
29+
self.observeAXNotifications(editor)
30+
}
31+
}.store(in: &editorObservationTask)
32+
}
33+
}
34+
35+
private func observeAXNotifications(_ editor: SourceEditor) {
36+
eventObservationTask?.cancel()
37+
let content = editor.getLatestEvaluatedContent()
38+
Task { @MainActor in
39+
self.cursorPosition = content.cursorPosition
40+
}
41+
eventObservationTask = Task { [weak self] in
42+
for await event in await editor.axNotifications.notifications() {
43+
guard let self else { return }
44+
guard event.kind == .evaluatedContentChanged else { continue }
45+
let content = editor.getLatestEvaluatedContent()
46+
Task { @MainActor in
47+
self.cursorPosition = content.cursorPosition
48+
}
49+
}
50+
}
51+
}
52+
}
53+

Core/Sources/SuggestionWidget/Providers/CodeSuggestionProvider.swift

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,34 @@
1+
import Combine
12
import Foundation
3+
import Perception
4+
import SharedUIComponents
25
import SwiftUI
6+
import XcodeInspector
37

4-
public final class CodeSuggestionProvider: ObservableObject, Equatable {
8+
@Perceptible
9+
public final class CodeSuggestionProvider: Equatable {
510
public static func == (lhs: CodeSuggestionProvider, rhs: CodeSuggestionProvider) -> Bool {
611
lhs.code == rhs.code && lhs.language == rhs.language
712
}
813

9-
@Published public var code: String = ""
10-
@Published public var language: String = ""
11-
@Published public var startLineIndex: Int = 0
12-
@Published public var suggestionCount: Int = 0
13-
@Published public var currentSuggestionIndex: Int = 0
14-
@Published public var commonPrecedingSpaceCount = 0
15-
@Published public var extraInformation: String = ""
14+
public var code: String = ""
15+
public var language: String = ""
16+
public var startLineIndex: Int = 0
17+
public var suggestionCount: Int = 0
18+
public var currentSuggestionIndex: Int = 0
19+
public var extraInformation: String = ""
1620

17-
public var onSelectPreviousSuggestionTapped: () -> Void
18-
public var onSelectNextSuggestionTapped: () -> Void
19-
public var onRejectSuggestionTapped: () -> Void
20-
public var onAcceptSuggestionTapped: () -> Void
21-
public var onDismissSuggestionTapped: () -> Void
21+
@PerceptionIgnored public var onSelectPreviousSuggestionTapped: () -> Void
22+
@PerceptionIgnored public var onSelectNextSuggestionTapped: () -> Void
23+
@PerceptionIgnored public var onRejectSuggestionTapped: () -> Void
24+
@PerceptionIgnored public var onAcceptSuggestionTapped: () -> Void
25+
@PerceptionIgnored public var onDismissSuggestionTapped: () -> Void
2226

2327
public init(
2428
code: String = "",
2529
language: String = "",
2630
startLineIndex: Int = 0,
31+
startCharacerIndex: Int = 0,
2732
suggestionCount: Int = 0,
2833
currentSuggestionIndex: Int = 0,
2934
onSelectPreviousSuggestionTapped: @escaping () -> Void = {},
@@ -49,5 +54,7 @@ public final class CodeSuggestionProvider: ObservableObject, Equatable {
4954
func rejectSuggestion() { onRejectSuggestionTapped() }
5055
func acceptSuggestion() { onAcceptSuggestionTapped() }
5156
func dismissSuggestion() { onDismissSuggestionTapped() }
57+
58+
5259
}
5360

0 commit comments

Comments
 (0)