假设我正在使用 Scala 3 反射来反思这个类:
class Foo[T](val thing: T):
var store: Option[T] = None
假设我用给定的类型 Foo[Boolean] 进行反映,并且我得到此类的 TypeRef 如下:
AppliedType(TypeRef(TermRef(TermRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object co),object blocke),object scala_reflection),class Foo),List(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class <root>)),object scala),class Boolean)))
到目前为止,一切都很好。我可以进一步反思构造函数字段,并看到“thing”被正确应用为布尔值。
我在哪里可以找到主体中定义的任何内容的应用类型?到目前为止我所看到的所有地方都只看到“T”,而不是布尔值。例如,使用我的反射库我可以输出:
co.blocke.scala_reflection.Foo[Boolean]:
fields ->
thing: [T] Boolean
non-constructor fields (non-case class) ->
store: Option of T
我显然没有在正确的位置寻找正文中定义的 ValDefs。他们都回来了。
在 Tasty 中进行任何操作时,AST 上的模式匹配是最后的手段。报价已经提供了相当多的实用程序。
我你设法找到了一个
TypeRepr
(它的任何子类型都可以)然后Quotes
为你提供了正确的API来询问应用类型:
import quotes.*, quotes.reflect.*
val repr: TypeRepr = ...
typeArguments = repr.typeArgs
如果您需要将这些类型应用于某种方法,那么您必须
例如
val method: Symbol = ... // method belonging to type represented by repr
if repr.typeArgs.isEmpty then repr.memberType(method)
else repr.memberType(method).appliedTo(repr.typeArgs)