Skip to content

Commit c30d18a

Browse files
committed
Merge branch 'feature/read-xcode-version-from-inspector' into hotfix/0.18.3
2 parents eb51ecc + d157fa6 commit c30d18a

7 files changed

Lines changed: 43 additions & 31 deletions

File tree

Core/Package.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ let package = Package(
107107
dependencies: [
108108
"ActiveApplicationMonitor",
109109
"AXExtension",
110-
"SuggestionService",
110+
.product(name: "Preferences", package: "Tool"),
111111
]
112112
),
113113

@@ -256,6 +256,7 @@ let package = Package(
256256
name: "XcodeInspector",
257257
dependencies: [
258258
"AXExtension",
259+
"SuggestionModel",
259260
"Environment",
260261
"AXNotificationStream",
261262
.product(name: "Logger", package: "Tool"),
@@ -289,6 +290,7 @@ let package = Package(
289290
"LanguageClient",
290291
"SuggestionModel",
291292
"KeychainAccess",
293+
"XcodeInspector",
292294
.product(name: "Preferences", package: "Tool"),
293295
.product(name: "Terminal", package: "Tool"),
294296
]

Core/Sources/CodeiumService/CodeiumService.swift

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import LanguageClient
33
import LanguageServerProtocol
44
import Logger
55
import SuggestionModel
6+
import XcodeInspector
67

78
public protocol CodeiumSuggestionServiceType {
89
func getCompletions(
@@ -54,9 +55,9 @@ public class CodeiumSuggestionService {
5455

5556
let authService = CodeiumAuthService()
5657

57-
var xcodeVersion = "14.0.0"
58+
var fallbackXcodeVersion = "14.0.0"
5859
var languageServerVersion = CodeiumInstallationManager.latestSupportedVersion
59-
60+
6061
private var ongoingTasks = Set<Task<[CodeSuggestion], Error>>()
6162

6263
init(designatedServer: CodeiumLSP) {
@@ -95,13 +96,6 @@ public class CodeiumSuggestionService {
9596
}
9697

9798
let metadata = try getMetadata()
98-
xcodeVersion = (try? await getXcodeVersion()) ?? xcodeVersion
99-
let versionNumberSegmentCount = xcodeVersion.split(separator: ".").count
100-
if versionNumberSegmentCount == 2 {
101-
xcodeVersion += ".0"
102-
} else if versionNumberSegmentCount == 1 {
103-
xcodeVersion += ".0.0"
104-
}
10599
let tempFolderURL = FileManager.default.temporaryDirectory
106100
let managerDirectoryURL = tempFolderURL
107101
.appendingPathComponent("com.intii.CopilotForXcode")
@@ -192,9 +186,16 @@ extension CodeiumSuggestionService {
192186
}
193187
throw E()
194188
}
189+
var ideVersion = XcodeInspector.shared.latestActiveXcode?.version ?? fallbackXcodeVersion
190+
let versionNumberSegmentCount = ideVersion.split(separator: ".").count
191+
if versionNumberSegmentCount == 2 {
192+
ideVersion += ".0"
193+
} else if versionNumberSegmentCount == 1 {
194+
ideVersion += ".0.0"
195+
}
195196
return Metadata(
196197
ide_name: "xcode",
197-
ide_version: xcodeVersion,
198+
ide_version: ideVersion,
198199
extension_version: languageServerVersion,
199200
api_key: key,
200201
session_id: CodeiumSuggestionService.sessionId,
@@ -231,11 +232,11 @@ extension CodeiumSuggestionService: CodeiumSuggestionServiceType {
231232
ongoingTasks.forEach { $0.cancel() }
232233
ongoingTasks.removeAll()
233234
await cancelRequest()
234-
235+
235236
requestCounter += 1
236237
let languageId = languageIdentifierFromFileURL(fileURL)
237238
let relativePath = getRelativePath(of: fileURL)
238-
239+
239240
let task = Task {
240241
let request = await CodeiumRequest.GetCompletion(requestBody: .init(
241242
metadata: try getMetadata(),
@@ -263,11 +264,11 @@ extension CodeiumSuggestionService: CodeiumSuggestionServiceType {
263264
)
264265
}
265266
))
266-
267+
267268
try Task.checkCancellation()
268269

269270
let result = try await (try await setupServerIfNeeded()).sendRequest(request)
270-
271+
271272
try Task.checkCancellation()
272273

273274
return result.completionItems?.filter { item in
@@ -294,7 +295,7 @@ extension CodeiumSuggestionService: CodeiumSuggestionServiceType {
294295
)
295296
} ?? []
296297
}
297-
298+
298299
ongoingTasks.insert(task)
299300

300301
return try await task.value

Core/Sources/Environment/Environment.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import ActiveApplicationMonitor
22
import AppKit
33
import AXExtension
44
import Foundation
5-
import GitHubCopilotService
65
import Logger
7-
import SuggestionService
6+
import Preferences
87

98
public struct NoAccessToAccessibilityAPIError: Error, LocalizedError {
109
public var errorDescription: String? {
@@ -134,13 +133,6 @@ public enum Environment {
134133
}
135134
}
136135

137-
public static var createSuggestionService: (
138-
_ projectRootURL: URL,
139-
_ onServiceLaunched: @escaping (SuggestionServiceType) -> Void
140-
) -> SuggestionServiceType = { projectRootURL, onServiceLaunched in
141-
SuggestionService(projectRootURL: projectRootURL, onServiceLaunched: onServiceLaunched)
142-
}
143-
144136
public static var triggerAction: (_ name: String) async throws -> Void = { name in
145137
guard let activeXcode = ActiveApplicationMonitor.activeXcode
146138
?? ActiveApplicationMonitor.latestXcode

Core/Sources/Service/Workspace.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ final class Workspace {
135135
}
136136

137137
if _suggestionService == nil {
138-
_suggestionService = Environment.createSuggestionService(projectRootURL) {
138+
_suggestionService = SuggestionService(projectRootURL: projectRootURL) {
139139
[weak self] _ in
140140
guard let self else { return }
141141
for (_, filespace) in filespaces {

Core/Sources/XcodeInspector/XcodeInspector.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,26 @@ public final class XcodeAppInstanceInspector: AppInstanceInspector {
167167
@Published public var documentURL: URL = .init(fileURLWithPath: "/")
168168
@Published public var projectURL: URL = .init(fileURLWithPath: "/")
169169
@Published public var workspaces = [WorkspaceIdentifier: WorkspaceInfo]()
170+
var _version: String?
171+
public var version: String? {
172+
if let _version { return _version }
173+
guard let plistPath = runningApplication.bundleURL?
174+
.appendingPathComponent("Contents")
175+
.appendingPathComponent("version.plist")
176+
.path
177+
else { return nil }
178+
guard let plistData = FileManager.default.contents(atPath: plistPath) else { return nil }
179+
var format = PropertyListSerialization.PropertyListFormat.xml
180+
guard let plistDict = try? PropertyListSerialization.propertyList(
181+
from: plistData,
182+
options: .mutableContainersAndLeaves,
183+
format: &format
184+
) as? [String: AnyObject] else { return nil }
185+
let result = plistDict["CFBundleShortVersionString"] as? String
186+
_version = result
187+
return result
188+
}
189+
170190
private var longRunningTasks = Set<Task<Void, Error>>()
171191
private var focusedWindowObservations = Set<AnyCancellable>()
172192

Core/Tests/ServiceTests/Environment.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,6 @@ import XPCShared
2222
URL(fileURLWithPath: "/path/to/project/file.swift")
2323
}
2424

25-
Environment.createSuggestionService = {
26-
_, _ in fatalError("")
27-
}
28-
2925
Environment.triggerAction = { _ in }
3026
}
3127

Tool/Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ let package = Package(
1515
],
1616
dependencies: [
1717
.package(url: "https://github.com/pvieito/PythonKit.git", branch: "master"),
18+
// TODO: Switch to Tiktoken. https://github.com/aespinilla/Tiktoken
1819
.package(url: "https://github.com/alfianlosari/GPTEncoder", from: "1.0.4"),
1920
.package(url: "https://github.com/apple/swift-async-algorithms", from: "0.1.0"),
2021
.package(url: "https://github.com/pointfreeco/swift-parsing", from: "0.12.1")
@@ -56,9 +57,9 @@ let package = Package(
5657
.target(
5758
name: "OpenAIService",
5859
dependencies: [
59-
"GPTEncoder",
6060
"Logger",
6161
"Preferences",
62+
.product(name: "GPTEncoder", package: "GPTEncoder"),
6263
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
6364
]
6465
),

0 commit comments

Comments
 (0)