swiftlang / swift-syntax

A set of Swift libraries for parsing, inspecting, generating, and transforming Swift source code.
Apache License 2.0
3.26k stars 415 forks source link

[macros] Further improve specializing generics in macros #2476

Open ktoso opened 9 months ago

ktoso commented 9 months ago

Description

In https://github.com/apple/swift-syntax/pull/2450 we introduced

@freestanding(expression)
public macro checkGeneric_root<DAS>() = #externalMacro(module: "MacroDefinition", type: "GenericToVoidMacro")

@freestanding(expression)
public macro checkGeneric<DAS>() = #checkGeneric_root<DAS>()

such that the DAS gets replaced in every expansion:

checkGeneric<String> -> checkGeneric_root<String>

but the following cases are not replaced yet:

Would it make sense to specialize macros with types that aren’t part of the second-level macro? Ie. would the following make sense?

macro gen<T>(a: T) = #externalMacro …
macro genString(a: String) = #gen<String>(a: a)

And then #genString(a: "x") would have the intermediate expansion step #gen(a: "x")


Similarly, would it make sense to allow generic nesting in a second-level macro definition? Ie. would something like the following make sense?

macro gen<T>(a: T) = #externalMacro …
macro genArray<T>(a: [T]) = #gen<Array<T>>(a: a)

And then #genArray(a: [1]) would have the intermediate expansion step #gen<Array>(a: [1])


https://github.com/apple/swift-syntax/pull/2450#discussion_r1479217425

Steps to Reproduce

No response

Radar

rdar://122364628

AppAppWorks commented 3 months ago

I wanted to work on this issue but I had difficulties understanding what exactly the issue is. May anyone familiar with the issue give a brief explanation for me?