summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2012-09-17 10:15:15 -0700
committerGrzegorz Kossakowski <grzegorz.kossakowski@gmail.com>2012-09-17 10:15:15 -0700
commit66603a2c003852d39faec20a9763fb0e25049cf4 (patch)
tree0939e2ca36fe2f678d09209605c00b2b0d3f89f4
parentcc94a21b694e132c945eafa9022b3a6e19e804fb (diff)
parentdbe7ef94dd5ea031b1d9e65a6843ff2ff5b28fe5 (diff)
downloadscala-66603a2c003852d39faec20a9763fb0e25049cf4.tar.gz
scala-66603a2c003852d39faec20a9763fb0e25049cf4.tar.bz2
scala-66603a2c003852d39faec20a9763fb0e25049cf4.zip
Merge pull request #1321 from namin/apply-dynamic-sugar
Fixed SI-6353: applyDynamic with sugared applications
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala16
-rw-r--r--test/files/run/applydynamic_sip.check7
-rw-r--r--test/files/run/applydynamic_sip.scala10
-rw-r--r--test/files/run/t6353.check1
-rw-r--r--test/files/run/t6353.scala12
5 files changed, 40 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index ce1c6089fb..089245e124 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1107,10 +1107,12 @@ trait Typers extends Modes with Adaptations with Tags {
case _ =>
def applyPossible = {
def applyMeth = member(adaptToName(tree, nme.apply), nme.apply)
- if ((mode & TAPPmode) != 0)
- tree.tpe.typeParams.isEmpty && applyMeth.filter(!_.tpe.typeParams.isEmpty) != NoSymbol
- else
- applyMeth.filter(_.tpe.paramSectionCount > 0) != NoSymbol
+ dyna.acceptsApplyDynamic(tree.tpe) || (
+ if ((mode & TAPPmode) != 0)
+ tree.tpe.typeParams.isEmpty && applyMeth.filter(!_.tpe.typeParams.isEmpty) != NoSymbol
+ else
+ applyMeth.filter(_.tpe.paramSectionCount > 0) != NoSymbol
+ )
}
if (tree.isType)
adaptType()
@@ -3845,11 +3847,15 @@ trait Typers extends Modes with Adaptations with Tags {
}
@inline def hasNamedArg(as: List[Tree]) = as.collectFirst{case AssignOrNamedArg(lhs, rhs) =>}.nonEmpty
+ def desugaredApply = tree match {
+ case Select(`qual`, nme.apply) => true
+ case _ => false
+ }
// note: context.tree includes at most one Apply node
// thus, we can't use it to detect we're going to receive named args in expressions such as:
// qual.sel(a)(a2, arg2 = "a2")
val oper = outer match {
- case Apply(`tree`, as) =>
+ case Apply(q, as) if q == tree || desugaredApply =>
val oper =
if (hasNamedArg(as)) nme.applyDynamicNamed
else nme.applyDynamic
diff --git a/test/files/run/applydynamic_sip.check b/test/files/run/applydynamic_sip.check
index d94db4417e..6d04dc4524 100644
--- a/test/files/run/applydynamic_sip.check
+++ b/test/files/run/applydynamic_sip.check
@@ -20,3 +20,10 @@ qual.selectDynamic(sel)
qual.selectDynamic(sel)
.apply
.update(1, 1)
+qual.applyDynamic(apply)(a)
+qual.applyDynamic(apply)(a)
+qual.applyDynamic(apply)(a)
+qual.applyDynamic(apply)(a)
+qual.applyDynamicNamed(apply)((arg,a))
+qual.applyDynamicNamed(apply)((,a), (arg2,a2))
+qual.applyDynamic(update)(a, a2)
diff --git a/test/files/run/applydynamic_sip.scala b/test/files/run/applydynamic_sip.scala
index 57cb4349f7..cf918a82ed 100644
--- a/test/files/run/applydynamic_sip.scala
+++ b/test/files/run/applydynamic_sip.scala
@@ -55,4 +55,12 @@ object Test extends App {
qual.sel() = expr // parser turns this into qual.sel.update(expr)
qual.sel.apply(1)
qual.sel.apply(1) = 1
-} \ No newline at end of file
+
+ qual.apply(a)
+ qual.apply[String](a)
+ qual(a)
+ qual[String](a)
+ qual[T](arg = a)
+ qual(a, arg2 = "a2")
+ qual(a) = a2
+}
diff --git a/test/files/run/t6353.check b/test/files/run/t6353.check
new file mode 100644
index 0000000000..5676bed245
--- /dev/null
+++ b/test/files/run/t6353.check
@@ -0,0 +1 @@
+applyDynamic(apply)(9)
diff --git a/test/files/run/t6353.scala b/test/files/run/t6353.scala
new file mode 100644
index 0000000000..112241a3c4
--- /dev/null
+++ b/test/files/run/t6353.scala
@@ -0,0 +1,12 @@
+import language.dynamics
+
+object Test extends App {
+ val x = new X(3)
+ val y = x(9)
+ class X(i: Int) extends Dynamic {
+ def applyDynamic(name: String)(in: Int): Int = {
+ println(s"applyDynamic($name)($in)")
+ i + in
+ }
+ }
+}