diff --git a/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift b/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift index 7fe8141..66ac5f1 100644 --- a/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift +++ b/Sources/PrincipleMacros/Syntax/Extensions/WithModifiersSyntax.swift @@ -21,12 +21,27 @@ extension WithModifiersSyntax { TokenKind.typeScopeSpecifiers.contains(name.tokenKind) } } +} + +extension WithModifiersSyntax { public var accessControlLevel: TokenSyntax? { - modifiers.lazy.map(\.name).first { name in - TokenKind.accessControlLevels.contains(name.tokenKind) - } + accessControlLevel(detail: nil) + } + + public var setterAccessControlLevel: TokenSyntax? { + accessControlLevel(detail: .identifier("set")) ?? accessControlLevel + } + + private func accessControlLevel(detail: TokenKind?) -> TokenSyntax? { + modifiers.lazy + .filter { $0.detail?.detail.tokenKind == detail } + .map(\.name) + .first { TokenKind.accessControlLevels.contains($0.tokenKind) } } +} + +extension WithModifiersSyntax { public func accessControlLevel( inheritedBy inheritingDeclaration: InheritingDeclaration, diff --git a/Tests/PrincipleMacrosTests/Parsers/PropertiesParserTests.swift b/Tests/PrincipleMacrosTests/Parsers/PropertiesParserTests.swift index 4c3d292..f2c54dc 100644 --- a/Tests/PrincipleMacrosTests/Parsers/PropertiesParserTests.swift +++ b/Tests/PrincipleMacrosTests/Parsers/PropertiesParserTests.swift @@ -17,12 +17,13 @@ internal struct PropertiesParserTests { @Test func testStoredLet() throws { let decl: DeclSyntax = """ - public static let myLet: Int? + public internal(set) static let myLet: Int? """ let property = try #require(PropertiesParser.parse(declaration: decl, in: context).first) #expect(property.kind == .stored) #expect(property.mutability == .immutable) #expect(property.accessControlLevel?.trimmedDescription == "public") + #expect(property.setterAccessControlLevel?.trimmedDescription == "internal") #expect(property.typeScopeSpecifier?.trimmedDescription == "static") #expect(property.trimmedName.description == "myLet") #expect(property.inferredType.description == "Optional") @@ -33,12 +34,13 @@ internal struct PropertiesParserTests { @Test func testStoredVar() throws { let decl: DeclSyntax = """ - private var myVar = "Hello, world!" + private(set) var myVar = "Hello, world!" """ let property = try #require(PropertiesParser.parse(declaration: decl, in: context).first) #expect(property.kind == .stored) #expect(property.mutability == .mutable) - #expect(property.accessControlLevel?.trimmedDescription == "private") + #expect(property.accessControlLevel == nil) + #expect(property.setterAccessControlLevel?.trimmedDescription == "private") #expect(property.typeScopeSpecifier == nil) #expect(property.trimmedName.description == "myVar") #expect(property.inferredType.description == "String") @@ -58,6 +60,7 @@ internal struct PropertiesParserTests { #expect(property.kind == .stored) #expect(property.mutability == .mutable) #expect(property.accessControlLevel == nil) + #expect(property.setterAccessControlLevel == nil) #expect(property.typeScopeSpecifier?.trimmedDescription == "class") #expect(property.trimmedName.description == "myObservedVar") #expect(property.inferredType.description == "UIView.Constraint") @@ -77,6 +80,7 @@ internal struct PropertiesParserTests { #expect(property.kind == .computed) #expect(property.mutability == .immutable) #expect(property.accessControlLevel?.trimmedDescription == "fileprivate") + #expect(property.setterAccessControlLevel?.trimmedDescription == "fileprivate") #expect(property.typeScopeSpecifier == nil) #expect(property.trimmedName.description == "myComputedVar") #expect(property.inferredType.description == "Array") @@ -96,6 +100,7 @@ internal struct PropertiesParserTests { #expect(property.kind == .computed) #expect(property.mutability == .mutable) #expect(property.accessControlLevel == nil) + #expect(property.setterAccessControlLevel == nil) #expect(property.typeScopeSpecifier?.trimmedDescription == "static") #expect(property.trimmedName.description == "mySettableVar") #expect(property.inferredType.description == "Optional>")