Skip to content

Commit 0383b06

Browse files
committed
Fix #9295: Avoid recursive Dynamics conversion
Avoid trying to apply `Dynamic` transformation on `apply` with a qualifier that already has a been handled by the `Dynamic` transformation.
1 parent 2dd1c93 commit 0383b06

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ trait TypeAssigner {
142142
val mbr = qualType.findMember(name, pre)
143143
if (reallyExists(mbr))
144144
qualType.select(name, mbr)
145-
else if (qualType.derivesFrom(defn.DynamicClass) && name.isTermName && !Dynamic.isDynamicMethod(name))
145+
else if (qualType.derivesFrom(defn.DynamicClass) && name.isTermName && !Dynamic.isDynamicMethod(name) &&
146+
!(name == nme.apply && tree.span.isSynthetic && Dynamic.isDynamicMethod(qual1.symbol.name)))
146147
TryDynamicCallType
147148
else if (qualType.isErroneous || name.toTermName == nme.ERROR)
148149
UnspecifiedErrorType

tests/neg/i9295a.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import scala.language.dynamics
2+
3+
class Foo extends Dynamic {
4+
def applyDynamic(arg: Any): Foo = ???
5+
}
6+
object F {
7+
val foo = new Foo
8+
def baz = foo.blah(43) // error: method applyDynamic in class Foo does not take more parameters
9+
}

tests/neg/i9295b.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import scala.language.dynamics
2+
3+
class Foo extends Dynamic {
4+
def applyDynamic(arg: Any): Bar = ???
5+
}
6+
class Bar extends Dynamic {
7+
def applyDynamic(arg: Any)(x: Int): Int = ???
8+
}
9+
object F {
10+
val foo = new Foo
11+
def baz = foo.blah(43) // error: method applyDynamic in class Foo does not take more parameters
12+
def qux = foo.blah.blah(43) // error: value selectDynamic is not a member of Foo
13+
def quxx = foo.blah().blah(43) // error: method applyDynamic in class Foo does not take more parameters
14+
}

tests/pos/i9295.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import scala.language.dynamics
2+
3+
class Foo extends Dynamic {
4+
def applyDynamic(name: String)(): Bar = ???
5+
}
6+
7+
class Bar extends Dynamic {
8+
def applyDynamic(name: String)(x: Int) = ???
9+
}
10+
11+
val foo = new Foo
12+
def baz = foo.blah().apply(42)

0 commit comments

Comments
 (0)