-
Notifications
You must be signed in to change notification settings - Fork 465
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
Description
I have the following two functions that should produce identical results:
asSyntaxSimplecreates two different function expressions based on whethertexthas a value.asSyntaxAdvancedcreates a function expression usesaddArgumentto add an argument if needed.
struct Node {
var name: String?
var text: String?
func asSyntaxSimple() -> ExprSyntax {
if let text = text {
return ".init(\(literal: name), text: \(literal: text))"
} else {
return ".init(\(literal: name))"
}
}
func asSyntaxAdvanced() -> ExprSyntax {
var syntax = (".init(\(literal: name))" as ExprSyntax).cast(FunctionCallExprSyntax.self)
if let text = text {
syntax = syntax.addArgument(.init(label: "text", expression: StringLiteralExprSyntax(content: text)))
}
return syntax.cast(ExprSyntax.self)
}
}When testing with assertMacroExpansion, the function with addArgument fails to insert the comma between the existing argument and the new one. It similarly fails when calling addArgument multiple times.
Steps to Reproduce
Test the following code:
import XCTest
import SwiftSyntaxMacrosTestSupport
import SwiftSyntax
import SwiftSyntaxMacros
struct Node {
var name: String?
var text: String?
func asSyntaxSimple() -> ExprSyntax {
if let text = text {
return ".init(\(literal: name), text: \(literal: text))"
} else {
return ".init(\(literal: name))"
}
}
func asSyntaxAdvanced() -> ExprSyntax {
var syntax = (".init(\(literal: name))" as ExprSyntax).cast(FunctionCallExprSyntax.self)
if let text = text {
syntax = syntax.addArgument(.init(label: "text", expression: StringLiteralExprSyntax(content: text)))
}
return syntax.cast(ExprSyntax.self)
}
}
public struct NodeSimple: ExpressionMacro {
public static func expansion(
of node: some FreestandingMacroExpansionSyntax,
in context: some MacroExpansionContext
) -> ExprSyntax {
return Node(name: "NAME", text: "TEXT").asSyntaxSimple()
}
}
public struct NodeAdvanced: ExpressionMacro {
public static func expansion(
of node: some FreestandingMacroExpansionSyntax,
in context: some MacroExpansionContext
) -> ExprSyntax {
return Node(name: "NAME", text: "TEXT").asSyntaxAdvanced()
}
}
final class AddArgumentsTests: XCTestCase {
func testSimple() throws {
assertMacroExpansion(
"#NodeSimple",
expandedSource: #".init("NAME", text: "TEXT")"#,
macros: [
"NodeSimple": NodeSimple.self,
])
}
func testAdvanced() throws {
assertMacroExpansion(
"#NodeAdvanced",
expandedSource: #".init("NAME", text: "TEXT")"#,
macros: [
"NodeAdvanced": NodeAdvanced.self,
])
}
}testAdvanced fails with the following error:
failed - Actual output (+) differed from expected output (-):
–.init("NAME", text: "TEXT")
+.init("NAME" text: "TEXT")
Actual expanded source:
.init("NAME" text: "TEXT")
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working