Skip to content

Commit 58d9aa7

Browse files
committed
-
1 parent 39bedd1 commit 58d9aa7

5 files changed

Lines changed: 77 additions & 21 deletions

File tree

Sources/PrincipleMacros/Parameters/ParameterExtractor.swift

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,13 +165,15 @@ extension ParameterExtractor {
165165
return .nonisolated(trimmedModifer: isolation)
166166
}
167167

168-
if let memberAccessExpression = MemberAccessExprSyntax(expression),
169-
let explicitType = memberAccessExpression.base?.inferredType,
170-
memberAccessExpression.referencesBaseType {
171-
return .isolated(standardizedType: explicitType.standardized)
168+
guard let memberAccessExpression = MemberAccessExprSyntax(expression),
169+
let globalActorType = memberAccessExpression.baseTypeReference
170+
else {
171+
throw ParameterExtractionError.unexpectedSyntaxType
172172
}
173173

174-
throw ParameterExtractionError.unexpectedSyntaxType
174+
return .isolated(
175+
standardizedType: globalActorType.standardized
176+
)
175177
}
176178

177179
public func requiredGlobalActorIsolation(
@@ -183,3 +185,31 @@ extension ParameterExtractor {
183185
return isolation
184186
}
185187
}
188+
189+
extension ParameterExtractor {
190+
191+
public func type(
192+
withLabel label: TokenSyntax?
193+
) throws -> TypeSyntax? {
194+
guard let expression = expression(withLabel: label) else {
195+
return nil
196+
}
197+
198+
guard let memberAccessExpression = MemberAccessExprSyntax(expression),
199+
let type = memberAccessExpression.baseTypeReference
200+
else {
201+
throw ParameterExtractionError.unexpectedSyntaxType
202+
}
203+
204+
return type
205+
}
206+
207+
public func requiredType(
208+
withLabel label: TokenSyntax?
209+
) throws -> TypeSyntax {
210+
guard let type = try type(withLabel: label) else {
211+
throw ParameterExtractionError.missingRequirement
212+
}
213+
return type
214+
}
215+
}

Sources/PrincipleMacros/Syntax/Extensions/ExprSyntax.swift

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,10 @@ extension StringLiteralExprSyntax {
6666
extension OptionalChainingExprSyntax {
6767

6868
public var inferredType: TypeSyntax? {
69-
guard let inferredWrappedType else {
70-
return nil
69+
if let inferredWrappedType {
70+
return "Optional<\(inferredWrappedType)>"
7171
}
72-
return "Optional<\(inferredWrappedType)>"
72+
return nil
7373
}
7474

7575
public var inferredWrappedType: TypeSyntax? {
@@ -80,10 +80,10 @@ extension OptionalChainingExprSyntax {
8080
extension ArrayExprSyntax {
8181

8282
public var inferredType: TypeSyntax? {
83-
guard let inferredElementType else {
84-
return nil
83+
if let inferredElementType {
84+
return "Array<\(inferredElementType)>"
8585
}
86-
return "Array<\(inferredElementType)>"
86+
return nil
8787
}
8888

8989
public var inferredElementType: TypeSyntax? {
@@ -94,10 +94,10 @@ extension ArrayExprSyntax {
9494
extension DictionaryExprSyntax {
9595

9696
public var inferredType: TypeSyntax? {
97-
guard let inferredKeyType, let inferredValueType else {
98-
return nil
97+
if let inferredKeyType, let inferredValueType {
98+
return "Dictionary<\(inferredKeyType), \(inferredValueType)>"
9999
}
100-
return "Dictionary<\(inferredKeyType), \(inferredValueType)>"
100+
return nil
101101
}
102102

103103
public var inferredKeyType: TypeSyntax? {
@@ -129,10 +129,10 @@ extension FunctionCallExprSyntax {
129129
extension GenericSpecializationExprSyntax {
130130

131131
public var inferredType: TypeSyntax? {
132-
guard let inferredType = expression.inferredType else {
133-
return nil
132+
if let inferredType = expression.inferredType {
133+
return "\(inferredType)\(genericArgumentClause.standardized)"
134134
}
135-
return "\(inferredType)\(genericArgumentClause.standardized)"
135+
return nil
136136
}
137137
}
138138

@@ -148,8 +148,11 @@ extension MemberAccessExprSyntax {
148148
return first
149149
}
150150

151-
public var referencesBaseType: Bool {
152-
declName.baseName.tokenKind == .keyword(.self)
151+
public var baseTypeReference: TypeSyntax? {
152+
if let base, declName.baseName.tokenKind == .keyword(.self) {
153+
return "\(base.trimmed)"
154+
}
155+
return nil
153156
}
154157
}
155158

Sources/PrincipleMacros/Syntax/Extensions/IfConfigDeclSyntax+Availability.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ extension IfConfigDeclSyntax {
3434

3535
extension IfConfigClauseSyntax {
3636

37-
var availability: Self? {
37+
public var availability: Self? {
3838
if let availability = elements?.availability {
3939
with(\.elements, availability)
4040
} else {

Tests/PrincipleMacrosTests/Parameters/ParameterExtractorTests.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,26 @@ extension ParameterExtractorTests {
143143
}
144144
}
145145
}
146+
147+
extension ParameterExtractorTests {
148+
149+
@Test(
150+
arguments: [
151+
"MyType",
152+
"SomeType.MyType"
153+
]
154+
)
155+
func typeExtraction(_ type: String) throws {
156+
let extractor = try makeExtractor(from: "#MyMacro(type: \(raw: type).self)")
157+
let extracted = try extractor.type(withLabel: "type")
158+
#expect(extracted?.trimmedDescription == type)
159+
}
160+
161+
@Test
162+
func unexpectedSyntaxWhenPerformingTypeExtraction() throws {
163+
let extractor = try makeExtractor(from: #"#MyMacro(type: MainActor.Type)"#)
164+
#expect(throws: ParameterExtractionError.unexpectedSyntaxType) {
165+
try extractor.type(withLabel: "type")
166+
}
167+
}
168+
}

Tests/PrincipleMacrosTests/Syntax/Extensions/ClassDeclSyntaxTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Testing
1212
internal struct ClassDeclSyntaxTests {
1313

1414
@Test
15-
func withoutInheritenceClause() throws {
15+
func withoutInheritanceClause() throws {
1616
let decl: DeclSyntax = "class MyClass {}"
1717
let classDecl = try #require(decl.as(ClassDeclSyntax.self))
1818
let inferredSuperclass = classDecl.inferredSuperclass()

0 commit comments

Comments
 (0)