From e2b09d3be6a9453e4e8e84fcdbc0c215d70eab57 Mon Sep 17 00:00:00 2001 From: Mike Simons Date: Tue, 30 Jul 2024 08:37:32 -0400 Subject: [PATCH] Unify `object` access in `PBXObjectReference` --- .../Objects/BuildPhase/PBXBuildFile.swift | 10 ++-- .../Objects/BuildPhase/PBXBuildPhase.swift | 2 +- .../Configuration/XCBuildConfiguration.swift | 4 +- .../Configuration/XCConfigurationList.swift | 2 +- .../Objects/Files/PBXContainerItemProxy.swift | 4 +- .../Objects/Files/PBXFileElement.swift | 6 +- .../XcodeProj/Objects/Files/PBXGroup.swift | 2 +- .../Objects/Files/XCVersionGroup.swift | 4 +- .../Objects/Project/PBXObjectReference.swift | 58 ++++++++----------- .../XcodeProj/Objects/Project/PBXProj.swift | 22 +++---- .../Objects/Project/PBXProject.swift | 26 ++++----- .../XCSwiftPackageProductDependency.swift | 2 +- .../Objects/Targets/PBXReferenceProxy.swift | 2 +- .../XcodeProj/Objects/Targets/PBXTarget.swift | 36 ++++++------ .../Objects/Targets/PBXTargetDependency.swift | 8 +-- .../XcodeProj/Utils/ReferenceGenerator.swift | 14 ++--- .../Targets/PBXAggregateTargetTests.swift | 4 +- .../Targets/PBXNativeTargetTests.swift | 4 +- .../Project/XcodeProjTests.swift | 2 +- .../Utils/ObjectReferenceTests.swift | 6 +- .../Utils/ReferenceGeneratorTests.swift | 4 +- 21 files changed, 107 insertions(+), 115 deletions(-) diff --git a/Sources/XcodeProj/Objects/BuildPhase/PBXBuildFile.swift b/Sources/XcodeProj/Objects/BuildPhase/PBXBuildFile.swift index 99e8c8445..3d9c889fe 100644 --- a/Sources/XcodeProj/Objects/BuildPhase/PBXBuildFile.swift +++ b/Sources/XcodeProj/Objects/BuildPhase/PBXBuildFile.swift @@ -10,7 +10,7 @@ public final class PBXBuildFile: PBXObject { /// Returns the file the build file refers to. public var file: PBXFileElement? { get { - fileReference?.getObject() + fileReference?.object() } set { fileReference = newValue?.reference @@ -23,7 +23,7 @@ public final class PBXBuildFile: PBXObject { /// Product. public var product: XCSwiftPackageProductDependency? { get { - productReference?.getObject() + productReference?.object() } set { productReference = newValue?.reference @@ -104,8 +104,8 @@ extension PBXBuildFile { /// - Returns: file name. /// - Throws: an error if the name cannot be obtained. func fileName() throws -> String? { - if let fileElement: PBXFileElement = fileReference?.getObject(), let name = fileElement.fileName() { return name } - if let product: XCSwiftPackageProductDependency = productReference?.getObject() { return product.productName } + if let fileElement: PBXFileElement = fileReference?.object(), let name = fileElement.fileName() { return name } + if let product: XCSwiftPackageProductDependency = productReference?.object() { return product.productName } return nil } @@ -171,7 +171,7 @@ final class PBXBuildPhaseFile: PlistSerializable, Equatable { var dictionary: [CommentedString: PlistValue] = [:] dictionary["isa"] = .string(CommentedString(PBXBuildFile.isa)) if let fileReference = buildFile.fileReference { - let fileElement: PBXFileElement? = fileReference.getObject() + let fileElement: PBXFileElement? = fileReference.object() dictionary["fileRef"] = .string(CommentedString(fileReference.value, comment: fileElement?.fileName())) } if let product = buildFile.product { diff --git a/Sources/XcodeProj/Objects/BuildPhase/PBXBuildPhase.swift b/Sources/XcodeProj/Objects/BuildPhase/PBXBuildPhase.swift index b6f261a19..b0d1f1f61 100644 --- a/Sources/XcodeProj/Objects/BuildPhase/PBXBuildPhase.swift +++ b/Sources/XcodeProj/Objects/BuildPhase/PBXBuildPhase.swift @@ -88,7 +88,7 @@ public class PBXBuildPhase: PBXContainerItem { dictionary["buildActionMask"] = .string(CommentedString("\(buildActionMask)")) if let fileReferences = fileReferences { let files: PlistValue = .array(fileReferences.map { fileReference in - let buildFile: PBXBuildFile? = fileReference.getObject() + let buildFile: PBXBuildFile? = fileReference.object() let name = buildFile.flatMap { try? $0.fileName() } ?? nil let fileName: String = name ?? "(null)" let type = self.name() diff --git a/Sources/XcodeProj/Objects/Configuration/XCBuildConfiguration.swift b/Sources/XcodeProj/Objects/Configuration/XCBuildConfiguration.swift index 11c73f303..e5ea97eca 100644 --- a/Sources/XcodeProj/Objects/Configuration/XCBuildConfiguration.swift +++ b/Sources/XcodeProj/Objects/Configuration/XCBuildConfiguration.swift @@ -10,7 +10,7 @@ public final class XCBuildConfiguration: PBXObject { /// Base xcconfig file reference. public var baseConfiguration: PBXFileReference? { get { - baseConfigurationReference?.getObject() + baseConfigurationReference?.object() } set { if let newValue = newValue { @@ -105,7 +105,7 @@ extension XCBuildConfiguration: PlistSerializable { dictionary["name"] = .string(CommentedString(name)) dictionary["buildSettings"] = buildSettings.plist() if let baseConfigurationReference = baseConfigurationReference { - let fileElement: PBXFileElement? = baseConfigurationReference.getObject() + let fileElement: PBXFileElement? = baseConfigurationReference.object() dictionary["baseConfigurationReference"] = .string(CommentedString(baseConfigurationReference.value, comment: fileElement?.fileName())) } return (key: CommentedString(reference, comment: name), value: .dictionary(dictionary)) diff --git a/Sources/XcodeProj/Objects/Configuration/XCConfigurationList.swift b/Sources/XcodeProj/Objects/Configuration/XCConfigurationList.swift index 0bf2cfe35..b16525a9a 100644 --- a/Sources/XcodeProj/Objects/Configuration/XCConfigurationList.swift +++ b/Sources/XcodeProj/Objects/Configuration/XCConfigurationList.swift @@ -116,7 +116,7 @@ extension XCConfigurationList: PlistSerializable { dictionary["isa"] = .string(CommentedString(XCConfigurationList.isa)) dictionary["buildConfigurations"] = .array(buildConfigurationReferences .map { configReference in - let config: XCBuildConfiguration? = configReference.getObject() + let config: XCBuildConfiguration? = configReference.object() return .string(CommentedString(configReference.value, comment: config?.name)) }) dictionary["defaultConfigurationIsVisible"] = .string(CommentedString("\(defaultConfigurationIsVisible.int)")) diff --git a/Sources/XcodeProj/Objects/Files/PBXContainerItemProxy.swift b/Sources/XcodeProj/Objects/Files/PBXContainerItemProxy.swift index f244aeada..2ef17aee2 100644 --- a/Sources/XcodeProj/Objects/Files/PBXContainerItemProxy.swift +++ b/Sources/XcodeProj/Objects/Files/PBXContainerItemProxy.swift @@ -28,7 +28,7 @@ public final class PBXContainerItemProxy: PBXObject { var id: RemoteGlobalID { switch self { case let .reference(reference): - if let object = reference.getObject() { + if let object = reference.object() { return .object(object) } else { return .string(reference.value) @@ -65,7 +65,7 @@ public final class PBXContainerItemProxy: PBXObject { /// Use isContainerPortalFileReference to check if you can use the getter public var containerPortal: ContainerPortal { get { - ContainerPortal(object: containerPortalReference.getObject()) + ContainerPortal(object: containerPortalReference.object()) } set { guard let reference = newValue.reference else { diff --git a/Sources/XcodeProj/Objects/Files/PBXFileElement.swift b/Sources/XcodeProj/Objects/Files/PBXFileElement.swift index 573e8ee8e..c404f8d3a 100644 --- a/Sources/XcodeProj/Objects/Files/PBXFileElement.swift +++ b/Sources/XcodeProj/Objects/Files/PBXFileElement.swift @@ -199,10 +199,10 @@ public extension PBXFileElement { /// - Returns: path to the variant group base file. /// - Throws: an error if the path cannot be obtained. private func baseVariantGroupPath() throws -> String? { - guard let variantGroup: PBXVariantGroup = reference.getObject() else { return nil } - guard let baseReference = try variantGroup + guard let variantGroup: PBXVariantGroup = reference.object() else { return nil } + guard let baseReference = variantGroup .childrenReferences - .compactMap({ try $0.getThrowingObject() as PBXFileElement }) + .compactMap({ $0.object(as: PBXFileElement.self) }) .first(where: { $0.name == "Base" }) else { return nil } return baseReference.path } diff --git a/Sources/XcodeProj/Objects/Files/PBXGroup.swift b/Sources/XcodeProj/Objects/Files/PBXGroup.swift index 34add940c..41065836e 100644 --- a/Sources/XcodeProj/Objects/Files/PBXGroup.swift +++ b/Sources/XcodeProj/Objects/Files/PBXGroup.swift @@ -72,7 +72,7 @@ public class PBXGroup: PBXFileElement { var dictionary: [CommentedString: PlistValue] = try super.plistKeyAndValue(proj: proj, reference: reference).value.dictionary ?? [:] dictionary["isa"] = .string(CommentedString(type(of: self).isa)) dictionary["children"] = .array(childrenReferences.map { (fileReference) -> PlistValue in - let fileElement: PBXFileElement? = fileReference.getObject() + let fileElement: PBXFileElement? = fileReference.object() return .string(CommentedString(fileReference.value, comment: fileElement?.fileName())) }) diff --git a/Sources/XcodeProj/Objects/Files/XCVersionGroup.swift b/Sources/XcodeProj/Objects/Files/XCVersionGroup.swift index 3087294f2..02845b717 100644 --- a/Sources/XcodeProj/Objects/Files/XCVersionGroup.swift +++ b/Sources/XcodeProj/Objects/Files/XCVersionGroup.swift @@ -12,7 +12,7 @@ public final class XCVersionGroup: PBXGroup { /// Returns the current version file reference. public var currentVersion: PBXFileReference? { get { - currentVersionReference?.getObject() + currentVersionReference?.object() } set { currentVersionReference = newValue?.reference @@ -91,7 +91,7 @@ public final class XCVersionGroup: PBXGroup { dictionary["versionGroupType"] = .string(CommentedString(versionGroupType)) } if let currentVersionReference = currentVersionReference { - let fileElement: PBXFileElement? = currentVersionReference.getObject() + let fileElement: PBXFileElement? = currentVersionReference.object() dictionary["currentVersion"] = .string(CommentedString(currentVersionReference.value, comment: fileElement?.fileName())) } return (key: CommentedString(reference, comment: path?.split(separator: "/").last.map(String.init)), diff --git a/Sources/XcodeProj/Objects/Project/PBXObjectReference.swift b/Sources/XcodeProj/Objects/Project/PBXObjectReference.swift index 869dedffe..9abc65671 100644 --- a/Sources/XcodeProj/Objects/Project/PBXObjectReference.swift +++ b/Sources/XcodeProj/Objects/Project/PBXObjectReference.swift @@ -31,13 +31,32 @@ class PBXObjectReference: NSObject, Comparable, NSCopying, @unchecked Sendable { } private weak var _objects: PBXObjects? - // QUESTION: this is exposed to the project but so is `getThrowingObject` and `getObject`. What access patterns do we want to support? - /// A weak reference to the object - var object: PBXObject? { - get { - lock.withLock { _object } + + /// The object referenced by this instance. + /// + /// - Returns: object the reference is referring to. Returns nil if the objects property has been released or the reference doesn't exist + func object() -> T? { + lock.withLock { + if let object = _object as? T { + return object + } + + guard let object = objects?.get(reference: self) else { return nil } + _object = object + + return object as? T + } } + + + /// Typed object referenced by this instance. + /// - Parameter as: Type to cast to + /// - Returns: returns casted object if successful + func object(as: T.Type) -> T? { + lock.withLock { _object } as? T + } + private weak var _object: PBXObject? /// Initializes a non-temporary reference. @@ -147,33 +166,6 @@ class PBXObjectReference: NSObject, Comparable, NSCopying, @unchecked Sendable { } } - /// Returns the object the reference is referfing to. - /// - /// - Returns: object the reference is referring to. Returns nil if the objects property has been released or the reference doesn't exist - func getObject() -> T? { - try? getThrowingObject() - } - - /// Returns the object the reference is referfing to. - /// - /// - Returns: object the reference is referring to. - /// - Throws: an errof it the objects property has been released or the reference doesn't exist. - func getThrowingObject() throws -> T { - if let object = object as? T { - return object - } - return try lock.withLock { - guard let objects = objects else { - throw PBXObjectError.objectsReleased - } - guard let object = objects.get(reference: self) as? T else { - throw PBXObjectError.objectNotFound(value) - } - _object = object - return object - } - - } } extension Array where Element: PBXObject { @@ -184,6 +176,6 @@ extension Array where Element: PBXObject { extension Array where Element: PBXObjectReference { func objects() -> [T] { - compactMap { $0.getObject() } + compactMap { $0.object() } } } diff --git a/Sources/XcodeProj/Objects/Project/PBXProj.swift b/Sources/XcodeProj/Objects/Project/PBXProj.swift index 6248aed4e..4c820737a 100644 --- a/Sources/XcodeProj/Objects/Project/PBXProj.swift +++ b/Sources/XcodeProj/Objects/Project/PBXProj.swift @@ -25,7 +25,7 @@ public final class PBXProj: Decodable { rootObjectReference = newValue?.reference } get { - rootObjectReference?.getObject() + rootObjectReference?.object() } } @@ -47,7 +47,7 @@ public final class PBXProj: Decodable { self.classes = classes rootObjectReference = rootObject?.reference self.objects = PBXObjects(objects: objects) - if let rootGroup = try? rootGroup() { + if let rootGroup = rootGroup() { rootGroup.assignParentToChildren() } } @@ -154,7 +154,7 @@ public final class PBXProj: Decodable { } self.objects = objects - try rootGroup()?.assignParentToChildren() + rootGroup()?.assignParentToChildren() } // MARK: Static Methods @@ -169,7 +169,7 @@ public final class PBXProj: Decodable { let plistDecoder = XcodeprojPropertyListDecoder(context: context) let pbxproj: PBXProj = try plistDecoder.decode(PBXProj.self, from: pbxProjData) - try pbxproj.updateProjectName(path: path) + pbxproj.updateProjectName(path: path) return pbxproj } @@ -228,14 +228,14 @@ public extension PBXProj { var buildPhases: [PBXBuildPhase] { Array(objects.buildPhases.values) } /// Returns root project. - func rootProject() throws -> PBXProject? { - try rootObjectReference?.getThrowingObject() + func rootProject() -> PBXProject? { + rootObjectReference?.object() } /// Returns root project's root group. - func rootGroup() throws -> PBXGroup? { - let project = try rootProject() - return try project?.mainGroupReference.getThrowingObject() + func rootGroup() -> PBXGroup? { + let project = rootProject() + return project?.mainGroupReference.object() } /// Adds a new object to the project. @@ -298,12 +298,12 @@ extension PBXProj { /// /// - Parameters: /// - path: path to .xcodeproj directory. - func updateProjectName(path: Path) throws { + func updateProjectName(path: Path) { guard path.parent().extension == "xcodeproj" else { return } let projectName = path.parent().lastComponent.split(separator: ".").first - try rootProject()?.name = projectName.map(String.init) ?? "" + rootProject()?.name = projectName.map(String.init) ?? "" } } diff --git a/Sources/XcodeProj/Objects/Project/PBXProject.swift b/Sources/XcodeProj/Objects/Project/PBXProject.swift index 9a2ccd661..4b6ba67ca 100644 --- a/Sources/XcodeProj/Objects/Project/PBXProject.swift +++ b/Sources/XcodeProj/Objects/Project/PBXProject.swift @@ -16,7 +16,7 @@ public final class PBXProject: PBXObject { buildConfigurationListReference = newValue.reference } get { - buildConfigurationListReference.getObject() + buildConfigurationListReference.object() } } @@ -41,7 +41,7 @@ public final class PBXProject: PBXObject { mainGroupReference = newValue.reference } get { - mainGroupReference.getObject() + mainGroupReference.object() } } @@ -54,7 +54,7 @@ public final class PBXProject: PBXObject { productsGroupReference = newValue?.reference } get { - productsGroupReference?.getObject() + productsGroupReference?.object() } } @@ -77,7 +77,7 @@ public final class PBXProject: PBXObject { } get { projectReferences.map { project in - project.mapValues { $0.getObject()! } + project.mapValues { $0.object()! } } } } @@ -117,7 +117,7 @@ public final class PBXProject: PBXObject { } get { var attributes: [PBXTarget: [String: Any]] = [:] targetAttributeReferences.forEach { - if let object: PBXTarget = $0.key.getObject() { + if let object: PBXTarget = $0.key.object() { attributes[object] = $0.value } } @@ -156,7 +156,7 @@ public final class PBXProject: PBXObject { private func setPackageReferences(_ packages: [T]) { let newReferences = packages.references() - var finalReferences: [PBXObjectReference] = packageReferences?.filter { !($0.getObject() is T) } ?? [] + var finalReferences: [PBXObjectReference] = packageReferences?.filter { !($0.object() is T) } ?? [] for reference in newReferences { if !finalReferences.contains(reference) { finalReferences.append(reference) @@ -224,7 +224,7 @@ public final class PBXProject: PBXObject { objects.add(object: buildFile) // Link the product - guard let frameworksBuildPhase = try target.frameworksBuildPhase() else { throw PBXProjError.frameworksBuildPhaseNotFound(targetName: targetName) } + guard let frameworksBuildPhase = target.frameworksBuildPhase() else { throw PBXProjError.frameworksBuildPhaseNotFound(targetName: targetName) } frameworksBuildPhase.files?.append(buildFile) return reference @@ -257,7 +257,7 @@ public final class PBXProject: PBXObject { objects.add(object: buildFile) // Link the product - guard let frameworksBuildPhase = try target.frameworksBuildPhase() else { + guard let frameworksBuildPhase = target.frameworksBuildPhase() else { throw PBXProjError.frameworksBuildPhaseNotFound(targetName: targetName) } @@ -492,10 +492,10 @@ extension PBXProject: PlistSerializable { dictionary["knownRegions"] = PlistValue.array(knownRegions .map { .string(CommentedString("\($0)")) }) } - let mainGroupObject: PBXGroup? = mainGroupReference.getObject() + let mainGroupObject: PBXGroup? = mainGroupReference.object() dictionary["mainGroup"] = .string(CommentedString(mainGroupReference.value, comment: mainGroupObject?.fileName())) if let productsGroupReference = productsGroupReference { - let productRefGroupObject: PBXGroup? = productsGroupReference.getObject() + let productRefGroupObject: PBXGroup? = productsGroupReference.object() dictionary["productRefGroup"] = .string(CommentedString(productsGroupReference.value, comment: productRefGroupObject?.fileName())) } @@ -510,7 +510,7 @@ extension PBXProject: PlistSerializable { } dictionary["targets"] = PlistValue.array(targetReferences .map { targetReference in - let target: PBXTarget? = targetReference.getObject() + let target: PBXTarget? = targetReference.object() return .string(CommentedString(targetReference.value, comment: target?.name)) }) @@ -553,9 +553,9 @@ extension PBXProject: PlistSerializable { let projectRef = reference[Xcode.ProjectReference.projectReferenceKey] else { return nil } - let producGroup: PBXGroup? = productGroupReference.getObject() + let producGroup: PBXGroup? = productGroupReference.object() let groupName = producGroup?.fileName() - let project: PBXFileElement? = projectRef.getObject() + let project: PBXFileElement? = projectRef.object() let fileRefName = project?.fileName() return [ diff --git a/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift b/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift index 238e31f9a..2c13d353d 100644 --- a/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift +++ b/Sources/XcodeProj/Objects/SwiftPackage/XCSwiftPackageProductDependency.swift @@ -11,7 +11,7 @@ public class XCSwiftPackageProductDependency: PBXContainerItem, PlistSerializabl /// Package the product dependency refers to. public var package: XCRemoteSwiftPackageReference? { get { - packageReference?.getObject() + packageReference?.object() } set { packageReference = newValue?.reference diff --git a/Sources/XcodeProj/Objects/Targets/PBXReferenceProxy.swift b/Sources/XcodeProj/Objects/Targets/PBXReferenceProxy.swift index 67363c585..d2c782cc0 100644 --- a/Sources/XcodeProj/Objects/Targets/PBXReferenceProxy.swift +++ b/Sources/XcodeProj/Objects/Targets/PBXReferenceProxy.swift @@ -15,7 +15,7 @@ public final class PBXReferenceProxy: PBXFileElement { /// Element remote. public var remote: PBXContainerItemProxy? { get { - remoteReference?.getObject() + remoteReference?.object() } set { remoteReference = newValue?.reference diff --git a/Sources/XcodeProj/Objects/Targets/PBXTarget.swift b/Sources/XcodeProj/Objects/Targets/PBXTarget.swift index 07d255493..f79c2c2e4 100644 --- a/Sources/XcodeProj/Objects/Targets/PBXTarget.swift +++ b/Sources/XcodeProj/Objects/Targets/PBXTarget.swift @@ -8,7 +8,7 @@ public class PBXTarget: PBXContainerItem { /// Build configuration list. public var buildConfigurationList: XCConfigurationList? { get { - buildConfigurationListReference?.getObject() + buildConfigurationListReference?.object() } set { buildConfigurationListReference = newValue?.reference @@ -68,7 +68,7 @@ public class PBXTarget: PBXContainerItem { /// Target product. public var product: PBXFileReference? { get { - productReference?.getObject() + productReference?.object() } set { productReference = newValue?.reference @@ -180,7 +180,7 @@ public class PBXTarget: PBXContainerItem { } dictionary["buildPhases"] = .array(buildPhaseReferences .map { (buildPhaseReference: PBXObjectReference) in - let buildPhase: PBXBuildPhase? = buildPhaseReference.getObject() + let buildPhase: PBXBuildPhase? = buildPhaseReference.object() return .string(CommentedString(buildPhaseReference.value, comment: buildPhase?.name())) }) @@ -198,7 +198,7 @@ public class PBXTarget: PBXContainerItem { dictionary["productType"] = .string(CommentedString(productType.rawValue)) } if let productReference = productReference { - let fileElement: PBXFileElement? = productReference.getObject() + let fileElement: PBXFileElement? = productReference.object() dictionary["productReference"] = .string(CommentedString(productReference.value, comment: fileElement?.fileName())) } if !packageProductDependencies.isEmpty { @@ -234,9 +234,9 @@ public extension PBXTarget { /// /// - Returns: frameworks build phase. /// - Throws: an error if the build phase cannot be obtained. - func frameworksBuildPhase() throws -> PBXFrameworksBuildPhase? { - try buildPhaseReferences - .compactMap { try $0.getThrowingObject() as? PBXBuildPhase } + func frameworksBuildPhase() -> PBXFrameworksBuildPhase? { + buildPhaseReferences + .compactMap { $0.object(as: PBXBuildPhase.self) } .filter { $0.buildPhase == .frameworks } .compactMap { $0 as? PBXFrameworksBuildPhase } .first @@ -246,9 +246,9 @@ public extension PBXTarget { /// /// - Returns: sources build phase. /// - Throws: an error if the build phase cannot be obtained. - func sourcesBuildPhase() throws -> PBXSourcesBuildPhase? { - try buildPhaseReferences - .compactMap { try $0.getThrowingObject() as? PBXBuildPhase } + func sourcesBuildPhase() -> PBXSourcesBuildPhase? { + buildPhaseReferences + .compactMap { $0.object(as: PBXBuildPhase.self) } .filter { $0.buildPhase == .sources } .compactMap { $0 as? PBXSourcesBuildPhase } .first @@ -258,22 +258,22 @@ public extension PBXTarget { /// /// - Returns: sources build phase. /// - Throws: an error if the build phase cannot be obtained. - func resourcesBuildPhase() throws -> PBXResourcesBuildPhase? { - try buildPhaseReferences - .compactMap { try $0.getThrowingObject() as? PBXResourcesBuildPhase } + func resourcesBuildPhase() -> PBXResourcesBuildPhase? { + buildPhaseReferences + .compactMap { $0.object(as: PBXResourcesBuildPhase.self) } .filter { $0.buildPhase == .resources } .first } - + /// Returns the target source files. /// /// - Returns: source files. /// - Throws: an error if something goes wrong. - func sourceFiles() throws -> [PBXFileElement] { - try sourcesBuildPhase()?.fileReferences? - .compactMap { try $0.getThrowingObject() as? PBXBuildFile } + func sourceFiles() -> [PBXFileElement] { + sourcesBuildPhase()?.fileReferences? + .compactMap { $0.object(as: PBXBuildFile.self) } .filter { $0.fileReference != nil } - .compactMap { try $0.fileReference!.getThrowingObject() as? PBXFileElement } + .compactMap { $0.fileReference!.object(as: PBXFileElement.self) } ?? [] } diff --git a/Sources/XcodeProj/Objects/Targets/PBXTargetDependency.swift b/Sources/XcodeProj/Objects/Targets/PBXTargetDependency.swift index 22603e5b3..10c8e3b70 100644 --- a/Sources/XcodeProj/Objects/Targets/PBXTargetDependency.swift +++ b/Sources/XcodeProj/Objects/Targets/PBXTargetDependency.swift @@ -13,7 +13,7 @@ public final class PBXTargetDependency: PBXObject { /// Target. public var target: PBXTarget? { get { - targetReference?.getObject() + targetReference?.object() } set { targetReference = newValue?.reference @@ -26,7 +26,7 @@ public final class PBXTargetDependency: PBXObject { /// Target proxy. public var targetProxy: PBXContainerItemProxy? { get { - targetProxyReference?.getObject() + targetProxyReference?.object() } set { targetProxyReference = newValue?.reference @@ -39,7 +39,7 @@ public final class PBXTargetDependency: PBXObject { /// Product. public var product: XCSwiftPackageProductDependency? { get { - productReference?.getObject() + productReference?.object() } set { productReference = newValue?.reference @@ -130,7 +130,7 @@ extension PBXTargetDependency: PlistSerializable { dictionary["platformFilters"] = .array(platformFilters.map { .string(.init($0)) }) } if let targetReference = targetReference { - let targetObject: PBXTarget? = targetReference.getObject() + let targetObject: PBXTarget? = targetReference.object() dictionary["target"] = .string(CommentedString(targetReference.value, comment: targetObject?.name)) } if let targetProxyReference = targetProxyReference { diff --git a/Sources/XcodeProj/Utils/ReferenceGenerator.swift b/Sources/XcodeProj/Utils/ReferenceGenerator.swift index e4a5f3da9..495076f85 100644 --- a/Sources/XcodeProj/Utils/ReferenceGenerator.swift +++ b/Sources/XcodeProj/Utils/ReferenceGenerator.swift @@ -25,7 +25,7 @@ final class ReferenceGenerator: ReferenceGenerating { /// /// - Parameter proj: project whose objects references will be generated. func generateReferences(proj: PBXProj) throws { - guard let project: PBXProject = try proj.rootObjectReference?.getThrowingObject() else { + guard let project: PBXProject = proj.rootObjectReference?.object() else { return } @@ -52,8 +52,8 @@ final class ReferenceGenerator: ReferenceGenerating { // Project references try project.projectReferences.forEach { objectReferenceDict in - guard let projectReference = objectReferenceDict[Xcode.ProjectReference.projectReferenceKey]?.getObject() as? PBXFileReference, - let productsGroup = objectReferenceDict[Xcode.ProjectReference.productGroupKey]?.getObject() as? PBXGroup else { return } + guard let projectReference: PBXFileReference = objectReferenceDict[Xcode.ProjectReference.projectReferenceKey]?.object(), + let productsGroup: PBXGroup = objectReferenceDict[Xcode.ProjectReference.productGroupKey]?.object() else { return } try generateFileReference(projectReference, identifiers: identifiers) try generateGroupReferences(productsGroup, identifiers: identifiers + [projectReference.name ?? projectReference.path ?? ""]) } @@ -63,7 +63,7 @@ final class ReferenceGenerator: ReferenceGenerating { try targets.forEach { try generateTargetReferences($0, identifiers: identifiers) } /// Configuration list - if let configurationList: XCConfigurationList = project.buildConfigurationListReference.getObject() { + if let configurationList: XCConfigurationList = project.buildConfigurationListReference.object() { try generateConfigurationListReferences(configurationList, identifiers: identifiers) } } @@ -136,7 +136,7 @@ final class ReferenceGenerator: ReferenceGenerating { // Children try group.childrenReferences.forEach { child in - guard let childFileElement: PBXFileElement = child.getObject() else { return } + guard let childFileElement: PBXFileElement = child.object() else { return } if let childGroup = childFileElement as? PBXGroup { try generateGroupReferences(childGroup, identifiers: identifiers) } else if let childFileReference = childFileElement as? PBXFileReference { @@ -297,12 +297,12 @@ final class ReferenceGenerator: ReferenceGenerating { buildPhase.fileReferences?.forEach { buildFileReference in if !buildFileReference.temporary { return } - guard let buildFile: PBXBuildFile = buildFileReference.getObject() else { return } + guard let buildFile: PBXBuildFile = buildFileReference.object() else { return } var identifiers = identifiers if let fileReference = buildFile.fileReference, - let fileReferenceObject: PBXObject = fileReference.getObject() { + let fileReferenceObject: PBXObject = fileReference.object() { identifiers.append(fileReferenceObject.reference.value) } diff --git a/Tests/XcodeProjTests/Objects/Targets/PBXAggregateTargetTests.swift b/Tests/XcodeProjTests/Objects/Targets/PBXAggregateTargetTests.swift index d16bfd075..bf02a74fe 100644 --- a/Tests/XcodeProjTests/Objects/Targets/PBXAggregateTargetTests.swift +++ b/Tests/XcodeProjTests/Objects/Targets/PBXAggregateTargetTests.swift @@ -47,11 +47,11 @@ final class PBXAggregateTargetTests: XCTestCase { objects.add(object: target) objects.add(object: dependency) _ = try target.addDependency(target: dependency) - let targetDependency: PBXTargetDependency? = target.dependencyReferences.first?.getObject() + let targetDependency: PBXTargetDependency? = target.dependencyReferences.first?.object() XCTAssertEqual(targetDependency?.name, "Dependency") XCTAssertEqual(targetDependency?.targetReference, dependency.reference) - let containerItemProxy: PBXContainerItemProxy? = targetDependency?.targetProxyReference?.getObject() + let containerItemProxy: PBXContainerItemProxy? = targetDependency?.targetProxyReference?.object() XCTAssertEqual(containerItemProxy?.containerPortalReference, project.reference) XCTAssertEqual(containerItemProxy?.remoteGlobalID?.uuid, dependency.reference.value) XCTAssertEqual(containerItemProxy?.proxyType, .nativeTarget) diff --git a/Tests/XcodeProjTests/Objects/Targets/PBXNativeTargetTests.swift b/Tests/XcodeProjTests/Objects/Targets/PBXNativeTargetTests.swift index 5dd690fe5..e5f46bb09 100644 --- a/Tests/XcodeProjTests/Objects/Targets/PBXNativeTargetTests.swift +++ b/Tests/XcodeProjTests/Objects/Targets/PBXNativeTargetTests.swift @@ -48,11 +48,11 @@ final class PBXNativeTargetTests: XCTestCase { objects.add(object: target) objects.add(object: dependency) _ = try target.addDependency(target: dependency) - let targetDependency: PBXTargetDependency? = target.dependencyReferences.first?.getObject() + let targetDependency: PBXTargetDependency? = target.dependencyReferences.first?.object() XCTAssertEqual(targetDependency?.name, "Dependency") XCTAssertEqual(targetDependency?.targetReference, dependency.reference) - let containerItemProxy: PBXContainerItemProxy? = targetDependency?.targetProxyReference?.getObject() + let containerItemProxy: PBXContainerItemProxy? = targetDependency?.targetProxyReference?.object() XCTAssertEqual(containerItemProxy?.containerPortalReference, project.reference) XCTAssertEqual(containerItemProxy?.remoteGlobalID?.uuid, dependency.reference.value) XCTAssertEqual(containerItemProxy?.proxyType, .nativeTarget) diff --git a/Tests/XcodeProjTests/Project/XcodeProjTests.swift b/Tests/XcodeProjTests/Project/XcodeProjTests.swift index 3f4a81948..44d50517d 100644 --- a/Tests/XcodeProjTests/Project/XcodeProjTests.swift +++ b/Tests/XcodeProjTests/Project/XcodeProjTests.swift @@ -33,7 +33,7 @@ final class XcodeProjIntegrationTests: XCTestCase { // When let pbxprojFromData = try PBXProj(data: pbxprojData) - try pbxprojFromData.updateProjectName(path: pbxprojPath) + pbxprojFromData.updateProjectName(path: pbxprojPath) // Then XCTAssertEqual(pbxprojFromData, pbxprojFromDisk) diff --git a/Tests/XcodeProjTests/Utils/ObjectReferenceTests.swift b/Tests/XcodeProjTests/Utils/ObjectReferenceTests.swift index b17ef6999..b56c68d04 100644 --- a/Tests/XcodeProjTests/Utils/ObjectReferenceTests.swift +++ b/Tests/XcodeProjTests/Utils/ObjectReferenceTests.swift @@ -9,9 +9,9 @@ class ObjectReferenceTests: XCTestCase { func test_reference_cachesObject() { let reference = PBXObjectReference() let object = PBXFileReference() - XCTAssertNil(reference.getObject()) + XCTAssertNil(reference.object()) reference.setObject(object) - XCTAssertEqual(object, reference.getObject()) + XCTAssertEqual(object, reference.object()) } func test_reference_fetches() { @@ -19,7 +19,7 @@ class ObjectReferenceTests: XCTestCase { object.reference.fix("a") let objects = PBXObjects(objects: [object]) let reference = PBXObjectReference("a", objects: objects) - XCTAssertEqual(object, reference.getObject()) + XCTAssertEqual(object, reference.object()) } func test_reference_handleReferenceChange() { diff --git a/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift b/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift index 08a3f9760..6528dd76d 100644 --- a/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift +++ b/Tests/XcodeProjTests/Utils/ReferenceGeneratorTests.swift @@ -48,7 +48,7 @@ class ReferenceGeneratorTests: XCTestCase { let referenceGenerator = ReferenceGenerator(outputSettings: PBXOutputSettings()) try referenceGenerator.generateReferences(proj: project) - return [remoteProjectFileReference, containerItemProxy, productReferenceProxy, productsGroup, buildFile, pluginDependency.productReference!.getObject()!] + return [remoteProjectFileReference, containerItemProxy, productReferenceProxy, productsGroup, buildFile, pluginDependency.productReference!.object()!] .map { $0.reference.value } } @@ -143,7 +143,7 @@ private extension PBXProj { let packageReference = XCRemoteSwiftPackageReference(repositoryURL: "repository") let packageDependency = XCSwiftPackageProductDependency(productName: "product", package: packageReference, isPlugin: true) let targetDependency = PBXTargetDependency(product: packageDependency) - add(object: targetDependency.productReference!.getObject()!) + add(object: targetDependency.productReference!.object()!) return targetDependency }