Skip to content

Commit 6079c99

Browse files
committed
Render package dependencies with the SwiftPM 5.5 syntax
Modern SwiftPM implementations warn about the .package(url: "https://github.com/apple/swift-system.git", .branch("main")) syntax that's being rendered into the package manifest, because this syntax was replaced in SwiftPM 5.5 with something that uses argument labels: .package(url: "https://github.com/apple/swift-system.git", branch: "main") Since generating code with warnings is bad, and we've already stated that we won't edit packages for tools version < 5.5, switch to this new style. This does mean that we drop the (internal) dependency on ManifestSourceGeneration, which is producing the older format, because I don't have a strong sense of whether we can modernize that code. Instead, we have a new path that generates swift-syntax nodes directly for the types we generate.
1 parent d238d33 commit 6079c99

File tree

6 files changed

+115
-19
lines changed

6 files changed

+115
-19
lines changed

Sources/PackageModel/ManifestSourceGeneration.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public typealias ManifestCustomProductTypeSourceGenerator = (ProductDescription)
6262

6363

6464
/// Convenience initializers for package manifest structures.
65-
package extension SourceCodeFragment {
65+
fileprivate extension SourceCodeFragment {
6666

6767
/// Instantiates a SourceCodeFragment to represent an entire manifest.
6868
init(
@@ -633,7 +633,7 @@ public struct SourceCodeFragment {
633633
self.subnodes = subnodes
634634
}
635635

636-
package func generateSourceCode(indent: String = "") -> String {
636+
func generateSourceCode(indent: String = "") -> String {
637637
var string = literal
638638
if let subnodes {
639639
switch delimiters {

Sources/PackageModelSyntax/AddPackageDependency.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public struct AddPackageDependency {
4848
throw ManifestEditError.cannotFindPackage
4949
}
5050

51-
let dependencySyntax = dependency.asSyntax(manifestDirectory: manifestDirectory)
51+
let dependencySyntax = dependency.asSyntax()
5252

5353
// If there is already a "dependencies" argument, append to the array
5454
// literal in there.

Sources/PackageModelSyntax/ManifestSyntaxRepresentable.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ protocol ManifestSyntaxRepresentable {
3636
/// For example, a `PackageDependency` entity would map to syntax for
3737
/// something like
3838
/// .package(url: "https://github.com/apple/swift-syntax.git", from: "510.0.1")
39-
func asSyntax(manifestDirectory: AbsolutePath) -> PreferredSyntax
39+
func asSyntax() -> PreferredSyntax
4040
}

Sources/PackageModelSyntax/PackageDependency+Syntax.swift

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,80 @@ import Basics
1414
import PackageModel
1515
import SwiftSyntax
1616
import SwiftParser
17+
import struct TSCUtility.Version
1718

1819
extension PackageDependency: ManifestSyntaxRepresentable {
19-
func asSyntax(manifestDirectory: AbsolutePath) -> ExprSyntax {
20-
let fragment = SourceCodeFragment(from: self, pathAnchor: manifestDirectory)
21-
return "\(raw: fragment.generateSourceCode())"
20+
func asSyntax() -> ExprSyntax {
21+
switch self {
22+
case .fileSystem(let filesystem): filesystem.asSyntax()
23+
case .sourceControl(let sourceControl): sourceControl.asSyntax()
24+
case .registry(let registry): registry.asSyntax()
25+
}
26+
}
27+
}
28+
29+
extension PackageDependency.FileSystem: ManifestSyntaxRepresentable {
30+
func asSyntax() -> ExprSyntax {
31+
fatalError()
32+
}
33+
}
34+
35+
extension PackageDependency.SourceControl: ManifestSyntaxRepresentable {
36+
func asSyntax() -> ExprSyntax {
37+
// TODO: Not handling identity, nameForTargetDependencyResolutionOnly,
38+
// or productFilter yet.
39+
switch location {
40+
case .local(let path):
41+
".package(path: \(literal: path.description), \(requirement.asSyntax()))"
42+
case .remote(let url):
43+
".package(url: \(literal: url.description), \(requirement.asSyntax()))"
44+
}
45+
}
46+
}
47+
48+
extension PackageDependency.Registry: ManifestSyntaxRepresentable {
49+
func asSyntax() -> ExprSyntax {
50+
fatalError()
51+
}
52+
}
53+
54+
extension PackageDependency.SourceControl.Requirement: ManifestSyntaxRepresentable {
55+
func asSyntax() -> LabeledExprSyntax {
56+
switch self {
57+
case .exact(let version):
58+
LabeledExprSyntax(
59+
label: "exact",
60+
expression: version.asSyntax()
61+
)
62+
63+
case .range(let range) where range == .upToNextMajor(from: range.lowerBound):
64+
LabeledExprSyntax(
65+
label: "from",
66+
expression: range.lowerBound.asSyntax()
67+
)
68+
69+
case .range(let range):
70+
LabeledExprSyntax(
71+
expression: "\(range.lowerBound.asSyntax())..<\(range.upperBound.asSyntax())" as ExprSyntax
72+
)
73+
74+
case .revision(let revision):
75+
LabeledExprSyntax(
76+
label: "revision",
77+
expression: "\(literal: revision)" as ExprSyntax
78+
)
79+
80+
case .branch(let branch):
81+
LabeledExprSyntax(
82+
label: "branch",
83+
expression: "\(literal: branch)" as ExprSyntax
84+
)
85+
}
86+
}
87+
}
88+
89+
extension Version: ManifestSyntaxRepresentable {
90+
func asSyntax() -> ExprSyntax {
91+
return "\(literal: description)"
2292
}
2393
}

Tests/CommandsTests/PackageCommandTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -813,7 +813,7 @@ final class PackageCommandTests: CommandsTestCase {
813813
XCTAssertFileExists(manifest)
814814
let contents: String = try fs.readFileContents(manifest)
815815

816-
XCTAssertMatch(contents, .contains(#".package(url: "https://github.com/apple/swift-syntax.git", .branch("main")),"#))
816+
XCTAssertMatch(contents, .contains(#".package(url: "https://github.com/apple/swift-syntax.git", branch: "main"),"#))
817817
}
818818
}
819819

Tests/PackageModelSyntaxTests/ManifestEditTests.swift

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import SPMTestSupport
1616
@_spi(FixItApplier) import SwiftIDEUtils
1717
import SwiftParser
1818
import SwiftSyntax
19+
import struct TSCUtility.Version
1920
import XCTest
2021

2122
func assertManifestRefactor(
@@ -61,12 +62,17 @@ class ManifestEditTests: XCTestCase {
6162
name: "packages",
6263
dependencies: [
6364
.package(url: "https://github.com/apple/swift-syntax.git", from: "510.0.1"),
64-
.package(url: "https://github.com/apple/swift-system.git", .branch("main")),
65+
.package(url: "https://github.com/apple/swift-system.git", branch: "main"),
6566
]
6667
)
6768
""") { manifest in
6869
try AddPackageDependency.addPackageDependency(
69-
Self.swiftSystemPackageDependency,
70+
PackageDependency.remoteSourceControl(
71+
identity: PackageIdentity(url: Self.swiftSystemURL),
72+
nameForTargetDependencyResolutionOnly: nil,
73+
url: Self.swiftSystemURL,
74+
requirement: .branch("main"), productFilter: .nothing
75+
),
7076
to: manifest,
7177
manifestDirectory: try! AbsolutePath(validating: "/")
7278
)
@@ -88,12 +94,18 @@ class ManifestEditTests: XCTestCase {
8894
name: "packages",
8995
dependencies: [
9096
.package(url: "https://github.com/apple/swift-syntax.git", from: "510.0.1"),
91-
.package(url: "https://github.com/apple/swift-system.git", .branch("main")),
97+
.package(url: "https://github.com/apple/swift-system.git", exact: "510.0.0"),
9298
]
9399
)
94100
""") { manifest in
95101
try AddPackageDependency.addPackageDependency(
96-
Self.swiftSystemPackageDependency,
102+
PackageDependency.remoteSourceControl(
103+
identity: PackageIdentity(url: Self.swiftSystemURL),
104+
nameForTargetDependencyResolutionOnly: nil,
105+
url: Self.swiftSystemURL,
106+
requirement: .exact("510.0.0"),
107+
productFilter: .nothing
108+
),
97109
to: manifest,
98110
manifestDirectory: try! AbsolutePath(validating: "/")
99111
)
@@ -115,12 +127,20 @@ class ManifestEditTests: XCTestCase {
115127
name: "packages",
116128
dependencies: [
117129
.package(url: "https://github.com/apple/swift-syntax.git", from: "510.0.1"),
118-
.package(url: "https://github.com/apple/swift-system.git", .branch("main")),
130+
.package(url: "https://github.com/apple/swift-system.git", from: "510.0.0"),
119131
] + []
120132
)
121133
""") { manifest in
122-
try AddPackageDependency.addPackageDependency(
123-
Self.swiftSystemPackageDependency,
134+
let versionRange = Range<Version>.upToNextMajor(from: Version(510, 0, 0))
135+
136+
return try AddPackageDependency.addPackageDependency(
137+
PackageDependency.remoteSourceControl(
138+
identity: PackageIdentity(url: Self.swiftSystemURL),
139+
nameForTargetDependencyResolutionOnly: nil,
140+
url: Self.swiftSystemURL,
141+
requirement: .range(versionRange),
142+
productFilter: .nothing
143+
),
124144
to: manifest,
125145
manifestDirectory: try! AbsolutePath(validating: "/")
126146
)
@@ -140,12 +160,18 @@ class ManifestEditTests: XCTestCase {
140160
let package = Package(
141161
name: "packages",
142162
dependencies: [
143-
.package(url: "https://github.com/apple/swift-system.git", .branch("main")),
163+
.package(url: "https://github.com/apple/swift-system.git", "508.0.0"..<"510.0.0"),
144164
]
145165
)
146166
""") { manifest in
147167
try AddPackageDependency.addPackageDependency(
148-
Self.swiftSystemPackageDependency,
168+
PackageDependency.remoteSourceControl(
169+
identity: PackageIdentity(url: Self.swiftSystemURL),
170+
nameForTargetDependencyResolutionOnly: nil,
171+
url: Self.swiftSystemURL,
172+
requirement: .range(Version(508,0,0)..<Version(510,0,0)),
173+
productFilter: .nothing
174+
),
149175
to: manifest,
150176
manifestDirectory: try! AbsolutePath(validating: "/")
151177
)
@@ -164,7 +190,7 @@ class ManifestEditTests: XCTestCase {
164190
let package = Package(
165191
name: "packages",
166192
dependencies: [
167-
.package(url: "https://github.com/apple/swift-system.git", .branch("main")),
193+
.package(url: "https://github.com/apple/swift-system.git", branch: "main"),
168194
]
169195
)
170196
""") { manifest in
@@ -189,7 +215,7 @@ class ManifestEditTests: XCTestCase {
189215
let package = Package(
190216
name: "packages",
191217
dependencies: [
192-
.package(url: "https://github.com/apple/swift-system.git", .branch("main")),
218+
.package(url: "https://github.com/apple/swift-system.git", branch: "main"),
193219
],
194220
targets: []
195221
)

0 commit comments

Comments
 (0)