Skip to content

Commit fa83bf5

Browse files
committed
MacroSystem should qualify nested types when expanding extension macros
Resolves rdar://119850970.
1 parent 184930a commit fa83bf5

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

Sources/SwiftSyntaxMacroExpansion/MacroSystem.swift

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,25 @@ private func expandExtensionMacro(
320320
indentationWidth: Trivia
321321
) throws -> CodeBlockItemListSyntax? {
322322
let extendedType: TypeSyntax
323-
if let identified = attachedTo.asProtocol(NamedDeclSyntax.self) {
324-
extendedType = "\(identified.name.trimmed)"
325-
} else if let ext = attachedTo.as(ExtensionDeclSyntax.self) {
323+
if let ext = attachedTo.as(ExtensionDeclSyntax.self) {
326324
extendedType = "\(ext.extendedType.trimmed)"
325+
} else if let identified = attachedTo.asProtocol(NamedDeclSyntax.self) {
326+
var types: [TokenSyntax] = []
327+
types.append(identified.name.trimmed)
328+
329+
var possibleParent = attachedTo.parent
330+
while let parent = possibleParent {
331+
possibleParent = parent.parent
332+
if let parent = parent.asProtocol(NamedDeclSyntax.self) {
333+
types.append(parent.name.trimmed)
334+
}
335+
}
336+
337+
var baseType: TypeSyntax = TypeSyntax(IdentifierTypeSyntax(name: types.popLast()!))
338+
for type in types.reversed() {
339+
baseType = TypeSyntax(MemberTypeSyntax(baseType: baseType, name: type))
340+
}
341+
extendedType = baseType
327342
} else {
328343
return nil
329344
}

Tests/SwiftSyntaxMacroExpansionTest/ExtensionMacroTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ final class ExtensionMacroTests: XCTestCase {
9999
}
100100
}
101101
102-
extension MyType: Sendable {
102+
extension Wrapper.MyType: Sendable {
103103
}
104104
""",
105105
macros: ["AddSendableExtension": SendableExtensionMacro.self],

0 commit comments

Comments
 (0)