diff --git a/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift b/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift index 36226eb38..c17e4c6ce 100644 --- a/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift +++ b/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift @@ -19,16 +19,16 @@ public class XCSwiftPackageProductDependency: PBXContainerItem, PlistSerializabl } /// Is it a Plugin. - var isPlugin: Bool { - productName.hasPrefix("plugin:") - } + var isPlugin: Bool // MARK: - Init public init(productName: String, - package: XCRemoteSwiftPackageReference? = nil) { + package: XCRemoteSwiftPackageReference? = nil, + isPlugin: Bool = false) { self.productName = productName packageReference = package?.reference + self.isPlugin = isPlugin super.init() } @@ -36,7 +36,10 @@ public class XCSwiftPackageProductDependency: PBXContainerItem, PlistSerializabl let objects = decoder.context.objects let repository = decoder.context.objectReferenceRepository let container = try decoder.container(keyedBy: CodingKeys.self) - productName = try container.decode(String.self, forKey: .productName) + let rawProductName = try container.decode(String.self, forKey: .productName) + productName = rawProductName.replacingOccurrences(of: "plugin:", with: "") + isPlugin = productName != rawProductName + if let packageString: String = try container.decodeIfPresent(.package) { packageReference = repository.getOrCreate(reference: packageString, objects: objects) } else { @@ -51,7 +54,11 @@ public class XCSwiftPackageProductDependency: PBXContainerItem, PlistSerializabl if let package = package { dictionary["package"] = .string(.init(package.reference.value, comment: "XCRemoteSwiftPackageReference \"\(package.name ?? "")\"")) } - dictionary["productName"] = .string(.init(productName)) + if isPlugin { + dictionary["productName"] = .string(.init("plugin:" + productName)) + } else { + dictionary["productName"] = .string(.init(productName)) + } return (key: CommentedString(reference, comment: productName), value: .dictionary(dictionary)) diff --git a/Tests/XcodeProjTests/Objects/SwiftPackage/XCSwiftPackageProductDependencyTests.swift b/Tests/XcodeProjTests/Objects/SwiftPackage/XCSwiftPackageProductDependencyTests.swift index 74ba6789b..a09f302e0 100644 --- a/Tests/XcodeProjTests/Objects/SwiftPackage/XCSwiftPackageProductDependencyTests.swift +++ b/Tests/XcodeProjTests/Objects/SwiftPackage/XCSwiftPackageProductDependencyTests.swift @@ -19,6 +19,25 @@ final class XCSwiftPackageProductDependencyTests: XCTestCase { // Then XCTAssertEqual(got.productName, "xcodeproj") XCTAssertEqual(got.packageReference?.value, "packageReference") + XCTAssertEqual(got.isPlugin, false) + } + + func test_initAsPlugin() throws { + // Given + let decoder = XcodeprojPropertyListDecoder() + let encoder = PropertyListEncoder() + let plist = ["reference": "reference", + "productName": "plugin:xcodeproj", + "package": "packageReference"] + let data = try encoder.encode(plist) + + // When + let got = try decoder.decode(XCSwiftPackageProductDependency.self, from: data) + + // Then + XCTAssertEqual(got.productName, "xcodeproj") + XCTAssertEqual(got.packageReference?.value, "packageReference") + XCTAssertEqual(got.isPlugin, true) } func test_plistValues() throws { @@ -39,6 +58,25 @@ final class XCSwiftPackageProductDependencyTests: XCTestCase { ])) } + func test_plistValuesAsPlugin() throws { + // Given + let proj = PBXProj() + let package = XCRemoteSwiftPackageReference(repositoryURL: "repository") + let subject = XCSwiftPackageProductDependency(productName: "product", + package: package, + isPlugin: true) + + // When + let got = try subject.plistKeyAndValue(proj: proj, reference: "reference") + + // Then + XCTAssertEqual(got.value, .dictionary([ + "isa": "XCSwiftPackageProductDependency", + "productName": "product", + "package": .string(.init(package.reference.value, comment: "XCRemoteSwiftPackageReference \"\(package.name ?? "")\"")), + ])) + } + func test_equal() { // Given let package = XCRemoteSwiftPackageReference(repositoryURL: "repository") @@ -53,7 +91,7 @@ final class XCSwiftPackageProductDependencyTests: XCTestCase { func test_isPlugin() { // Given - let plugin = XCSwiftPackageProductDependency(productName: "plugin:product") + let plugin = XCSwiftPackageProductDependency(productName: "product", isPlugin: true) // Then XCTAssertTrue(plugin.isPlugin) diff --git a/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift b/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift index e1e16914c..08a3f9760 100644 --- a/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift +++ b/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift @@ -141,7 +141,7 @@ private extension PBXProj { func makePluginDependency() -> PBXTargetDependency { let packageReference = XCRemoteSwiftPackageReference(repositoryURL: "repository") - let packageDependency = XCSwiftPackageProductDependency(productName: "plugin:product", package: packageReference) + let packageDependency = XCSwiftPackageProductDependency(productName: "product", package: packageReference, isPlugin: true) let targetDependency = PBXTargetDependency(product: packageDependency) add(object: targetDependency.productReference!.getObject()!)