0

我正在尝试编写以下内容:

import scala.reflect.runtime.universe._

val value: Tree = /* some AST */
val tpe = typeOf(value)    // This should be the result type of the AST.
                           // This is pseudocode. What should
                           // actually go on this line?
q"""
type U = $tpe
val v: U = $value
"""

我需要捕获由 AST 表示的值的类型value并将tpe其分配给U. 如何做到这一点?

编辑:在这里通过准引号为其提供类型注释value和匹配不是一个选项。用例是一个无形可扩展记录,它具有复杂的类型,String with labelled.KeyTag[1, String] :: Long with labelled.KeyTag[three, Long] :: HNil例如val ls = (1 ->> "two") :: ("three" ->> 4L) :: HNil. 此外,valueAST 是以编程方式生成的,而不是文字。

4

2 回答 2

2

获取 a ToolBox,用它来 typecheck value,并询问带注释的树的类型。

import scala.runtime.reflect.currentMirror
val toolbox = currentMirror.mkToolBox()
val tpe = TypeTree(toolbox.typecheck(value).tpe)

您编写的代码表明您正在运行时执行此操作。您在评论中陈述的用例使您看起来像是在编译时宏中。在这种情况下,typecheck请在您的Context. 否则它不会进行类型检查;将valueTree错误的Universe,表示由 生成的新编译器实例ToolBox在当前程序(恰好是编译器)的上下文中运行,而由 表示的反射Context完全与代码的未来上下文有关由包含的编译器操作。

于 2019-04-23T01:18:16.447 回答
0

尝试$tpt使用q"$mods val $tname: $tpt = $expr"

val t: Tree = reify {
  val value: Int = 3
}.tree

val tpe = t match {
  case q"{$mods val $tname: $tpt = $expr; $_}" => tpt
} // Int

https://docs.scala-lang.org/overviews/quasiquotes/syntax-summary.html#definitions

相关问题:如何使用准引号来获取值的类型?

于 2019-04-22T23:35:26.690 回答