Skip to content

Commit f342e00

Browse files
committed
Fix Swift 5.9 warnings
1 parent 8076180 commit f342e00

File tree

6 files changed

+120
-87
lines changed

6 files changed

+120
-87
lines changed

Core/Sources/Service/RealtimeSuggestionController.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,18 @@ public actor RealtimeSuggestionController {
2525
nonisolated
2626
func start() {
2727
Task { [weak self] in
28-
if let app = ActiveApplicationMonitor.shared.activeXcode {
28+
if ActiveApplicationMonitor.shared.activeXcode != nil {
2929
await self?.handleXcodeChanged()
3030
}
31-
var previousApp = ActiveApplicationMonitor.shared.activeXcode
32-
for await app in ActiveApplicationMonitor.shared.createStream() {
31+
var previousApp = ActiveApplicationMonitor.shared.activeXcode?.info
32+
for await app in ActiveApplicationMonitor.shared.createInfoStream() {
3333
guard let self else { return }
3434
try Task.checkCancellation()
3535
defer { previousApp = app }
3636

37-
if let app = ActiveApplicationMonitor.shared.activeXcode, app != previousApp {
37+
if let app = ActiveApplicationMonitor.shared.activeXcode,
38+
app.processIdentifier != previousApp?.processIdentifier
39+
{
3840
await self.handleXcodeChanged()
3941
}
4042
}

Core/Sources/Service/ScheduledCleaner.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,15 @@ public final class ScheduledCleaner {
1919
}
2020

2121
func start() {
22-
// occasionally cleanup workspaces.
2322
Task { @ServiceActor in
2423
while !Task.isCancelled {
2524
try await Task.sleep(nanoseconds: 10 * 60 * 1_000_000_000)
2625
await cleanUp()
2726
}
2827
}
2928

30-
// cleanup when Xcode becomes inactive
3129
Task { @ServiceActor in
32-
for await app in ActiveApplicationMonitor.shared.createStream() {
30+
for await app in ActiveApplicationMonitor.shared.createInfoStream() {
3331
try Task.checkCancellation()
3432
if let app, !app.isXcode {
3533
await cleanUp()

Core/Sources/SuggestionWidget/FeatureReducers/WidgetFeature.swift

Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public struct WidgetFeature: ReducerProtocol {
7979
)
8080
}
8181
}
82-
82+
8383
var lastUpdateWindowOpacityTime = Date(timeIntervalSince1970: 0)
8484

8585
public init() {}
@@ -213,10 +213,10 @@ public struct WidgetFeature: ReducerProtocol {
213213

214214
case .observeActiveApplicationChange:
215215
return .run { send in
216-
var previousApp: NSRunningApplication?
217-
for await app in activeApplicationMonitor.createStream() {
216+
var previousApp: RunningApplicationInfo?
217+
for await app in activeApplicationMonitor.createInfoStream() {
218218
try Task.checkCancellation()
219-
if app != previousApp {
219+
if app?.processIdentifier != previousApp?.processIdentifier {
220220
await send(.updateActiveApplication)
221221
}
222222
previousApp = app
@@ -311,26 +311,26 @@ public struct WidgetFeature: ReducerProtocol {
311311
case .observeWindowChange:
312312
guard let app = activeApplicationMonitor.activeApplication else { return .none }
313313
guard app.isXcode else { return .none }
314-
314+
315315
let documentURL = state.focusingDocumentURL
316316

317-
return .run { [app] send in
318-
await send(.observeEditorChange)
317+
let notifications = AXNotificationStream(
318+
app: app,
319+
notificationNames:
320+
kAXApplicationActivatedNotification,
321+
kAXMovedNotification,
322+
kAXResizedNotification,
323+
kAXMainWindowChangedNotification,
324+
kAXFocusedWindowChangedNotification,
325+
kAXFocusedUIElementChangedNotification,
326+
kAXWindowMovedNotification,
327+
kAXWindowResizedNotification,
328+
kAXWindowMiniaturizedNotification,
329+
kAXWindowDeminiaturizedNotification
330+
)
319331

320-
let notifications = AXNotificationStream(
321-
app: app,
322-
notificationNames:
323-
kAXApplicationActivatedNotification,
324-
kAXMovedNotification,
325-
kAXResizedNotification,
326-
kAXMainWindowChangedNotification,
327-
kAXFocusedWindowChangedNotification,
328-
kAXFocusedUIElementChangedNotification,
329-
kAXWindowMovedNotification,
330-
kAXWindowResizedNotification,
331-
kAXWindowMiniaturizedNotification,
332-
kAXWindowDeminiaturizedNotification
333-
)
332+
return .run { send in
333+
await send(.observeEditorChange)
334334

335335
for await notification in notifications {
336336
try Task.checkCancellation()
@@ -369,45 +369,46 @@ public struct WidgetFeature: ReducerProtocol {
369369

370370
case .observeEditorChange:
371371
guard let app = activeApplicationMonitor.activeApplication else { return .none }
372-
return .run { send in
373-
let appElement = AXUIElementCreateApplication(app.processIdentifier)
374-
if let focusedElement = appElement.focusedElement,
375-
focusedElement.description == "Source Editor",
376-
let scrollView = focusedElement.parent,
377-
let scrollBar = scrollView.verticalScrollBar
378-
{
379-
let selectionRangeChange = AXNotificationStream(
380-
app: app,
381-
element: focusedElement,
382-
notificationNames: kAXSelectedTextChangedNotification
383-
)
384-
let scroll = AXNotificationStream(
385-
app: app,
386-
element: scrollBar,
387-
notificationNames: kAXValueChangedNotification
388-
)
372+
let appElement = AXUIElementCreateApplication(app.processIdentifier)
373+
guard let focusedElement = appElement.focusedElement,
374+
focusedElement.description == "Source Editor",
375+
let scrollView = focusedElement.parent,
376+
let scrollBar = scrollView.verticalScrollBar
377+
else { return .none }
378+
379+
let selectionRangeChange = AXNotificationStream(
380+
app: app,
381+
element: focusedElement,
382+
notificationNames: kAXSelectedTextChangedNotification
383+
)
384+
let scroll = AXNotificationStream(
385+
app: app,
386+
element: scrollBar,
387+
notificationNames: kAXValueChangedNotification
388+
)
389389

390-
if #available(macOS 13.0, *) {
391-
for await _ in merge(
392-
selectionRangeChange.debounce(for: Duration.milliseconds(500)),
393-
scroll
394-
) {
395-
guard activeApplicationMonitor.latestXcode != nil
396-
else { return }
397-
try Task.checkCancellation()
398-
await send(.updateWindowLocation(animated: false))
399-
await send(.updateWindowOpacity)
400-
}
401-
} else {
402-
for await _ in merge(selectionRangeChange, scroll) {
403-
guard activeApplicationMonitor.latestXcode != nil
404-
else { return }
405-
try Task.checkCancellation()
406-
await send(.updateWindowLocation(animated: false))
407-
await send(.updateWindowOpacity)
408-
}
390+
return .run { send in
391+
if #available(macOS 13.0, *) {
392+
for await _ in merge(
393+
selectionRangeChange.debounce(for: Duration.milliseconds(500)),
394+
scroll
395+
) {
396+
guard activeApplicationMonitor.latestXcode != nil
397+
else { return }
398+
try Task.checkCancellation()
399+
await send(.updateWindowLocation(animated: false))
400+
await send(.updateWindowOpacity)
401+
}
402+
} else {
403+
for await _ in merge(selectionRangeChange, scroll) {
404+
guard activeApplicationMonitor.latestXcode != nil
405+
else { return }
406+
try Task.checkCancellation()
407+
await send(.updateWindowLocation(animated: false))
408+
await send(.updateWindowOpacity)
409409
}
410410
}
411+
411412
}.cancellable(id: CancelID.observeEditorChange, cancelInFlight: true)
412413

413414
case .updateActiveApplication:
@@ -447,7 +448,7 @@ public struct WidgetFeature: ReducerProtocol {
447448
state.panelState.suggestionPanelState.colorScheme = scheme
448449
state.chatPanelState.colorScheme = scheme
449450
return .none
450-
451+
451452
case .updateFocusingDocumentURL:
452453
state.focusingDocumentURL = xcodeInspector.realtimeActiveDocumentURL
453454
return .none
@@ -574,7 +575,7 @@ public struct WidgetFeature: ReducerProtocol {
574575
await send(.updateWindowOpacityFinished)
575576
}
576577
.cancellable(id: DebounceKey.updateWindowOpacity, cancelInFlight: true)
577-
578+
578579
case .updateWindowOpacityFinished:
579580
state.lastUpdateWindowOpacityTime = Date()
580581
return .none

Pro

Submodule Pro updated from 326ddb7 to aeeba0a

Tool/Sources/AXNotificationStream/AXNotificationStream.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,14 @@ public final class AXNotificationStream: AsyncSequence {
8686
guard let self else { return }
8787
retry += 1
8888
for name in notificationNames {
89-
let e = AXObserverAddNotification(
90-
observer,
91-
observingElement,
92-
name as CFString,
93-
&self.continuation
94-
)
89+
let e = withUnsafeMutablePointer(to: &self.continuation) { pointer in
90+
AXObserverAddNotification(
91+
observer,
92+
observingElement,
93+
name as CFString,
94+
pointer
95+
)
96+
}
9597
switch e {
9698
case .success:
9799
pendingRegistrationNames.remove(name)

Tool/Sources/ActiveApplicationMonitor/ActiveApplicationMonitor.swift

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,35 @@
11
import AppKit
22

3+
public struct RunningApplicationInfo: Sendable {
4+
public let isXcode: Bool
5+
public let isActive: Bool
6+
public let isHidden: Bool
7+
public let localizedName: String?
8+
public let bundleIdentifier: String?
9+
public let bundleURL: URL?
10+
public let executableURL: URL?
11+
public let processIdentifier: pid_t
12+
public let launchDate: Date?
13+
public let executableArchitecture: Int
14+
15+
init(_ application: NSRunningApplication) {
16+
isXcode = application.isXcode
17+
isActive = application.isActive
18+
isHidden = application.isHidden
19+
localizedName = application.localizedName
20+
bundleIdentifier = application.bundleIdentifier
21+
bundleURL = application.bundleURL
22+
executableURL = application.executableURL
23+
processIdentifier = application.processIdentifier
24+
launchDate = application.launchDate
25+
executableArchitecture = application.executableArchitecture
26+
}
27+
}
28+
29+
public extension NSRunningApplication {
30+
var info: RunningApplicationInfo { RunningApplicationInfo(self) }
31+
}
32+
333
public final class ActiveApplicationMonitor {
434
public static let shared = ActiveApplicationMonitor()
535
public private(set) var latestXcode: NSRunningApplication? = NSWorkspace.shared
@@ -17,11 +47,11 @@ public final class ActiveApplicationMonitor {
1747
}
1848
}
1949

20-
private var continuations: [UUID: AsyncStream<NSRunningApplication?>.Continuation] = [:]
50+
private var infoContinuations: [UUID: AsyncStream<RunningApplicationInfo?>.Continuation] = [:]
2151

2252
private init() {
2353
activeApplication = NSWorkspace.shared.runningApplications.first(where: \.isActive)
24-
54+
2555
Task {
2656
let sequence = NSWorkspace.shared.notificationCenter
2757
.notifications(named: NSWorkspace.didActivateApplicationNotification)
@@ -36,7 +66,7 @@ public final class ActiveApplicationMonitor {
3666
}
3767

3868
deinit {
39-
for continuation in continuations {
69+
for continuation in infoContinuations {
4070
continuation.value.finish()
4171
}
4272
}
@@ -48,33 +78,33 @@ public final class ActiveApplicationMonitor {
4878
return nil
4979
}
5080

51-
public func createStream() -> AsyncStream<NSRunningApplication?> {
81+
public func createInfoStream() -> AsyncStream<RunningApplicationInfo?> {
5282
.init { continuation in
5383
let id = UUID()
5484
Task { @MainActor in
5585
continuation.onTermination = { _ in
56-
self.removeContinuation(id: id)
86+
self.removeInfoContinuation(id: id)
5787
}
58-
addContinuation(continuation, id: id)
59-
continuation.yield(activeApplication)
88+
addInfoContinuation(continuation, id: id)
89+
continuation.yield(activeApplication?.info)
6090
}
6191
}
6292
}
6393

64-
func addContinuation(
65-
_ continuation: AsyncStream<NSRunningApplication?>.Continuation,
94+
func addInfoContinuation(
95+
_ continuation: AsyncStream<RunningApplicationInfo?>.Continuation,
6696
id: UUID
6797
) {
68-
continuations[id] = continuation
98+
infoContinuations[id] = continuation
6999
}
70100

71-
func removeContinuation(id: UUID) {
72-
continuations[id] = nil
101+
func removeInfoContinuation(id: UUID) {
102+
infoContinuations[id] = nil
73103
}
74104

75105
private func notifyContinuations() {
76-
for continuation in continuations {
77-
continuation.value.yield(activeApplication)
106+
for continuation in infoContinuations {
107+
continuation.value.yield(activeApplication?.info)
78108
}
79109
}
80110
}

0 commit comments

Comments
 (0)