如何在 Scala 3 反射中的类主体中获取正确应用的类型?

问题描述 投票:0回答:1

假设我正在使用 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。他们都回来了。

scala metaprogramming scala-macros
1个回答
0
投票

在 Tasty 中进行任何操作时,AST 上的模式匹配是最后的手段。报价已经提供了相当多的实用程序。

我你设法找到了一个

TypeRepr
(它的任何子类型都可以)然后
Quotes
为你提供了正确的API来询问应用类型

import quotes.*, quotes.reflect.*

val repr: TypeRepr = ...
typeArguments = repr.typeArgs

如果您需要将这些类型应用于某种方法,那么您必须

  1. 从类型定义中提取类型参数
  2. 手动将它们应用到方法类型

例如

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)
© www.soinside.com 2019 - 2024. All rights reserved.