diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 2bbb6d79dd27..a18bc5ddcfa9 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -3999,9 +3999,14 @@ trait Typers extends Modes with Adaptations with Tags { def typedNamedApply(orig: Tree, fun: Tree, args: List[Tree], mode: Int, pt: Type): Tree = { def argToBinding(arg: Tree): Tree = arg match { - case AssignOrNamedArg(Ident(name), rhs) => gen.mkTuple(List(CODE.LIT(name.toString), rhs)) - case _ => gen.mkTuple(List(CODE.LIT(""), arg)) + case AssignOrNamedArg(i @ Ident(name), rhs) => + atPos(i.pos.withEnd(rhs.pos.endOrPoint)) { + gen.mkTuple(List(atPos(i.pos)(CODE.LIT(name.toString)), rhs)) + } + case _ => + gen.mkTuple(List(CODE.LIT(""), arg)) } + val t = treeCopy.Apply(orig, fun, args map argToBinding) wrapErrors(t, _.typed(t, mode, pt)) } diff --git a/test/files/run/dynamic-applyDynamicNamed.check b/test/files/run/dynamic-applyDynamicNamed.check new file mode 100644 index 000000000000..17fa496646f1 --- /dev/null +++ b/test/files/run/dynamic-applyDynamicNamed.check @@ -0,0 +1,14 @@ +[[syntax trees at end of typer]] // newSource1.scala +[0:97]package [0:0] { + [0:97]object X extends [9:97][97]scala.AnyRef { + [9]def (): [9]X.type = [9]{ + [9][9][9]X.super.(); + [9]() + }; + [17:30]private[this] val d: [21]D = [25:30][25:30][25:30]new [29:30]D(); + [21] def d: [21]D = [21][21]X.this.d; + [37:70][37:38][37:38][37]X.this.d.applyDynamicNamed(<39:43>"meth")([44:55][44][44][44]scala.this.Tuple2.apply[[44]String, [44]Int]([44:50]"value1", [53:55]10), [57:69][57][57][57]scala.this.Tuple2.apply[[57]String, [57]Int]([57:63]"value2", [66:69]100)); + [77:91]<77:78><77:78>[77]X.this.d.applyDynamicNamed(<77:78>"apply")([79:90][79][79][79]scala.this.Tuple2.apply[[79]String, [79]Int]([79:85]"value1", [88:90]10)) + } +} + diff --git a/test/files/run/dynamic-applyDynamicNamed.scala b/test/files/run/dynamic-applyDynamicNamed.scala new file mode 100644 index 000000000000..cc59f9058be9 --- /dev/null +++ b/test/files/run/dynamic-applyDynamicNamed.scala @@ -0,0 +1,26 @@ +import scala.tools.partest.DirectTest + +object Test extends DirectTest { + + override def extraSettings: String = + s"-usejavacp -Xprint-pos -Xprint:typer -Yrangepos -Ystop-after:typer -d ${testOutput.path}" + + override def code = """ + object X { + val d = new D + d.meth(value1 = 10, value2 = 100) + d(value1 = 10) + } + """.trim + + override def show(): Unit = { + Console.withErr(System.out) { + compile() + } + } +} + +import language.dynamics +class D extends Dynamic { + def applyDynamicNamed(name: String)(value: (String, Any)*) = ??? +}