Sto cercando di ottenere la stringa di input originale di un parametro su una macro, ma la posizione restituita sembra un po 'spenta. Considerate questa macro, ad esempio:Che succede con la posizione sui macro Scala?
object M {
import scala.reflect.macros.Context
import language.experimental.macros
def f[T](v: => T) = macro fImpl[T]
def fImpl[T : c.WeakTypeTag](c: Context)(v: c.Expr[T]): c.Expr[Unit] = {
import c.universe._
val pos = v.tree.pos
println(pos.lineContent)
println(" " * pos.column + "^")
println(" " * pos.point + "^")
c.literalUnit
}
}
Quando provo con questo file:
object N extends App {
val x = 1
val y = 2
println(M.f(x + y))
}
ottengo questo output:
println(M.f(x + y))
^
^
che non ha senso per me. Mi aspetterei che indicasse x
o che venisse disattivato di uno. Cosa succede con quello?
Se si modifica a 'println (Mf (x. + (Y))) 'il punto si sposta su uno per puntare su ye con' println (Mf (if (true) {x + y})) 'punta alla f in if. Sospetto che stia cercando di indicare la cima dell'albero, l'invocazione di + o il se, anche se è supposta o no è un'altra domanda. Potrebbe esserci almeno un errore off-by. Questo mi sembra appropriato per un bug report. – wingedsubmariner
Sarebbe più divertente se la domanda venisse letta, qual è la tua posizione sulle macro? –