diff --git a/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilder.swift b/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilder.swift index 18710c0..a836cf0 100644 --- a/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilder.swift +++ b/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilder.swift @@ -20,19 +20,26 @@ extension DeclBuilder { public var inheritedAccessControlLevel: TokenSyntax? { let settings = settings.accessControlLevel - return basicDeclaration.accessControlLevel( + return basicDeclaration.inlinableAccessControlLevel( inheritedBy: settings.inheritingDeclaration, maxAllowed: settings.maxAllowed ) } +} + +extension DeclBuilder { public var inheritedGlobalActorIsolation: GlobalActorIsolation? { - if let preferred = settings.preferredGlobalActorIsolation { - return preferred + if let explicit = settings.explicitGlobalActorIsolation { + return explicit } - if let inferredType = basicDeclaration.globalActor?.attributeName.trimmed { - return .isolated(trimmedType: inferredType) + if let inherited = basicDeclaration.globalActor?.attributeName { + return .isolated(trimmedType: inherited.trimmed) } return .nonisolated } + + public var inheritedGlobalActorAttribute: AttributeSyntax? { + inheritedGlobalActorIsolation?.inlinableAttribute + } } diff --git a/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilderSettings.swift b/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilderSettings.swift index 1c81b02..bc48e4a 100644 --- a/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilderSettings.swift +++ b/Sources/PrincipleMacros/Builders/Declarations/Common/DeclBuilderSettings.swift @@ -11,14 +11,14 @@ import SwiftSyntax public struct DeclBuilderSettings { public var accessControlLevel: AccessControlLevel - public var preferredGlobalActorIsolation: GlobalActorIsolation? + public var explicitGlobalActorIsolation: GlobalActorIsolation? public init( accessControlLevel: AccessControlLevel, - preferredGlobalActorIsolation: GlobalActorIsolation? = nil + explicitGlobalActorIsolation: GlobalActorIsolation? = nil ) { self.accessControlLevel = accessControlLevel - self.preferredGlobalActorIsolation = preferredGlobalActorIsolation + self.explicitGlobalActorIsolation = explicitGlobalActorIsolation } } diff --git a/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilder.swift b/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilder.swift index 36e81bb..10bf2ba 100644 --- a/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilder.swift +++ b/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilder.swift @@ -22,10 +22,10 @@ extension TypeDeclBuilder { extension TypeDeclBuilder { - public var trimmedTypeName: TypeSyntax { + public var trimmedType: TypeSyntax { switch TypeDeclBuilderContext.current { - case let .extension(extendedType): - extendedType.trimmed + case let .extension(trimmedType): + trimmedType case .declaration: "\(typeDeclaration.name.trimmed)" } @@ -33,7 +33,7 @@ extension TypeDeclBuilder { public func buildExtension(of extendedType: some TypeSyntaxProtocol) throws -> MemberBlockSyntax { try TypeDeclBuilderContext.$current.withValue( - .extension(TypeSyntax(extendedType)), + .extension(trimmedType: TypeSyntax(extendedType.trimmed)), operation: { try MemberBlockSyntax( members: MemberBlockItemListSyntax( diff --git a/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilderContext.swift b/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilderContext.swift index fa57d6e..19fa5d3 100644 --- a/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilderContext.swift +++ b/Sources/PrincipleMacros/Builders/Declarations/Types/TypeDeclBuilderContext.swift @@ -11,7 +11,7 @@ import SwiftSyntax internal enum TypeDeclBuilderContext { case declaration - case `extension`(TypeSyntax) + case `extension`(trimmedType: TypeSyntax) } extension TypeDeclBuilderContext { diff --git a/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift b/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift index 8157f6a..a0779cf 100644 --- a/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift +++ b/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift @@ -43,7 +43,7 @@ extension WithModifiersSyntax { extension WithModifiersSyntax { - public func accessControlLevel( + public func inlinableAccessControlLevel( inheritedBy inheritingDeclaration: InheritingDeclaration, maxAllowed: Keyword ) -> TokenSyntax? { diff --git a/Sources/PrincipleMacros/Syntax/Helpers/GlobalActorIsolation.swift b/Sources/PrincipleMacros/Syntax/Helpers/GlobalActorIsolation.swift index 6c116a8..e8a60fa 100644 --- a/Sources/PrincipleMacros/Syntax/Helpers/GlobalActorIsolation.swift +++ b/Sources/PrincipleMacros/Syntax/Helpers/GlobalActorIsolation.swift @@ -15,19 +15,18 @@ public enum GlobalActorIsolation: Hashable { public var trimmedType: TypeSyntax? { switch self { - case let .isolated(type): - type + case let .isolated(trimmedType): + trimmedType case .nonisolated: nil } } - public var trimmedAttribute: AttributeSyntax? { + public var inlinableAttribute: AttributeSyntax? { guard let trimmedType else { return nil } - return AttributeSyntax( - attributeName: trimmedType - ) + let attribute = AttributeSyntax(attributeName: trimmedType) + return attribute.withTrailingSpace } } diff --git a/Tests/PrincipleMacrosTests/Parameters/ParameterExtractorTests.swift b/Tests/PrincipleMacrosTests/Parameters/ParameterExtractorTests.swift index 0f11359..06d205f 100644 --- a/Tests/PrincipleMacrosTests/Parameters/ParameterExtractorTests.swift +++ b/Tests/PrincipleMacrosTests/Parameters/ParameterExtractorTests.swift @@ -100,7 +100,7 @@ extension ParameterExtractorTests { func testIsolatedPreferredGlobalActorExtraction(isolation: String) throws { let extractor = try makeExtractor(from: "#MyMacro(isolation: \(raw: isolation).self)") let extracted = try extractor.preferredGlobalActorIsolation(withLabel: "isolation") - #expect(extracted?.trimmedAttribute?.description == "@\(isolation)") + #expect(extracted?.trimmedType?.description == isolation) } @Test