簡體   English   中英

如何獲得AST表示的值的類型?

[英]How does one obtain the type of the value that an AST represents?

我正在嘗試編寫以下內容:

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
"""

我需要捕獲tpe AST value表示的valuetpe並將其分配給U 如何做到這一點?

編輯:這里沒有給value提供類型注釋並通過准引用對其進行匹配的選項。 用例是一個Shapeless 可擴展記錄 ,具有復雜的類型,例如String with labelled.KeyTag[1, String] :: Long with labelled.KeyTag[three, Long] :: HNil ,例如val ls = (1 ->> "two") :: ("three" ->> 4L) :: HNil 同樣, value AST是通過編程生成的,而不是文字。

獲取一個ToolBox ,使用它來類型檢查value ,並詢問帶注釋的樹的類型。

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

您編寫的代碼說明您正在運行時執行此操作。 您在注釋中陳述的用例使您看起來好像在編譯時宏中。 在這種情況下,請在Context使用類似的typecheck方法。 否則將不會進行類型檢查; value將是來自錯誤UniverseTree ,表示由ToolBox的新編譯器實例在當前程序(恰好是編譯器)的上下文中運行的事實,而Context表示的反射全部與以下內容有關:包含的編譯器操縱的代碼的將來上下文。

嘗試在q"$mods val $tname: $tpt = $expr"使用$tpt

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

關聯問題: 如何使用准引數獲取值的類型?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM