Is it possible to generate a list value selections ?
https://gist.github.com/lgirault/3d5c541b79d9e300da72e09304b27e47
These two lines :
case class FooBar(id: Long, foo: Int, bar: String)
printCall1(FooBar(737, 111, "bobo"))
displays “t.id = 737”
but if I call
printCall2(FooBar(737, 111, "bobo"))
I get the following error “value id is not a member of FooBar”
I can see that in printCall1 the c.Expr( Select(t.tree, m1.name) )
in line 10 is implicitly provided a WeakTypeTag[T]
.
Even when I materialize one and pass it explicitly in printCall2 and printCallList it doesn’t work.
Any idea on how to fix it ?
( here’s the real scenario where I’m trying to make this work)
Placing a debug println
in your macro can reveal a lot.
For instance println(c.weakTypeOf[T].decls.filter(_.isTerm))
will print
Scope{
val id: Long;
private[this] val id: Long;
val foo: Int;
private[this] val foo: Int;
val bar: String;
private[this] val bar: String;
def <init>(id: Long,foo: Int,bar: String): FooBar;
def copy(id: Long,foo: Int,bar: String): FooBar;
def copy$default$1: Long @scala.annotation.unchecked.uncheckedVariance;
def copy$default$2: Int @scala.annotation.unchecked.uncheckedVariance;
def copy$default$3: String @scala.annotation.unchecked.uncheckedVariance;
override def productPrefix: String;
def productArity: Int;
def productElement(x$1: Int): Any;
override def productIterator: Iterator[Any];
def canEqual(x$1: Any): Boolean;
override def hashCode(): Int;
override def toString(): String;
override def equals(x$1: Any): Boolean
}
Meaning that m2
will actually be private[this] val id: Long
which is private. And there’s a lot of other stuff in there which you probably don’t want either.
You probably want to do something like this:
val accessors = c.weakTypeOf[T].decls.filter(d => d.isMethod && d.asMethod.isCaseAccessor)
1 Like
Yes ! Thank you. This is indeed what I wanted to do !