summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2017-04-04 17:30:00 -0700
committerAdriaan Moors <adriaan@lightbend.com>2017-04-06 16:30:57 -0700
commit379e113e568c3d3193aace81fc37d7279eff4f8c (patch)
tree719ecf6161f880c2fa41a813f1000c3089baf6fe
parent31a56077af5c5b35049fec456204e12a19bb6701 (diff)
downloadscala-379e113e568c3d3193aace81fc37d7279eff4f8c.tar.gz
scala-379e113e568c3d3193aace81fc37d7279eff4f8c.tar.bz2
scala-379e113e568c3d3193aace81fc37d7279eff4f8c.zip
`CompleterWrapper` delegates `typeParams`.
Fixes the problem reported with #5730 by xuwei-k in scala/scala-dev#352. The problem was already present before the introduction of `applyUnapplyMethodCompleter`, as 63f7b35 (in #5294) introduced a similar bug where the `PolyTypeCompleter`'s `typeParams` override was masked.
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala3
-rw-r--r--test/files/pos/userdefined_apply_poly_overload.scala13
2 files changed, 16 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index 51df750951..1e4a59615f 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -614,6 +614,9 @@ trait Namers extends MethodSynthesis {
}
class CompleterWrapper(completer: TypeCompleter) extends TypeCompleter {
+ // override important when completer.isInstanceOf[PolyTypeCompleter]!
+ override val typeParams = completer.typeParams
+
val tree = completer.tree
override def complete(sym: Symbol): Unit = {
diff --git a/test/files/pos/userdefined_apply_poly_overload.scala b/test/files/pos/userdefined_apply_poly_overload.scala
new file mode 100644
index 0000000000..6760c1424f
--- /dev/null
+++ b/test/files/pos/userdefined_apply_poly_overload.scala
@@ -0,0 +1,13 @@
+object Foo {
+ // spurious error if:
+ // - this definition precedes that of apply (which is overloaded with the synthetic one derived from the case class)
+ // - AND `Foo.apply` is explicitly applied to `[A]` (no error if `[A]` is inferred)
+ //
+ def referToPolyOverloadedApply[A]: Foo[A] = Foo.apply[A]("bla")
+ // ^
+ // found : String("bla")
+ // required: Int
+
+ def apply[A](x: Int): Foo[A] = ???
+}
+case class Foo[A](x: String) // must be polymorphic