在 Scala 3 宏中,给定一个方法的
Symbol
,获取该方法的返回类型的最直接方法是什么?
更具体地说,假设我有一个对应于特征的类型名称
Foo
,以及一个方法名称。我可以通过以下方式获得该名称的 Symbol
:
// elsewhere
trait Foo:
def bar[A](a: A)(b: String): Boolean
// in the macro
val methodSymbol = TypeRepr.of[Foo].typeSymbol.methodMember("bar").head
我可以使用
methodSymbol.info
来获取 methodSymbol
的完整签名,但这可以是 MethodType
和 PolyType
的任意嵌套链。如何在不遍历这条链的情况下获得最终的返回类型?在示例中,如何获得与 TypeRepr
相对应的 Boolean
。
请注意,在宏中
Foo
实际上是一个类型参数,所以我只能通过其名称查找该方法,并且我没有任何关于它的进一步信息。
谢谢
我正在使用类似的东西:
def returnTypeOf(tpe: TypeRepr, method: Symbol): Type[?] =
tpe.memberType(method).widenByName match {
case lambda: LambdaType => lambda.resType.asType
case out => out.asType
}
它基本上是一种存在类型,很难使用,所以我通常将它与:
trait ExistentialType {
type Underlying
implicit val Underlying: Type[Underlying]
}
val someType = new ExistentialType {
val Underlying = returnTypeOf(repr, method).asInstanceOf[Type[Underlying]]
}
import someType.Underlying as SomeType
Type.of[SomeType]
TypeRepr.of[SomeType]
term.asExprOf[SomeType[
等等