我想用宏转换 Scala XML 文字。(不是带有 XML 的字符串文字,而是实际的 XML 文字)。据我了解,XML 文字实际上并没有在 AST 级别上内置到语言中,而是在解析器中脱糖。有趣的是,这确实有效:
case q"<specificTag></specificTag>" => ... // succeeds for specificTag with no
// attributes and children
但很明显,这完全没用,因为不可能以这种方式匹配任意 xml。就像是
case q"<$prefix:$label ..$attrs>$children</$prefix:$label>" => ...
不能工作,因为我们必须在一个模式中绑定同一个变量两次。
打印出这种 xml 文字表达式的树实际上给出了脱糖版本。例如。
new _root_.scala.xml.Elem(null,"specificTag",_root_.scala.xml.Null,$scope,false)
但试图匹配这个失败:
case q"new _root_.scala.xml.Elem(..$params)" => ... // never succeeds
我很困惑!我的问题是:有没有办法可靠地匹配 scala 宏中的任意 xml litarals?另外:为什么它们在 quasiquotes 中支持常量 xml 而不是脱糖值?