我创建了一个示例宏注释来测试我是否可以正确匹配案例类 TypeDef 以便稍后修改它,但它不匹配,尽管一切看起来都很好并且可以编译,如下所示:
import scala.annotation.{MacroAnnotation, experimental}
import scala.quoted.*
object Macros:
@experimental
class table extends MacroAnnotation:
def transform(using Quotes)(tree: quotes.reflect.Definition): List[quotes.reflect.Definition] =
import quotes.reflect.*
tree match
case td @ TypeDef(_, _) =>
report.error(s"from macro annotation1 ${td.symbol}")
List(tree)
case _ =>
report.error(s"from macro annotation2 $tree")
List(tree)
我应用它的示例案例类:
@experimental @table
case class Person(firstName: String, lastName: String)
它总是运行第二条消息,这意味着我无法匹配 TypeDef。
我缺少什么?还需要进一步进口吗?
也尝试过tree.isInstanceOf[TypeDef]}
,这按预期返回 true,这使得理解匹配失败的原因变得更加复杂。
如果你检查树结构,
Printer.TreeStructure.show(tree)
你会发现 Person 是 ClassDef。然后以下代码将在第一臂上匹配如果您在类中添加类型定义,则会找到 TypeDef
Person
。例子
TreeStructure.show 输出