我创建了一个示例宏注解来测试我是否可以正确匹配case类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,这使得理解为什么匹配不起作用变得更加复杂。
1条答案
按热度按时间px9o7tmv1#
如果你用
Printer.TreeStructure.show(tree)
检查树结构,你会看到Person是ClassDef。然后下面的代码将匹配第一个臂如果在
Person
类中添加类型定义,则会找到TypeDef。例如
TreeStructure.show输出