有一个现有的宏可以获取默认字段的列表及其值https://github.com/lampepfl/dotty-macro-examples/blob/main/defaultParamsInference/src/macro.scala,但是,如果您尝试使用它来获取类型化类的默认字段,则会抛出Assert错误:
[error] |Exception occurred while executing macro expansion.
[error] |java.lang.AssertionError: assertion failed
[error] | at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11)
[error] | at scala.quoted.runtime.impl.QuotesImpl$reflect$Ref$.apply(QuotesImpl.scala:435)
[error] | at scala.quoted.runtime.impl.QuotesImpl$reflect$Ref$.apply(QuotesImpl.scala:434)
[error] | at defaultParamsImpl(Decoder.scala:126)
如何修复它?它在一行中抛出:val mod = Ref(sym.companionModule)
1条答案
按热度按时间oprakyz71#
假设我们有
首先,
TypeTree.of[T].symbol
为B
生成class B
,而为一般A
生成val <none>
。因此,将TypeTree.of[T].symbol
替换为TypeRepr.of[T].typeSymbol
。其次,对于其伴随对象中的泛型
A
,<init>$default$N
方法也是泛型的。因此,您需要将mod.select(deff.symbol)
应用于类型参数(否则将部分应用术语mod.select(deff.symbol)
)。完整的代码:
测试:
Scala 3.1.3。
另请参阅Type Class Derivation accessing default values