Skip to content
Permalink
Browse files

Fix for implicit class / value class collision.

New this week, on SCALA.

Implicit class: "Spin me up an implicit method with my name."
   Value class: "I need a companion object, pronto."
      Narrator: "All was well with this arrangement... UNTIL."

What happens when these two wacky SIPs get together in the very
same class? You'll laugh until, eventually, you cry! Weeknights
at 9:30pm, only on SCALA.

Closes SI-5667.
  • Loading branch information
paulp committed May 4, 2012
1 parent 043ce6d commit 5c84dc85bf1a19aedf1ad96c9b8007c1368dd79f
Showing with 19 additions and 6 deletions.
  1. +13 −6 src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
  2. +6 −0 test/files/pos/t5667.scala
@@ -234,11 +234,16 @@ trait MethodSynthesis {
// TODO: need to shuffle annotations between wrapper and class.
val wrapper = ImplicitClassWrapper(cd)
val meth = wrapper.derivedSym
val mdef = context.unit.synthetics(meth)
context.unit.synthetics -= meth
meth setAnnotations deriveAnnotations(annotations, MethodTargetClass, false)
cd.symbol setAnnotations deriveAnnotations(annotations, ClassTargetClass, true)
List(cd, mdef)
context.unit.synthetics get meth match {
case Some(mdef) =>
context.unit.synthetics -= meth
meth setAnnotations deriveAnnotations(annotations, MethodTargetClass, false)
cd.symbol setAnnotations deriveAnnotations(annotations, ClassTargetClass, true)
List(cd, mdef)
case _ =>
// Shouldn't happen, but let's give ourselves a reasonable error when it does
abort("No synthetics for " + meth + ": synthetics contains " + context.unit.synthetics.keys.mkString(", "))
}
case _ =>
List(stat)
}
@@ -373,7 +378,9 @@ trait MethodSynthesis {
def completer(sym: Symbol): Type = ??? // not needed
def createAndEnterSymbol(): Symbol = enterSyntheticSym(derivedTree)
def derivedSym: Symbol = {
val result = enclClass.info decl name
// Only methods will do! Don't want to pick up any stray
// companion objects of the same name.
val result = enclClass.info decl name suchThat (_.isMethod)
assert(result != NoSymbol, "not found: "+name+" in "+enclClass+" "+enclClass.info.decls)
result
}
@@ -0,0 +1,6 @@
object Main {
implicit class C(val s: String) extends AnyVal
implicit class C2(val s: String) extends AnyRef

implicit case class Foo(i: Int)
}

0 comments on commit 5c84dc8

Please sign in to comment.
You can’t perform that action at this time.