Scala 3 宏:如何通过方法的 `Symbol` 获取方法的返回类型?

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

在 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
实际上是一个类型参数,所以我只能通过其名称查找该方法,并且我没有任何关于它的进一步信息。

谢谢

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

我正在使用类似的东西:

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[

等等

© www.soinside.com 2019 - 2024. All rights reserved.