Skip to content

Commit 366e79b

Browse files
committed
Fix manifest source generation for enableUpcomingFeature/enableExperimentalFeature.
Manifest source generation was previously transforming: .enableUpcomingFeature("FeatureName") to: .upcomingFeatures(["FeatureName"]) because of how the build setting was stored internally. This commit fixes the issue by switching the internal model for these build settings to match the external model so they can be properly regenerated. This also matches how other build settings (like `linkedFramework`) are modeled internally. This addresses <rdar://problem/104718971>.
1 parent 5e5e2ca commit 366e79b

File tree

7 files changed

+32
-25
lines changed

7 files changed

+32
-25
lines changed

Sources/PackageDescription/BuildSettings.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ public struct SwiftSetting: Encodable {
319319
_ condition: BuildSettingCondition? = nil
320320
) -> SwiftSetting {
321321
return SwiftSetting(
322-
name: "upcomingFeatures", value: [name], condition: condition)
322+
name: "enableUpcomingFeature", value: [name], condition: condition)
323323
}
324324

325325
/// Enable an experimental feature with the given name.
@@ -343,7 +343,7 @@ public struct SwiftSetting: Encodable {
343343
_ condition: BuildSettingCondition? = nil
344344
) -> SwiftSetting {
345345
return SwiftSetting(
346-
name: "experimentalFeatures", value: [name], condition: condition)
346+
name: "enableExperimentalFeature", value: [name], condition: condition)
347347
}
348348
}
349349

Sources/PackageLoading/ManifestJSONParser.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,12 +425,18 @@ enum ManifestJSONParser {
425425
throw InternalError("invalid (empty) build settings value")
426426
}
427427
kind = .linkedFramework(value)
428+
case "enableUpcomingFeature":
429+
guard let value = values.first else {
430+
throw InternalError("invalid (empty) build settings value")
431+
}
432+
kind = .enableUpcomingFeature(value)
433+
case "enableExperimentalFeature":
434+
guard let value = values.first else {
435+
throw InternalError("invalid (empty) build settings value")
436+
}
437+
kind = .enableExperimentalFeature(value)
428438
case "unsafeFlags":
429439
kind = .unsafeFlags(values)
430-
case "upcomingFeatures":
431-
kind = .upcomingFeatures(values)
432-
case "experimentalFeatures":
433-
kind = .experimentalFeatures(values)
434440
default:
435441
throw InternalError("invalid build setting \(name)")
436442
}

Sources/PackageLoading/PackageBuilder.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ public final class PackageBuilder {
980980
decl = .OTHER_LDFLAGS
981981
}
982982

