Skip to content

Commit 8df91a8

Browse files
committed
[Macros] Add simplistic MacroExpansionContext.createUniqueLocalName()
1 parent 1453e76 commit 8df91a8

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

Sources/_SwiftSyntaxMacros/MacroExpansionContext.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,23 @@ public struct MacroExpansionContext {
2525
/// name, so the combination of file and module name is unique.
2626
public let fileName: String
2727

28+
/// Counter used to generate names local to the macro.
29+
var localNameCounter = 0
30+
2831
/// Create a new macro evaluation context.
2932
public init(moduleName: String, fileName: String) {
3033
self.moduleName = moduleName
3134
self.fileName = fileName
3235
}
3336

37+
/// Generate a unique local name for use in the macro.
38+
public mutating func createUniqueLocalName() -> TokenSyntax {
39+
let name = "__macro_local_\(localNameCounter)"
40+
let token = TokenSyntax(.identifier(name), presence: .present)
41+
localNameCounter += 1
42+
return token
43+
}
44+
3445
/// Create a new macro evaluation context.
3546
@available(*, deprecated, message: "Use init(moduleName:fileName:)")
3647
public init(

Tests/SwiftSyntaxMacrosTest/MacroSystemTests.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,15 @@ final class MacroSystemTests: XCTestCase {
152152
"""
153153
)
154154
}
155+
156+
func testContextUniqueLocalNames() {
157+
var context = MacroExpansionContext(
158+
moduleName: "MyModule", fileName: "taylor.swift"
159+
)
160+
161+
let t1 = context.createUniqueLocalName()
162+
let t2 = context.createUniqueLocalName()
163+
XCTAssertNotEqual(t1.description, t2.description)
164+
XCTAssertEqual(t1.description, "__macro_local_0")
165+
}
155166
}

0 commit comments

Comments
 (0)