com-lihaoyi / sourcecode

Scala library providing "source" metadata to your program, similar to Python's __name__, C++'s __LINE__ or Ruby's __FILE__.
Other
521 stars 75 forks source link

Leading parens trips up `sourcecode.Text` #7

Open lihaoyi opened 8 years ago

lihaoyi commented 8 years ago
scala> def log[T](x: sourcecode.Text[T]) = println(s"[${x.source}]: ${x.value}")
log: [T](x: sourcecode.Text[T])Unit

scala> log(("omg" -> "omg").toString)
["omg" -> "omg"]: (omg,omg)

scala> // should have printed [("omg" -> "omg").toString]: (omg,omg)

As far as I can tell, Scalac sets the pos of the overall tree provided to the macro to the pos of the ->. There thus just isn't any pos anywhere at all which starts at the first (, which is what we'd want.

OTOH, we can tell when we're falling short, since the last pos within the tree should be within the range we parse. We may have to do a hacky parse-search to try and find a place where the parse encompasses all poss in the captured AST

JohnReedLOL commented 8 years ago

I think that what's actually happening is it is doing

toString("omg" -> "omg"); ("omg" -> "omg")