diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-06-27 16:03:06 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-06-27 16:03:06 +0200 |
commit | 856fe4ad0472ab71d91a6ab442fba77c4cf9950b (patch) | |
tree | f45971d824669c0962ddb71b109837afd954c537 | |
parent | 899ad4f3f5388599b748525f4d412d7411b2b8f2 (diff) | |
parent | fcb3932b32a2133612473e7b061859f97aa562df (diff) | |
download | scala-856fe4ad0472ab71d91a6ab442fba77c4cf9950b.tar.gz scala-856fe4ad0472ab71d91a6ab442fba77c4cf9950b.tar.bz2 scala-856fe4ad0472ab71d91a6ab442fba77c4cf9950b.zip |
Merge pull request #3780 from xeno-by/topic/rangepos-macro-args
macro args now correctly preserve range positions
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Macros.scala | 5 | ||||
-rw-r--r-- | test/files/run/macro-rangepos-args.check | 1 | ||||
-rw-r--r-- | test/files/run/macro-rangepos-args.flags | 1 | ||||
-rw-r--r-- | test/files/run/macro-rangepos-args/Macros_1.scala | 10 | ||||
-rw-r--r-- | test/files/run/macro-rangepos-args/Test_2.scala | 4 |
5 files changed, 19 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala index f4456998c0..f40a92f8e5 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala @@ -417,9 +417,10 @@ trait Macros extends MacroRuntimes with Traces with Helpers { val wrappedArgs = mapWithIndex(args)((arg, j) => { val fingerprint = implParams(min(j, implParams.length - 1)) + val duplicatedArg = duplicateAndKeepPositions(arg) fingerprint match { - case LiftedTyped => context.Expr[Nothing](arg.duplicate)(TypeTag.Nothing) // TODO: SI-5752 - case LiftedUntyped => arg.duplicate + case LiftedTyped => context.Expr[Nothing](duplicatedArg)(TypeTag.Nothing) // TODO: SI-5752 + case LiftedUntyped => duplicatedArg case _ => abort(s"unexpected fingerprint $fingerprint in $binding with paramss being $paramss " + s"corresponding to arg $arg in $argss") } diff --git a/test/files/run/macro-rangepos-args.check b/test/files/run/macro-rangepos-args.check new file mode 100644 index 0000000000..d779505c66 --- /dev/null +++ b/test/files/run/macro-rangepos-args.check @@ -0,0 +1 @@ +Line: 3. Width: 5. diff --git a/test/files/run/macro-rangepos-args.flags b/test/files/run/macro-rangepos-args.flags new file mode 100644 index 0000000000..fcf951d907 --- /dev/null +++ b/test/files/run/macro-rangepos-args.flags @@ -0,0 +1 @@ +-Yrangepos
\ No newline at end of file diff --git a/test/files/run/macro-rangepos-args/Macros_1.scala b/test/files/run/macro-rangepos-args/Macros_1.scala new file mode 100644 index 0000000000..97b938613c --- /dev/null +++ b/test/files/run/macro-rangepos-args/Macros_1.scala @@ -0,0 +1,10 @@ +import scala.language.experimental.macros +import scala.reflect.macros.blackbox.Context + +object Macros { + def impl(c: Context)(x: c.Tree): c.Tree = { + import c.universe._ + Literal(Constant(s"Line: ${x.pos.line}. Width: ${x.pos.end - x.pos.start}.")) + } + def pos(x: Any): String = macro impl +} diff --git a/test/files/run/macro-rangepos-args/Test_2.scala b/test/files/run/macro-rangepos-args/Test_2.scala new file mode 100644 index 0000000000..8c770e9010 --- /dev/null +++ b/test/files/run/macro-rangepos-args/Test_2.scala @@ -0,0 +1,4 @@ +object Test extends App { + val x = 2 + println(Macros.pos(x + 2)) +}
\ No newline at end of file |