Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@ import XcodeGraph

public enum SystemFrameworkMetadataProviderError: LocalizedError, Equatable {
case unsupportedSDK(name: String)
case unsupportedSDKPlatform(sdk: String, platform: Platform, supported: [Platform])

public var errorDescription: String? {
switch self {
case let .unsupportedSDK(sdk):
let supportedTypes = SDKType.supportedTypesDescription
return "The SDK type of \(sdk) is not currently supported - only \(supportedTypes) are supported."
case let .unsupportedSDKPlatform(sdk, platform, supported):
let platforms = supported.map(\.caseValue).joined(separator: ", ")
return "The Platform type of \(platform.caseValue) is not currently supported for \(sdk) - only \(platforms) are supported."
}
}
}
Expand All @@ -38,7 +42,7 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi
sdkName: String,
status: LinkingStatus,
platform: Platform,
source: SDKSource
source sdkSource: SDKSource
) throws -> SystemFrameworkMetadata {
let sdkNamePath = try AbsolutePath(validating: "/\(sdkName)")
guard let sdkExtension = sdkNamePath.extension
Expand All @@ -58,6 +62,15 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi
throw SystemFrameworkMetadataProviderError.unsupportedSDK(name: sdkName)
}

var source = sdkSource
if sdkName == "XcodeKit.framework" {
source = .developer
if platform != .macOS {
throw SystemFrameworkMetadataProviderError
.unsupportedSDKPlatform(sdk: sdkName, platform: platform, supported: [.macOS])
}
}

let path = try sdkPath(name: sdkName, platform: platform, type: sdkType, source: source)
return SystemFrameworkMetadata(
name: sdkName,
Expand All @@ -70,7 +83,7 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi
private func sdkPath(name: String, platform: Platform, type: SDKType, source: SDKSource) throws -> AbsolutePath {
switch source {
case .developer:
let xcodeDeveloperSdkRootPath = platform.xcodeDeveloperSdkRootPath
let xcodeDeveloperSdkRootPath = name == "XcodeKit.framework" ? "Library" : platform.xcodeDeveloperSdkRootPath
let sdkRootPath = try AbsolutePath(validating: "/\(xcodeDeveloperSdkRootPath)")
return sdkRootPath
.appending(try RelativePath(validating: "Frameworks"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,21 @@ struct SystemFrameworkMetadataProviderTests {
}
}

@Test
func loadMetadataUnsupportedPlatform() throws {
// Given
let sdkName = "XcodeKit.framework"
let platform = Platform.iOS

// When / Then
#expect(
throws: SystemFrameworkMetadataProviderError
.unsupportedSDKPlatform(sdk: sdkName, platform: platform, supported: [.macOS])
) {
try subject.loadMetadata(sdkName: sdkName, status: .required, platform: platform, source: .system)
}
}

@Test
func loadMetadataDeveloperSourceSupportedPlatform() throws {
// Given
Expand All @@ -105,4 +120,26 @@ struct SystemFrameworkMetadataProviderTests {
"Metadata does not match expected value"
)
}

@Test
func loadMetadataXcodeKit() throws {
// Given
let sdkName = "XcodeKit.framework"
let platform = Platform.macOS
let source = SDKSource.system

// When
let metadata = try subject.loadMetadata(sdkName: sdkName, status: .required, platform: platform, source: source)

// Then
#expect(
metadata == SystemFrameworkMetadata(
name: sdkName,
path: "/Library/Frameworks/XcodeKit.framework",
status: .required,
source: .developer
),
"Metadata does not match expected value"
)
}
}