I’m trying to write the following:
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
"""
I need to capture the type of the value represented by the AST value in tpe and assign it to U. How does one do this?
Edit: Giving a type annotation for value and matching on it via quasiquotes isn't an option here. The use case is a Shapeless extensible record, which has complicated types such as String with labelled.KeyTag[1, String] :: Long with labelled.KeyTag[three, Long] :: HNil for something like val ls = (1 ->> "two") :: ("three" ->> 4L) :: HNil. Also, the value AST is programmatically generated and not a literal.
Get a
ToolBox, use it to typecheckvalue, and ask the annotated tree for its type.The code you've written states you're doing this at runtime. The use case you've stated in your comment makes it seem like you're in a compile-time macro. In that case, use the similar
typecheckmethod in yourContext. It won't typecheck otherwise; thevaluewould be aTreefrom the wrongUniverse, representing the fact that the new compiler instance made byToolBoxoperates in the context of the current program (which happens to be a compiler), while the reflection represented by theContextis all about the future context of the code manipulated by the containing compiler.