¿Cómo puedo reutilizar los subárboles de definición (AST) en una macro?

Estoy trabajando en un DSL integrado de Scala y las macros se están convirtiendo en una herramienta principal para lograr mis propósitos. Recibo un error al intentar reutilizar un subárbol de la expresión de macro entrante en la resultante. La situación es bastante compleja, pero (espero) la he simplificado para su comprensión.

Supongamos que tenemos este código:

val y = transform {
  val x = 3
  x
}
println(y) // prints 3

donde 'transformar' es la macro involucrada. Aunque podría parecer que no hace absolutamente nada, realmente está transformando el bloque mostrado en esta expresión:

3 match { case x => x }

Se hace con esta macro implementación:

def transform(c: Context)(block: c.Expr[Int]): c.Expr[Int] = {
  import c.universe._
  import definitions._

  block.tree match {
    /* {
     *   val xNam = xVal
     *   xExp
     * }
     */
    case Block(List(ValDef(_, xNam, _, xVal)), xExp) =>
      println("# " + showRaw(xExp)) // prints Ident(newTermName("x"))
      c.Expr(
        Match(
          xVal, 
          List(CaseDef(
            Bind(xNam, Ident(newTermName("_"))),
            EmptyTree,
            /* xExp */ Ident(newTermName("x")) ))))
    case _ => 
      c.error(c.enclosingPosition, "Can't transform block to function")
      block  // keep original expression
  }
}

Darse cuenta dexNam se corresponde con el nombre de la variable,xVal se corresponde con su valor asociado y finalmentexExp se corresponde con la expresión que contiene la variable. Bueno, si imprimo el xexp raw tree obtengoIdent (newTermName ("x")), y eso es exactamente lo que se establece en el caso RHS. Dado que la expresión podría modificarse (por ejemplo, x + 2 en lugar de x), esta no es una solución válida para mí. Lo que quiero hacer es reutilizar el árbol xExp (ver el comentario de xExp) mientras se altera el significado de 'x' (es una definición en la expresión de entrada, pero será una variable de LHS en el caso de la salida), pero lanza un Error largo resumido en:

symbol value x does not exist in org.habla.main.Main$delayedInit$body.apply); see the error output for details.

Mi solución actual consiste en el análisis de xExp para sustituir todos los Ident por otros nuevos, pero es totalmente dependiente de los componentes internos del compilador, y por lo tanto, una solución temporal. Es obvio que el xExp viene con más información que la ofrecida por showRaw. ¿Cómo puedo limpiar ese xExp para permitir que 'x' cumpla la variable de caso? ¿Alguien puede explicar la imagen completa de este error?

PD: He intentado sin éxito utilizar la familia de métodos sustitutos * deTreeApi Pero me faltan los conceptos básicos para entender sus implicaciones.

Respuestas a la pregunta(1)

Su respuesta a la pregunta