Skip to content

Commit fbf5644

Browse files
committed
Use XcodeInspector to get urls instead of Environment
1 parent 7393c89 commit fbf5644

File tree

5 files changed

+58
-57
lines changed

5 files changed

+58
-57
lines changed

Core/Sources/ChatPlugin/TerminalChatPlugin.swift

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import Environment
21
import Foundation
32
import OpenAIService
43
import Terminal
4+
import XcodeInspector
55

66
public actor TerminalChatPlugin: ChatPlugin {
77
public static var command: String { "run" }
@@ -34,13 +34,10 @@ public actor TerminalChatPlugin: ChatPlugin {
3434
}
3535

3636
do {
37-
let fileURL = try await Environment.fetchCurrentFileURL()
38-
let projectURL = try await {
39-
if let url = try await Environment.fetchCurrentProjectRootURLFromXcode() {
40-
return url
41-
}
42-
return try await Environment.guessProjectRootURLForFile(fileURL)
43-
}()
37+
38+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL,
39+
let projectURL = XcodeInspector.shared.realtimeActiveProjectURL
40+
else { return }
4441

4542
await chatGPTService.memory.mutateHistory { history in
4643
history.append(

Core/Sources/Service/RealtimeSuggestionController.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import AppKit
33
import AsyncAlgorithms
44
import AXExtension
55
import AXNotificationStream
6-
import Environment
76
import Foundation
87
import Logger
98
import Preferences
@@ -90,7 +89,7 @@ public actor RealtimeSuggestionController {
9089

9190
Task { // Notify suggestion service for open file.
9291
try await Task.sleep(nanoseconds: 500_000_000)
93-
let fileURL = try await Environment.fetchCurrentFileURL()
92+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
9493
_ = try await Service.shared.workspacePool
9594
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
9695
}
@@ -108,7 +107,7 @@ public actor RealtimeSuggestionController {
108107
)
109108

110109
editorObservationTask = Task { [weak self] in
111-
let fileURL = try await Environment.fetchCurrentFileURL()
110+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
112111
if let sourceEditor = await self?.sourceEditor {
113112
await PseudoCommandHandler().invalidateRealtimeSuggestionsIfNeeded(
114113
fileURL: fileURL,
@@ -141,7 +140,7 @@ public actor RealtimeSuggestionController {
141140

142141
Task { @WorkspaceActor in // Get cache ready for real-time suggestions.
143142
guard UserDefaults.shared.value(for: \.preCacheOnFileOpen) else { return }
144-
let fileURL = try await Environment.fetchCurrentFileURL()
143+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
145144
let (_, filespace) = try await Service.shared.workspacePool
146145
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
147146

@@ -171,7 +170,7 @@ public actor RealtimeSuggestionController {
171170
else { return }
172171

173172
if UserDefaults.shared.value(for: \.disableSuggestionFeatureGlobally),
174-
let fileURL = try? await Environment.fetchCurrentFileURL(),
173+
let fileURL = XcodeInspector.shared.activeDocumentURL,
175174
let (workspace, _) = try? await Service.shared.workspacePool
176175
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
177176
{
@@ -210,7 +209,7 @@ public actor RealtimeSuggestionController {
210209
}
211210

212211
func notifyEditingFileChange(editor: AXUIElement) async {
213-
guard let fileURL = try? await Environment.fetchCurrentFileURL(),
212+
guard let fileURL = XcodeInspector.shared.activeDocumentURL,
214213
let (workspace, _) = try? await Service.shared.workspacePool
215214
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
216215
else { return }

Core/Sources/Service/SuggestionCommandHandler/PseudoCommandHandler.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import ActiveApplicationMonitor
22
import AppKit
3-
import Environment
43
import Preferences
54
import SuggestionInjector
65
import SuggestionModel
@@ -324,14 +323,14 @@ extension PseudoCommandHandler {
324323
return (content, split, [range], range.start)
325324
}
326325

327-
func getFileURL() async -> URL? {
328-
try? await Environment.fetchCurrentFileURL()
326+
func getFileURL() -> URL? {
327+
XcodeInspector.shared.realtimeActiveDocumentURL
329328
}
330329

331330
@WorkspaceActor
332331
func getFilespace() async -> Filespace? {
333332
guard
334-
let fileURL = await getFileURL(),
333+
let fileURL = getFileURL(),
335334
let (_, filespace) = try? await Service.shared.workspacePool
336335
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
337336
else { return nil }

Core/Sources/Service/SuggestionCommandHandler/WindowBaseCommandHandler.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import AppKit
22
import ChatService
3-
import Environment
43
import Foundation
54
import GitHubCopilotService
65
import LanguageServerProtocol
@@ -12,6 +11,7 @@ import SuggestionWidget
1211
import UserNotifications
1312
import Workspace
1413
import WorkspaceSuggestionService
14+
import XcodeInspector
1515
import XPCShared
1616

1717
struct WindowBaseCommandHandler: SuggestionCommandHandler {
@@ -39,7 +39,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
3939
defer {
4040
presenter.markAsProcessing(false)
4141
}
42-
let fileURL = try await Environment.fetchCurrentFileURL()
42+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
4343
let (workspace, filespace) = try await Service.shared.workspacePool
4444
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
4545

@@ -82,7 +82,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
8282
private func _presentNextSuggestion(editor: EditorContent) async throws {
8383
presenter.markAsProcessing(true)
8484
defer { presenter.markAsProcessing(false) }
85-
let fileURL = try await Environment.fetchCurrentFileURL()
85+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
8686
let (workspace, filespace) = try await Service.shared.workspacePool
8787
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
8888
workspace.selectNextSuggestion(forFileAt: fileURL)
@@ -109,7 +109,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
109109
private func _presentPreviousSuggestion(editor: EditorContent) async throws {
110110
presenter.markAsProcessing(true)
111111
defer { presenter.markAsProcessing(false) }
112-
let fileURL = try await Environment.fetchCurrentFileURL()
112+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
113113
let (workspace, filespace) = try await Service.shared.workspacePool
114114
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
115115
workspace.selectPreviousSuggestion(forFileAt: fileURL)
@@ -136,7 +136,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
136136
private func _rejectSuggestion(editor: EditorContent) async throws {
137137
presenter.markAsProcessing(true)
138138
defer { presenter.markAsProcessing(false) }
139-
let fileURL = try await Environment.fetchCurrentFileURL()
139+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
140140

141141
let (workspace, _) = try await Service.shared.workspacePool
142142
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
@@ -149,7 +149,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
149149
presenter.markAsProcessing(true)
150150
defer { presenter.markAsProcessing(false) }
151151

152-
let fileURL = try await Environment.fetchCurrentFileURL()
152+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return nil }
153153
let (workspace, _) = try await Service.shared.workspacePool
154154
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
155155

@@ -185,7 +185,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
185185
presenter.markAsProcessing(true)
186186
defer { presenter.markAsProcessing(false) }
187187

188-
let fileURL = try await Environment.fetchCurrentFileURL()
188+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return nil }
189189

190190
let injector = SuggestionInjector()
191191
var lines = editor.lines
@@ -260,7 +260,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
260260

261261
@WorkspaceActor
262262
func prepareCache(editor: EditorContent) async throws -> UpdatedContent? {
263-
let fileURL = try await Environment.fetchCurrentFileURL()
263+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return nil }
264264
let (_, filespace) = try await Service.shared.workspacePool
265265
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
266266
filespace.codeMetadata.uti = editor.uti
@@ -365,7 +365,7 @@ extension WindowBaseCommandHandler {
365365
) async throws {
366366
presenter.markAsProcessing(true)
367367
defer { presenter.markAsProcessing(false) }
368-
let fileURL = try await Environment.fetchCurrentFileURL()
368+
guard let fileURL = XcodeInspector.shared.realtimeActiveDocumentURL else { return }
369369
let (workspace, filespace) = try await Service.shared.workspacePool
370370
.fetchOrCreateWorkspaceAndFilespace(fileURL: fileURL)
371371
guard workspace.suggestionPlugin?.isSuggestionFeatureEnabled ?? false else {
@@ -425,7 +425,7 @@ extension WindowBaseCommandHandler {
425425
usesTabsForIndentation: filespace.codeMetadata.usesTabsForIndentation ?? false,
426426
documentURL: fileURL,
427427
projectRootURL: workspace.projectRootURL,
428-
allCode: editor.content,
428+
allCode: editor.content,
429429
allLines: editor.lines,
430430
isContinuous: isContinuous,
431431
commandName: name,

Tool/Sources/Workspace/WorkspacePool.swift

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import Environment
2-
import Foundation
31
import Dependencies
2+
import Foundation
3+
import XcodeInspector
44

55
public struct WorkspacePoolDependencyKey: DependencyKey {
66
public static var liveValue: WorkspacePool = .init()
@@ -21,15 +21,15 @@ public extension DependencyValues {
2121
public class WorkspacePool {
2222
public enum Error: Swift.Error, LocalizedError {
2323
case invalidWorkspaceURL(URL)
24-
24+
2525
public var errorDescription: String? {
2626
switch self {
27-
case .invalidWorkspaceURL(let url):
27+
case let .invalidWorkspaceURL(url):
2828
return "Invalid workspace URL: \(url)"
2929
}
3030
}
3131
}
32-
32+
3333
public internal(set) var workspaces: [URL: Workspace] = [:]
3434
var plugins = [ObjectIdentifier: (Workspace) -> WorkspacePlugin]()
3535

@@ -59,7 +59,7 @@ public class WorkspacePool {
5959
removePlugin(id: id, from: workspace)
6060
}
6161
}
62-
62+
6363
public func fetchFilespaceIfExisted(fileURL: URL) -> Filespace? {
6464
for workspace in workspaces.values {
6565
if let filespace = workspace.filespaces[fileURL] {
@@ -68,13 +68,13 @@ public class WorkspacePool {
6868
}
6969
return nil
7070
}
71-
71+
7272
@WorkspaceActor
7373
public func fetchOrCreateWorkspace(workspaceURL: URL) async throws -> Workspace {
7474
guard workspaceURL != URL(fileURLWithPath: "/") else {
7575
throw Error.invalidWorkspaceURL(workspaceURL)
7676
}
77-
77+
7878
if let existed = workspaces[workspaceURL] {
7979
return existed
8080
}
@@ -93,9 +93,10 @@ public class WorkspacePool {
9393
throw Workspace.UnsupportedFileError(extensionName: fileURL.pathExtension)
9494
}
9595

96-
// If we know which project is opened.
97-
if let currentWorkspaceURL = try await Environment.fetchCurrentWorkspaceURLFromXcode() {
96+
// If we can get the workspace URL directly.
97+
if let currentWorkspaceURL = XcodeInspector.shared.realtimeActiveWorkspaceURL {
9898
if let existed = workspaces[currentWorkspaceURL] {
99+
// Reuse the existed workspace.
99100
let filespace = existed.createFilespaceIfNeeded(fileURL: fileURL)
100101
return (existed, filespace)
101102
}
@@ -116,30 +117,35 @@ public class WorkspacePool {
116117
}
117118
}
118119

119-
// If we can't find an existed one, we will try to guess it.
120+
// If we can't find the workspace URL, we will try to guess it.
120121
// Most of the time we won't enter this branch, just incase.
121122

122-
let workspaceURL = try await Environment.guessProjectRootURLForFile(fileURL)
123-
124-
let workspace = {
125-
if let existed = workspaces[workspaceURL] {
126-
return existed
127-
}
128-
// Reuse existed workspace if possible
129-
for (_, workspace) in workspaces {
130-
if fileURL.path.hasPrefix(workspace.projectRootURL.path) {
131-
return workspace
123+
if let workspaceURL = WorkspaceXcodeWindowInspector.extractProjectURL(
124+
workspaceURL: nil,
125+
documentURL: fileURL
126+
) {
127+
let workspace = {
128+
if let existed = workspaces[workspaceURL] {
129+
return existed
132130
}
133-
}
134-
return createNewWorkspace(workspaceURL: workspaceURL)
135-
}()
131+
// Reuse existed workspace if possible
132+
for (_, workspace) in workspaces {
133+
if fileURL.path.hasPrefix(workspace.projectRootURL.path) {
134+
return workspace
135+
}
136+
}
137+
return createNewWorkspace(workspaceURL: workspaceURL)
138+
}()
136139

137-
let filespace = workspace.createFilespaceIfNeeded(fileURL: fileURL)
138-
workspaces[workspaceURL] = workspace
139-
workspace.refreshUpdateTime()
140-
return (workspace, filespace)
140+
let filespace = workspace.createFilespaceIfNeeded(fileURL: fileURL)
141+
workspaces[workspaceURL] = workspace
142+
workspace.refreshUpdateTime()
143+
return (workspace, filespace)
144+
}
145+
146+
throw Workspace.CantFindWorkspaceError()
141147
}
142-
148+
143149
@WorkspaceActor
144150
public func removeWorkspace(url: URL) {
145151
workspaces[url] = nil

0 commit comments

Comments
 (0)