From 635675b7f6152b7c30b81ebd2e43472b1aab814f Mon Sep 17 00:00:00 2001 From: mlch911 Date: Fri, 2 Aug 2024 16:36:53 +0800 Subject: [PATCH 1/2] fix optional type set before get # Conflicts: # Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift --- .../AssociatedObjectMacro.swift | 32 +++++++++++++------ .../AssociatedObjectTests.swift | 1 + 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift b/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift index 745e383..a31fda3 100644 --- a/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift +++ b/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift @@ -208,7 +208,8 @@ extension AssociatedObjectMacro: AccessorMacro { identifier: identifier, type: type, policy: policy, - associatedKey: associatedKey, + associatedKey: associatedKey, + hasDefaultValue: defaultValue != nil, willSet: binding.willSet, didSet: binding.didSet ) @@ -306,6 +307,7 @@ extension AssociatedObjectMacro { type: TypeSyntax, policy: ExprSyntax, associatedKey: ExprSyntax, + hasDefaultValue: Bool, `willSet`: AccessorDeclSyntax?, `didSet`: AccessorDeclSyntax? ) -> AccessorDeclSyntax { @@ -328,14 +330,26 @@ extension AssociatedObjectMacro { "let oldValue = \(identifier)" } - """ - setAssociatedObject( - self, - \(associatedKey), - newValue, - \(policy) - ) - """ + if type.isOptional, hasDefaultValue { + """ + setAssociatedObject( + self, + \(associatedKey), + newValue, + \(policy) + ) + self.__associated_\(identifier.trimmed)IsSet = true + """ + } else { + """ + setAssociatedObject( + self, + \(associatedKey), + newValue, + \(policy) + ) + """ + } if let didSet = `didSet`, let body = didSet.body { diff --git a/Tests/AssociatedObjectTests/AssociatedObjectTests.swift b/Tests/AssociatedObjectTests/AssociatedObjectTests.swift index fc60e75..1c8a2de 100644 --- a/Tests/AssociatedObjectTests/AssociatedObjectTests.swift +++ b/Tests/AssociatedObjectTests/AssociatedObjectTests.swift @@ -385,6 +385,7 @@ final class AssociatedObjectTests: XCTestCase { newValue, .retain(.nonatomic) ) + self.__associated_stringIsSet = true } } From 4219b7846ebc2d82380d9126a39c960e79927763 Mon Sep 17 00:00:00 2001 From: mlch911 Date: Thu, 28 Nov 2024 17:20:00 +0800 Subject: [PATCH 2/2] Update Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift Co-authored-by: p-x9 --- .../AssociatedObjectMacro.swift | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift b/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift index a31fda3..4b7ef4e 100644 --- a/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift +++ b/Sources/AssociatedObjectPlugin/AssociatedObjectMacro.swift @@ -330,24 +330,17 @@ extension AssociatedObjectMacro { "let oldValue = \(identifier)" } + """ + setAssociatedObject( + self, + \(associatedKey), + newValue, + \(policy) + ) + """ if type.isOptional, hasDefaultValue { """ - setAssociatedObject( - self, - \(associatedKey), - newValue, - \(policy) - ) - self.__associated_\(identifier.trimmed)IsSet = true - """ - } else { - """ - setAssociatedObject( - self, - \(associatedKey), - newValue, - \(policy) - ) + self.__associated_\(identifier.trimmed)IsSet = true """ }