983-
case .upcomingFeatures(let _values):
983+
case .enableUpcomingFeature(let value):
984984
switch setting.tool {
985985
case .c, .cxx, .linker:
986986
throw InternalError("only Swift supports upcoming features")
@@ -989,9 +989,9 @@ public final class PackageBuilder {
989989
decl = .OTHER_SWIFT_FLAGS
990990
}
991991

992-
values = _values.precedeElements(with: "-enable-upcoming-feature")
992+
values = ["-enable-upcoming-feature", value]
993993

994-
case .experimentalFeatures(let _values):
994+
case .enableExperimentalFeature(let value):
995995
switch setting.tool {
996996
case .c, .cxx, .linker:
997997
throw InternalError(
@@ -1001,8 +1001,7 @@ public final class PackageBuilder {
10011001
decl = .OTHER_SWIFT_FLAGS
10021002
}
10031003

1004-
values = _values.precedeElements(
1005-
with: "-enable-experimental-feature")
1004+
values = ["-enable-experimental-feature", value]
10061005
}
10071006

10081007
// Create an assignment for this setting.

Sources/PackageModel/Manifest/TargetBuildSettingDescription.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,17 @@ public enum TargetBuildSettingDescription {
2828
case linkedLibrary(String)
2929
case linkedFramework(String)
3030

31+
case enableUpcomingFeature(String)
32+
case enableExperimentalFeature(String)
33+
3134
case unsafeFlags([String])
32-
case upcomingFeatures([String])
33-
case experimentalFeatures([String])
3435

3536
public var isUnsafeFlags: Bool {
3637
switch self {
3738
case .unsafeFlags(let flags):
3839
// If `.unsafeFlags` is used, but doesn't specify any flags, we treat it the same way as not specifying it.
3940
return !flags.isEmpty
40-
case .headerSearchPath, .define, .linkedLibrary, .linkedFramework, .upcomingFeatures, .experimentalFeatures:
41+
case .headerSearchPath, .define, .linkedLibrary, .linkedFramework, .enableUpcomingFeature, .enableExperimentalFeature:
4142
return false
4243
}
4344
}

Sources/PackageModel/ManifestSourceGeneration.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ fileprivate extension SourceCodeFragment {
470470
var params: [SourceCodeFragment] = []
471471

472472
switch setting.kind {
473-
case .headerSearchPath(let value), .linkedLibrary(let value), .linkedFramework(let value):
473+
case .headerSearchPath(let value), .linkedLibrary(let value), .linkedFramework(let value), .enableUpcomingFeature(let value), .enableExperimentalFeature(let value):
474474
params.append(SourceCodeFragment(string: value))
475475
if let condition = setting.condition {
476476
params.append(SourceCodeFragment(from: condition))
@@ -487,7 +487,7 @@ fileprivate extension SourceCodeFragment {
487487
params.append(SourceCodeFragment(from: condition))
488488
}
489489
self.init(enum: setting.kind.name, subnodes: params)
490-
case .unsafeFlags(let values), .upcomingFeatures(let values), .experimentalFeatures(let values):
490+
case .unsafeFlags(let values):
491491
params.append(SourceCodeFragment(strings: values))
492492
if let condition = setting.condition {
493493
params.append(SourceCodeFragment(from: condition))
@@ -639,10 +639,10 @@ extension TargetBuildSettingDescription.Kind {
639639
return "linkedFramework"
640640
case .unsafeFlags:
641641
return "unsafeFlags"
642-
case .upcomingFeatures:
643-
return "upcomingFeatures"
644-
case .experimentalFeatures:
645-
return "experimentalFeatures"
642+
case .enableUpcomingFeature:
643+
return "enableUpcomingFeature"
644+
case .enableExperimentalFeature:
645+
return "enableExperimentalFeature"
646646
}
647647
}
648648
}

Tests/BuildTests/BuildPlanTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3219,8 +3219,8 @@ final class BuildPlanTests: XCTestCase {
32193219
.init(tool: .swift, kind: .define("RLINUX"), condition: .init(platformNames: ["linux"], config: "release")),
32203220
.init(tool: .swift, kind: .define("DMACOS"), condition: .init(platformNames: ["macos"], config: "debug")),
32213221
.init(tool: .swift, kind: .unsafeFlags(["-Isfoo", "-L", "sbar"])),
3222-
.init(tool: .swift, kind: .upcomingFeatures(["BestFeature"])),
3223-
.init(tool: .swift, kind: .upcomingFeatures(["WorstFeature"]), condition: .init(platformNames: ["macos"], config: "debug"))
3222+
.init(tool: .swift, kind: .enableUpcomingFeature("BestFeature")),
3223+
.init(tool: .swift, kind: .enableUpcomingFeature("WorstFeature"), condition: .init(platformNames: ["macos"], config: "debug"))
32243224
]
32253225
),
32263226
try TargetDescription(

Tests/PackageGraphTests/PackageGraphTests.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2319,19 +2319,20 @@ class PackageGraphTests: XCTestCase {
23192319
TargetDescription(
23202320
name: "Bar",
23212321
settings: [
2322-
.init(tool: .swift, kind: .upcomingFeatures(["ConciseMagicFile"])),
2322+
.init(tool: .swift, kind: .enableUpcomingFeature("ConciseMagicFile")),
23232323
]
23242324
),
23252325
TargetDescription(
23262326
name: "Bar2",
23272327
settings: [
2328-
.init(tool: .swift, kind: .upcomingFeatures(["UnknownToTheseTools"])),
2328+
.init(tool: .swift, kind: .enableUpcomingFeature("UnknownToTheseTools")),
23292329
]
23302330
),
23312331
TargetDescription(
23322332
name: "Bar3",
23332333
settings: [
2334-
.init(tool: .swift, kind: .upcomingFeatures(["ExistentialAny", "UnknownToTheseTools"])),
2334+
.init(tool: .swift, kind: .enableUpcomingFeature("ExistentialAny")),
2335+
.init(tool: .swift, kind: .enableUpcomingFeature("UnknownToTheseTools")),
23352336
]
23362337
),
23372338
TargetDescription(

0 commit comments

Comments
 (0)