diff options
author | Som Snytt <som.snytt@gmail.com> | 2013-12-03 13:31:13 -0800 |
---|---|---|
committer | Som Snytt <som.snytt@gmail.com> | 2013-12-04 12:25:16 -0800 |
commit | 1b454185c44a0817a1f30c3d93a91b16805ce84b (patch) | |
tree | 29dde89e788abfa1ebdb6d7949c7553045422daf /test/files/pos/t8013 | |
parent | 6c63ab153651f7946ece5740d52e0f2b701e349d (diff) | |
download | scala-1b454185c44a0817a1f30c3d93a91b16805ce84b.tar.gz scala-1b454185c44a0817a1f30c3d93a91b16805ce84b.tar.bz2 scala-1b454185c44a0817a1f30c3d93a91b16805ce84b.zip |
SI-8013 Nowarn on macro str interpolation
When warning about stray "foo $bar" under `-Xlint`,
which may be missing an interpolator id, suppress
the warning if we're in the middle of a macro
expansion, since we have no useful heuristic to
apply to the expanded tree.
The test for whether the string is part of an
expanded tree is to check all open macros for
an expanded tree that contains the literal tree
under scrutiny. (This is deemed more paranoid
than looking for a macro application that is an
enclosing position.)
Diffstat (limited to 'test/files/pos/t8013')
-rw-r--r-- | test/files/pos/t8013/inpervolated_2.scala | 11 | ||||
-rw-r--r-- | test/files/pos/t8013/inpervolator_1.scala | 33 |
2 files changed, 44 insertions, 0 deletions
diff --git a/test/files/pos/t8013/inpervolated_2.scala b/test/files/pos/t8013/inpervolated_2.scala new file mode 100644 index 0000000000..90e571b42c --- /dev/null +++ b/test/files/pos/t8013/inpervolated_2.scala @@ -0,0 +1,11 @@ +/* + * scalac: -Xfatal-warnings -Xlint + */ +package t8013 + +// unsuspecting user of perverse macro +trait User { + import Perverse.Impervolator + val foo = "bar" + Console println p"Hello, $foo" +} diff --git a/test/files/pos/t8013/inpervolator_1.scala b/test/files/pos/t8013/inpervolator_1.scala new file mode 100644 index 0000000000..fb71571afc --- /dev/null +++ b/test/files/pos/t8013/inpervolator_1.scala @@ -0,0 +1,33 @@ + +package t8013 + +// perverse macro to confuse Xlint + +import scala.language.experimental.macros +import scala.reflect.macros.{ BlackboxContext => Context } + +object Perverse { + + implicit class Impervolator(sc: StringContext) { + def p(args: Any*): String = macro pImpl + } + + // turn a nice interpolation into something that looks + // nothing like an interpolation or anything we might + // recognize, but which includes a "$id" in an apply. + def pImpl(c: Context)(args: c.Expr[Any]*): c.Expr[String] = { + import c.universe._ + val macroPos = c.macroApplication.pos + val text = macroPos.lineContent substring macroPos.column + val tt = Literal(Constant(text)) + val tree = q"t8013.Perverse.pervert($tt)" + c.Expr[String](tree) + } + + // identity doesn't seem very perverse in this context + //def pervert(text: String): String = text + def pervert(text: String): String = { + Console println s"Perverting [$text]" + text + } +} |