Skip to content

Commit 3591053

Browse files
committed
[PackageEditor] Consolidate code used to find ArrayExprs passed as specific labeled args
1 parent c324dfe commit 3591053

File tree

1 file changed

+21
-31
lines changed

1 file changed

+21
-31
lines changed

Sources/SPMPackageEditor/ManifestRewriter.swift

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,20 @@ public final class ManifestRewriter {
5454
}
5555

5656
// Find dependencies section in the argument list of Package(...).
57-
let packageDependenciesFinder = DependenciesArrayFinder()
57+
let packageDependenciesFinder = ArrayExprArgumentFinder(expectedLabel: "dependencies")
5858
packageDependenciesFinder.walk(initFnExpr.argumentList)
5959

6060
let packageDependencies: ArrayExprSyntax
61-
if let existingPackageDependencies = packageDependenciesFinder.dependenciesArrayExpr {
61+
if let existingPackageDependencies = packageDependenciesFinder.foundArrayExpr {
6262
packageDependencies = existingPackageDependencies
6363
} else {
6464
// We didn't find a dependencies section so insert one.
6565
let argListWithDependencies = DependenciesArrayWriter().visit(initFnExpr.argumentList)
6666

6767
// Find the inserted section.
68-
let packageDependenciesFinder = DependenciesArrayFinder()
68+
let packageDependenciesFinder = ArrayExprArgumentFinder(expectedLabel: "dependencies")
6969
packageDependenciesFinder.walk(argListWithDependencies)
70-
packageDependencies = packageDependenciesFinder.dependenciesArrayExpr!
70+
packageDependencies = packageDependenciesFinder.foundArrayExpr!
7171
}
7272

7373
// Add the the package dependency entry.
@@ -93,9 +93,9 @@ public final class ManifestRewriter {
9393
}
9494

9595
// Find the `targets: []` array.
96-
let targetsArrayFinder = TargetsArrayFinder()
96+
let targetsArrayFinder = ArrayExprArgumentFinder(expectedLabel: "targets")
9797
targetsArrayFinder.walk(initFnExpr.argumentList)
98-
guard let targetsArrayExpr = targetsArrayFinder.targets else {
98+
guard let targetsArrayExpr = targetsArrayFinder.foundArrayExpr else {
9999
throw Error.error("Couldn't find targets label")
100100
}
101101

@@ -106,10 +106,10 @@ public final class ManifestRewriter {
106106
throw Error.error("Couldn't find target \(target)")
107107
}
108108

109-
let targetDependencyFinder = DependenciesArrayFinder()
109+
let targetDependencyFinder = ArrayExprArgumentFinder(expectedLabel: "dependencies")
110110
targetDependencyFinder.walk(targetNode)
111111

112-
guard let targetDependencies = targetDependencyFinder.dependenciesArrayExpr else {
112+
guard let targetDependencies = targetDependencyFinder.foundArrayExpr else {
113113
throw Error.error("Couldn't find dependencies section")
114114
}
115115

@@ -134,10 +134,10 @@ public final class ManifestRewriter {
134134
throw Error.error("Couldn't find Package initializer")
135135
}
136136

137-
let targetsFinder = TargetsArrayFinder()
137+
let targetsFinder = ArrayExprArgumentFinder(expectedLabel: "targets")
138138
targetsFinder.walk(initFnExpr.argumentList)
139139

140-
guard let targetsNode = targetsFinder.targets else {
140+
guard let targetsNode = targetsFinder.foundArrayExpr else {
141141
throw Error.error("Couldn't find targets section")
142142
}
143143

@@ -169,20 +169,26 @@ final class PackageInitFinder: SyntaxVisitor {
169169
}
170170

171171
/// Finder for "dependencies" array syntax.
172-
final class DependenciesArrayFinder: SyntaxVisitor {
172+
final class ArrayExprArgumentFinder: SyntaxVisitor {
173173

174-
private(set) var dependenciesArrayExpr: ArrayExprSyntax?
174+
private(set) var foundArrayExpr: ArrayExprSyntax?
175+
private let expectedLabel: String
176+
177+
init(expectedLabel: String) {
178+
self.expectedLabel = expectedLabel
179+
super.init()
180+
}
175181

176182
override func visit(_ node: TupleExprElementSyntax) -> SyntaxVisitorContinueKind {
177-
guard node.label?.text == "dependencies" else {
183+
guard node.label?.text == expectedLabel else {
178184
return .skipChildren
179185
}
180186

181187
// We have custom code like foo + bar + [] (hopefully there is an array expr here).
182188
if let seq = node.expression.as(SequenceExprSyntax.self) {
183-
dependenciesArrayExpr = seq.elements.first(where: { $0.is(ArrayExprSyntax.self) })?.as(ArrayExprSyntax.self)
189+
foundArrayExpr = seq.elements.first(where: { $0.is(ArrayExprSyntax.self) })?.as(ArrayExprSyntax.self)
184190
} else if let arrayExpr = node.expression.as(ArrayExprSyntax.self) {
185-
dependenciesArrayExpr = arrayExpr
191+
foundArrayExpr = arrayExpr
186192
}
187193

188194
// FIXME: If we find a dependencies section but not an array expr, then we should
@@ -192,22 +198,6 @@ final class DependenciesArrayFinder: SyntaxVisitor {
192198
}
193199
}
194200

195-
/// Finder for targets array expression.
196-
final class TargetsArrayFinder: SyntaxVisitor {
197-
198-
/// The found targets array expr.
199-
private(set) var targets: ArrayExprSyntax?
200-
201-
override func visit(_ node: TupleExprElementSyntax) -> SyntaxVisitorContinueKind {
202-
if node.label?.text == "targets",
203-
let expr = node.expression.as(ArrayExprSyntax.self) {
204-
assert(targets == nil, "Found two targets labels")
205-
targets = expr
206-
}
207-
return .skipChildren
208-
}
209-
}
210-
211201
/// Finds a given target in a list of targets.
212202
final class TargetFinder: SyntaxVisitor {
213203

0 commit comments

Comments
 (0)