Skip to content

Commit b7c163c

Browse files
phimagee-marchand
authored andcommitted
Add support for SwiftPM node in project file
1 parent 0c6def2 commit b7c163c

14 files changed

+544
-42
lines changed

.swift-version

Lines changed: 0 additions & 1 deletion
This file was deleted.

Sources/Isa.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public enum Isa: String, CaseIterable, CustomStringConvertible {
3232
case versionGroup = "XCVersionGroup"
3333
case configurationList = "XCConfigurationList"
3434
case buildConfiguration = "XCBuildConfiguration"
35+
case remoteSwiftPackageReference = "XCRemoteSwiftPackageReference"
36+
case swiftPackageProductDependency = "XCSwiftPackageProductDependency"
3537

3638
public var description: String {
3739
return rawValue
@@ -79,6 +81,8 @@ extension Isa {
7981
case .versionGroup: return XCVersionGroup.self
8082
case .configurationList: return XCConfigurationList.self
8183
case .buildConfiguration: return XCBuildConfiguration.self
84+
case .remoteSwiftPackageReference: return XCRemoteSwiftPackageReference.self
85+
case .swiftPackageProductDependency: return XCSwiftPackageProductDependency.self
8286
}
8387
}
8488
}

Sources/PBXBuildFile.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ public class PBXBuildFile: PBXProjectItem {
1212

1313
public enum PBXKeys: PBXKey {
1414
case fileRef
15+
case productRef
1516
case settings
1617
}
1718

1819
#if LAZY
1920
public lazy var fileRef: PBXReference? = self.object(PBXKeys.fileRef)
21+
public lazy var productRef: XCSwiftPackageProductDependency? = self.object(PBXKeys.productRef)
2022
public lazy var settings: [String: Any]? = self.dictionary(PBXKeys.settings)
2123
#else
2224
public var fileRef: PBXReference? { self.object(PBXKeys.fileRef) }
25+
public var productRef: XCSwiftPackageProductDependency? { self.object(PBXKeys.productRef) }
2326
public var settings: [String: Any]? { self.dictionary(PBXKeys.settings) }
2427
#endif
2528

Sources/PBXProject.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class PBXProject: PBXContainer, PBXBuildConfigurationListable {
1717
case targets
1818
case mainGroup
1919
case buildConfigurationList
20+
case packageReferences
2021
}
2122

2223
#if LAZY
@@ -26,6 +27,7 @@ public class PBXProject: PBXContainer, PBXBuildConfigurationListable {
2627
public lazy var targets: [PBXNativeTarget] = self.objects(PBXKeys.targets)
2728
public lazy var mainGroup: PBXGroup? = self.object(.mainGroup)
2829
public lazy var buildConfigurationList: XCConfigurationList? = self.object(PBXKeys.buildConfigurationList)
30+
public lazy var packageReferences: [XCRemoteSwiftPackageReference] = self.objects(PBXKeys.packageReferences)
2931

3032
lazy var targetsByConfigRef: [String: PBXNativeTarget] = {
3133
var dict: [String: PBXNativeTarget] = [:]
@@ -43,6 +45,7 @@ public class PBXProject: PBXContainer, PBXBuildConfigurationListable {
4345
public var targets: [PBXNativeTarget] { self.objects(PBXKeys.targets) }
4446
public var mainGroup: PBXGroup? { self.object(PBXKeys.mainGroup) }
4547
public var buildConfigurationList: XCConfigurationList? { self.object(PBXKeys.buildConfigurationList) }
48+
public var packageReferences: [XCRemoteSwiftPackageReference] { self.objects(PBXKeys.packageReferences) }
4649

4750
var targetsByConfigRef: [String: PBXNativeTarget] {
4851
var dict: [String: PBXNativeTarget] = [:]
@@ -84,11 +87,11 @@ extension PBXProject {
8487
}
8588

8689
public struct Version: Comparable, CustomStringConvertible {
87-
90+
8891
public var major: Int
8992
public var minor: Int
9093

91-
public init?(_ string: String?){
94+
public init?(_ string: String?) {
9295
guard let string = string, string.count > 3 else {
9396
return nil
9497
}
@@ -101,7 +104,7 @@ extension PBXProject {
101104
self.minor = minor
102105
}
103106

104-
public init(major: Int, minor: Int){
107+
public init(major: Int, minor: Int) {
105108
self.major = major
106109
self.minor = minor
107110
}
@@ -125,7 +128,7 @@ extension PBXProject {
125128
}
126129

127130
public var openStep: String {
128-
return "\(String(format: "%02d", self.major))\(String(format: "%02d",self.minor))"
131+
return "\(String(format: "%02d", self.major))\(String(format: "%02d", self.minor))"
129132
}
130133
}
131134

Sources/PBXTarget.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public /* abstract */ class PBXTarget: PBXProjectItem, PBXBuildConfigurationList
1616
case buildPhases
1717
case buildConfigurationList
1818
case dependencies
19+
case packageProductDependencies
1920
}
2021

2122
#if LAZY
@@ -24,12 +25,14 @@ public /* abstract */ class PBXTarget: PBXProjectItem, PBXBuildConfigurationList
2425
public lazy var buildPhases: [PBXBuildPhase] = self.objects(PBXKeys.buildPhases)
2526
public lazy var buildConfigurationList: XCConfigurationList? = self.object(PBXKeys.buildConfigurationList)
2627
public lazy var dependencies: [PBXTargetDependency] = self.objects(PBXKeys.dependencies)
28+
public lazy var packageProductDependencies: [XCSwiftPackageProductDependency] = self.objects(PBXKeys.packageProductDependencies) // swiftlint:disable:this line_length
2729
#else
2830
public var name: String { self.string(PBXKeys.name) }
2931
public var productName: String? { self.string(PBXKeys.productName) }
3032
public var buildPhases: [PBXBuildPhase] { self.objects(PBXKeys.buildPhases) }
3133
public var buildConfigurationList: XCConfigurationList? { self.object(PBXKeys.buildConfigurationList) }
3234
public var dependencies: [PBXTargetDependency] { self.objects(PBXKeys.dependencies) }
35+
public var packageProductDependencies: [XCSwiftPackageProductDependency] {self.objects(PBXKeys.packageProductDependencies) } // swiftlint:disable:this line_length
3336
#endif
3437

3538
public override var comment: String? {

Sources/String+XcodeProjKit.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import Foundation
1010

11-
//swiftlint:disable:next force_try
11+
// swiftlint:disable:next force_try
1212
let nonescapeRegex = try! NSRegularExpression(pattern: "^[a-z0-9_\\$\\.\\/]+$", options: .caseInsensitive)
1313
let specialRegexes: [(String, NSRegularExpression)] = ["\\\\", "\\\"", "\\n", "\\r", "\\t"].compactMap { string in
1414
if let regular = try? NSRegularExpression(pattern: string, options: []) {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// XCRemoteSwiftPackageReference.swift
3+
// XcodeProjKit
4+
//
5+
// Created by emarchand on 29/05/2021.
6+
// Copyright © 2021 AnOrgaName. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
public class XCRemoteSwiftPackageReference: PBXObject {
12+
13+
public enum PBXKeys: PBXKey {
14+
case repositoryURL
15+
case requirement
16+
}
17+
18+
#if LAZY
19+
public lazy var repositoryURL: String? = self.string(PBXKeys.repositoryURL)
20+
public lazy var requirement: [String: Any]? = dictionary(PBXKeys.requirement)
21+
#else
22+
public var repositoryURL: String? { self.string(PBXKeys.repositoryURL) }
23+
public var requirement: [String: Any]? { dictionary(PBXKeys.requirement) }
24+
#endif
25+
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//
2+
// XCSwiftPackageProductDependency.swift
3+
// XcodeProjKit
4+
//
5+
// Created by emarchand on 29/05/2021.
6+
// Copyright © 2021 AnOrgaName. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
public class XCSwiftPackageProductDependency: PBXObject {
12+
13+
public enum PBXKeys: PBXKey {
14+
case productName
15+
case package
16+
}
17+
18+
#if LAZY
19+
public lazy var productName: String? = self.string(PBXKeys.productName)
20+
public lazy var package: XCRemoteSwiftPackageReference? = self.object(PBXKeys.productName)
21+
#else
22+
public var productName: String? { self.string(PBXKeys.productName) } // but not ""
23+
public var package: XCRemoteSwiftPackageReference? { self.object(PBXKeys.productName) }
24+
#endif
25+
26+
}

Sources/XcodeProj.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public class XcodeProj {
173173
}
174174

175175
let extractProjetName = "Build configuration list for PBXProject \""
176-
//swiftlint:disable:next force_try
176+
// swiftlint:disable:next force_try
177177
let extractProjetNameRegex = try! NSRegularExpression(pattern:
178178
"Build configuration list for PBXProject \"(.*)\"", options: [])
179179

Tests/XcodeProjKitParseTests.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,28 @@ class XcodeProjKitParseTests: XCTestCase {
8787
func testplist() {
8888
testParse("ok/plist")
8989
}
90-
91-
func testParse(_ resource: String) {
90+
91+
func testswiftpm() {
92+
let proj = testParse("ok/swiftpm.project")
93+
XCTAssertNotNil(proj?.objects.object("48A408192662576D0068A35B"))
94+
XCTAssertNotNil(proj?.objects.object("48A4081A2662576D0068A35B"))
95+
}
96+
97+
@discardableResult
98+
func testParse(_ resource: String) -> XcodeProj? {
9299
if let url = url(forResource: resource, withExtension: XcodeProj.pbxprojFileExtension) {
93100
do {
94101
let proj = try XcodeProj(url: url)
95102
XCTAssertNotNil(proj.project.mainGroup)
96103
XCTAssertNotNil(proj.project.buildConfigurationList)
104+
return proj
97105
} catch {
98106
XCTFail("\(error)")
99107
}
100108
} else {
101109
XCTFail("Missing resource \(resource)")
102110
}
111+
return nil
103112
}
104113

105114
}

0 commit comments

Comments
 (0)