Skip to content

Commit ba6a519

Browse files
authored
Merge pull request #112 from Adyen/parameter-diff
Parameter diffing
2 parents 8ccfb86 + 089cf62 commit ba6a519

21 files changed

+284
-168
lines changed

.github/workflows/run-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- name: Select latest Xcode
2222
uses: maxim-lobanov/setup-xcode@v1
2323
with:
24-
xcode-version: '16.1'
24+
xcode-version: '16.2'
2525

2626
- name: 🛠️ Run All Tests
2727
run: |

Package.resolved

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ReferencePackages/ReferencePackage/Sources/ReferencePackage/ReferencePackage.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,20 @@ public enum CustomEnum {
140140

141141
indirect case recursive(CustomEnum)
142142
}
143+
144+
public struct PublicStructThatIsOnlyAvailableInTheReferencePackage {
145+
146+
public var foo: String
147+
public func bar() -> Void {
148+
print("Hello")
149+
}
150+
}
151+
152+
public extension CustomEnum {
153+
enum PublicEnumInExtensionOfCustomEnumThatIsOnlyAvailableInTheReferencePackage {
154+
case alpha
155+
case beta
156+
}
157+
}
158+
159+
public extension CustomEnum {}

Sources/PublicModules/PADProjectBuilder/SwiftInterfaceProducer/XcodeTools.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ struct XcodeTools {
2323

2424
internal enum Constants {
2525
static let derivedDataPath: String = ".build"
26+
static let buildDirPath: String = ".build/Build"
2627
static let simulatorSdkCommand = "xcrun --sdk iphonesimulator --show-sdk-path"
2728
}
2829

@@ -87,16 +88,15 @@ struct XcodeTools {
8788

8889
let result = shell.execute(command)
8990
let derivedDataPath = "\(projectDirectoryPath)/\(Constants.derivedDataPath)"
91+
let buildDirPath = "\(projectDirectoryPath)/\(Constants.buildDirPath)"
9092

9193
logger?.debug(result, from: String(describing: Self.self))
9294

9395
// It might be that the archive failed but the .swiftinterface files are still created
9496
// so we have to check outside if they exist.
9597
//
9698
// Also see: https://github.com/swiftlang/swift/issues/56573
97-
guard fileHandler.fileExists(atPath: derivedDataPath) else {
98-
print(result)
99-
99+
guard fileHandler.fileExists(atPath: buildDirPath) else {
100100
throw XcodeToolsError(
101101
errorDescription: "💥 Building project failed",
102102
underlyingError: result

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceAnalyzer/SwiftInterfaceAnalyzer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ struct SwiftInterfaceAnalyzer: SwiftInterfaceAnalyzing {
8181

8282
// No matching element was found so either it was removed or added
8383
let changeType: IndependentSwiftInterfaceChange.ChangeType = oldFirst ?
84-
.removal(lhsElement.description) :
84+
.removal(lhsElement.recursiveDescription()) :
8585
.addition(lhsElement.recursiveDescription())
8686

8787
return [

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/DeclSyntax+SwiftInterface/EnumCaseDeclSyntax+SwiftInterface.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extension EnumCaseDeclSyntax {
2222
name: $0.name.trimmedDescription,
2323
parameters: $0.parameterClause?.parameters.map {
2424
.init(
25+
attributes: [],
2526
firstName: $0.firstName?.trimmedDescription,
2627
secondName: $0.secondName?.trimmedDescription,
2728
type: $0.type.trimmedDescription,

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/DeclSyntax+SwiftInterface/FunctionDeclSyntax+SwiftInterface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension FunctionDeclSyntax {
2323
}
2424
}
2525

26-
let parameters: [SwiftInterfaceFunction.Parameter] = self.signature.parameterClause.parameters.map {
26+
let parameters: [SwiftInterfaceElementParameter] = self.signature.parameterClause.parameters.map {
2727
.init(
2828
attributes: $0.attributes.sanitizedList,
2929
firstName: $0.firstName.trimmedDescription,

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/DeclSyntax+SwiftInterface/InitializerDeclSyntax+SwiftInterface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ extension InitializerDeclSyntax {
2323
}
2424
}
2525

26-
let parameters: [SwiftInterfaceFunction.Parameter] = self.signature.parameterClause.parameters.map {
26+
let parameters: [SwiftInterfaceElementParameter] = self.signature.parameterClause.parameters.map {
2727
.init(
2828
attributes: $0.attributes.sanitizedList,
2929
firstName: $0.firstName.trimmedDescription,

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/DeclSyntax+SwiftInterface/SubscriptDeclSyntax+SwiftInterface.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ extension SubscriptDeclSyntax {
1212

1313
func toInterfaceElement() -> SwiftInterfaceSubscript {
1414

15-
let parameters: [SwiftInterfaceSubscript.Parameter] = self.parameterClause.parameters.map {
15+
let parameters: [SwiftInterfaceElementParameter] = self.parameterClause.parameters.map {
1616
.init(
17+
attributes: $0.attributes.sanitizedList,
1718
firstName: $0.firstName.trimmedDescription,
1819
secondName: $0.secondName?.trimmedDescription,
1920
type: $0.type.trimmedDescription,

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/SwiftInterfaceElement+Declaration/SwiftInterfaceElement+EnumCase.swift

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,6 @@
66

77
import Foundation
88

9-
extension SwiftInterfaceEnumCase {
10-
11-
struct Parameter {
12-
13-
let firstName: String?
14-
15-
let secondName: String?
16-
17-
let type: String
18-
19-
let defaultValue: String?
20-
21-
var description: String {
22-
var description = [
23-
firstName,
24-
secondName
25-
].compactMap { $0 }.joined(separator: " ")
26-
27-
if description.isEmpty {
28-
description += "\(type)"
29-
} else {
30-
description += ": \(type)"
31-
}
32-
33-
if let defaultValue {
34-
description += " = \(defaultValue)"
35-
}
36-
37-
return description
38-
}
39-
}
40-
}
41-
429
class SwiftInterfaceEnumCase: SwiftInterfaceElement {
4310

4411
/// e.g. @discardableResult, @MainActor, @objc, @_spi(...), ...
@@ -49,7 +16,7 @@ class SwiftInterfaceEnumCase: SwiftInterfaceElement {
4916

5017
let name: String
5118

52-
let parameters: [Parameter]?
19+
let parameters: [SwiftInterfaceElementParameter]?
5320

5421
let rawValue: String?
5522

@@ -72,7 +39,7 @@ class SwiftInterfaceEnumCase: SwiftInterfaceElement {
7239
attributes: [String],
7340
modifiers: [String],
7441
name: String,
75-
parameters: [Parameter]?,
42+
parameters: [SwiftInterfaceElementParameter]?,
7643
rawValue: String?
7744
) {
7845
self.attributes = attributes
@@ -90,7 +57,7 @@ extension SwiftInterfaceEnumCase {
9057
guard let other = otherElement as? Self else { return [] }
9158
changes += diffDescription(propertyType: "attribute", oldValues: other.attributes, newValues: attributes)
9259
changes += diffDescription(propertyType: "modifier", oldValues: other.modifiers, newValues: modifiers)
93-
changes += diffDescription(propertyType: "parameter", oldValues: other.parameters?.map(\.description), newValues: parameters?.map(\.description))
60+
changes += diffDescription(oldParameters: other.parameters, newParameters: parameters)
9461
changes += diffDescription(propertyType: "raw value", oldValue: other.rawValue, newValue: rawValue)
9562
return changes.compactMap { $0 }
9663
}

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/SwiftInterfaceElement+Declaration/SwiftInterfaceElement+Function.swift

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,45 +6,6 @@
66

77
import Foundation
88

9-
extension SwiftInterfaceFunction {
10-
11-
struct Parameter {
12-
13-
/// e.g. @discardableResult, @MainActor, @objc, @_spi(...), ...
14-
let attributes: [String]
15-
16-
let firstName: String
17-
18-
/// optional second "internal" name - can be ignored
19-
let secondName: String?
20-
21-
let type: String
22-
23-
let defaultValue: String?
24-
25-
var description: String {
26-
let names = [
27-
firstName,
28-
secondName
29-
].compactMap { $0 }
30-
31-
var description = (attributes + names).joined(separator: " ")
32-
33-
if description.isEmpty {
34-
description += "\(type)"
35-
} else {
36-
description += ": \(type)"
37-
}
38-
39-
if let defaultValue {
40-
description += " = \(defaultValue)"
41-
}
42-
43-
return description
44-
}
45-
}
46-
}
47-
489
class SwiftInterfaceFunction: SwiftInterfaceElement {
4910

5011
/// e.g. @discardableResult, @MainActor, @objc, @_spi(...), ...
@@ -55,7 +16,7 @@ class SwiftInterfaceFunction: SwiftInterfaceElement {
5516
/// e.g. <T>
5617
let genericParameterDescription: String?
5718

58-
let parameters: [Parameter]
19+
let parameters: [SwiftInterfaceElementParameter]
5920

6021
/// e.g. async, throws, rethrows
6122
let effectSpecifiers: [String]
@@ -76,7 +37,7 @@ class SwiftInterfaceFunction: SwiftInterfaceElement {
7637
var parent: (any SwiftInterfaceElement)?
7738

7839
var diffableSignature: String {
79-
"\(name)(\(parameters.map { "\($0.firstName):" }.joined()))"
40+
"\(name)(\(parameters.map(\.valueForDiffableSignature).joined()))"
8041
}
8142

8243
var consolidatableName: String { name }
@@ -90,7 +51,7 @@ class SwiftInterfaceFunction: SwiftInterfaceElement {
9051
modifiers: [String],
9152
name: String,
9253
genericParameterDescription: String?,
93-
parameters: [Parameter],
54+
parameters: [SwiftInterfaceElementParameter],
9455
effectSpecifiers: [String],
9556
returnType: String?,
9657
genericWhereClauseDescription: String?
@@ -114,7 +75,7 @@ extension SwiftInterfaceFunction {
11475
changes += diffDescription(propertyType: "attribute", oldValues: other.attributes, newValues: attributes)
11576
changes += diffDescription(propertyType: "modifier", oldValues: other.modifiers, newValues: modifiers)
11677
changes += diffDescription(propertyType: "generic parameter description", oldValue: other.genericParameterDescription, newValue: genericParameterDescription)
117-
changes += diffDescription(propertyType: "parameter", oldValues: other.parameters.map(\.description), newValues: parameters.map(\.description)) // TODO: Maybe have a better way to show changes
78+
changes += diffDescription(oldParameters: other.parameters, newParameters: parameters)
11879
changes += diffDescription(propertyType: "effect", oldValues: other.effectSpecifiers, newValues: effectSpecifiers)
11980
changes += diffDescription(propertyType: "return type", oldValue: other.returnType, newValue: returnType)
12081
changes += diffDescription(propertyType: "generic where clause", oldValue: other.genericWhereClauseDescription, newValue: genericWhereClauseDescription)

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/SwiftInterfaceElement+Declaration/SwiftInterfaceElement+Initializer.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class SwiftInterfaceInitializer: SwiftInterfaceElement {
1616
/// e.g. <T>
1717
let genericParameterDescription: String?
1818

19-
let parameters: [SwiftInterfaceFunction.Parameter]
19+
let parameters: [SwiftInterfaceElementParameter]
2020

2121
/// e.g. async, throws, rethrows
2222
let effectSpecifiers: [String]
@@ -35,7 +35,7 @@ class SwiftInterfaceInitializer: SwiftInterfaceElement {
3535
var parent: (any SwiftInterfaceElement)?
3636

3737
var diffableSignature: String {
38-
"init(\(parameters.map { "\($0.firstName):" }.joined()))"
38+
"init(\(parameters.map { $0.valueForDiffableSignature }.joined()))"
3939
}
4040

4141
var consolidatableName: String { "init" }
@@ -49,7 +49,7 @@ class SwiftInterfaceInitializer: SwiftInterfaceElement {
4949
modifiers: [String],
5050
optionalMark: String?,
5151
genericParameterDescription: String?,
52-
parameters: [SwiftInterfaceFunction.Parameter],
52+
parameters: [SwiftInterfaceElementParameter],
5353
effectSpecifiers: [String],
5454
genericWhereClauseDescription: String?
5555
) {
@@ -72,7 +72,7 @@ extension SwiftInterfaceInitializer {
7272
changes += diffDescription(propertyType: "modifier", oldValues: other.modifiers, newValues: modifiers)
7373
changes += diffDescription(propertyType: "optional mark", oldValue: other.optionalMark, newValue: optionalMark)
7474
changes += diffDescription(propertyType: "generic parameter description", oldValue: other.genericParameterDescription, newValue: genericParameterDescription)
75-
changes += diffDescription(propertyType: "parameter", oldValues: other.parameters.map(\.description), newValues: parameters.map(\.description)) // TODO: Maybe have a better way to show changes
75+
changes += diffDescription(oldParameters: other.parameters, newParameters: parameters)
7676
changes += diffDescription(propertyType: "effect", oldValues: other.effectSpecifiers, newValues: effectSpecifiers)
7777
changes += diffDescription(propertyType: "generic where clause", oldValue: other.genericWhereClauseDescription, newValue: genericWhereClauseDescription)
7878
return changes.compactMap { $0 }

Sources/PublicModules/PADSwiftInterfaceDiff/SwiftInterfaceParser/SwiftInterfaceElement+Declaration/SwiftInterfaceElement+Subscript.swift

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,6 @@
66

77
import Foundation
88

9-
extension SwiftInterfaceSubscript {
10-
11-
struct Parameter {
12-
13-
let firstName: String
14-
15-
/// optional second "internal" name - can be ignored
16-
let secondName: String?
17-
18-
let type: String
19-
20-
let defaultValue: String?
21-
22-
var description: String {
23-
var description = [
24-
firstName,
25-
secondName
26-
].compactMap { $0 }.joined(separator: " ")
27-
28-
if description.isEmpty {
29-
description += "\(type)"
30-
} else {
31-
description += ": \(type)"
32-
}
33-
34-
if let defaultValue {
35-
description += " = \(defaultValue)"
36-
}
37-
38-
return description
39-
}
40-
}
41-
}
42-
439
class SwiftInterfaceSubscript: SwiftInterfaceElement {
4410

4511
let name: String = "subscript"
@@ -53,7 +19,7 @@ class SwiftInterfaceSubscript: SwiftInterfaceElement {
5319
/// e.g. <T>
5420
let genericParameterDescription: String?
5521

56-
let parameters: [Parameter]
22+
let parameters: [SwiftInterfaceElementParameter]
5723

5824
let returnType: String
5925

@@ -69,7 +35,7 @@ class SwiftInterfaceSubscript: SwiftInterfaceElement {
6935
var parent: (any SwiftInterfaceElement)?
7036

7137
var diffableSignature: String {
72-
"\(name)(\(parameters.map { "\($0.firstName):" }.joined()))"
38+
"\(name)(\(parameters.map(\.valueForDiffableSignature).joined()))"
7339
}
7440

7541
var consolidatableName: String { name }
@@ -82,7 +48,7 @@ class SwiftInterfaceSubscript: SwiftInterfaceElement {
8248
attributes: [String],
8349
modifiers: [String],
8450
genericParameterDescription: String?,
85-
parameters: [Parameter],
51+
parameters: [SwiftInterfaceElementParameter],
8652
returnType: String,
8753
genericWhereClauseDescription: String?,
8854
accessors: String?
@@ -105,7 +71,7 @@ extension SwiftInterfaceSubscript {
10571
changes += diffDescription(propertyType: "attribute", oldValues: other.attributes, newValues: attributes)
10672
changes += diffDescription(propertyType: "modifier", oldValues: other.modifiers, newValues: modifiers)
10773
changes += diffDescription(propertyType: "generic parameter description", oldValue: other.genericParameterDescription, newValue: genericParameterDescription)
108-
changes += diffDescription(propertyType: "parameter", oldValues: other.parameters.map(\.description), newValues: parameters.map(\.description)) // TODO: Maybe have a better way to show changes
74+
changes += diffDescription(oldParameters: other.parameters, newParameters: parameters)
10975
changes += diffDescription(propertyType: "return type", oldValue: other.returnType, newValue: returnType)
11076
changes += diffDescription(propertyType: "generic where clause", oldValue: other.genericWhereClauseDescription, newValue: genericWhereClauseDescription)
11177
changes += diffDescription(propertyType: "accessors", oldValue: other.accessors, newValue: accessors)

0 commit comments

Comments
 (0)