Skip to content

Commit 82f3e49

Browse files
committed
fixes a problem with an extractor object overloaded by a regular def
1 parent 2422b06 commit 82f3e49

File tree

3 files changed

+42
-1
lines changed

3 files changed

+42
-1
lines changed

src/compiler/scala/reflect/internal/Types.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2663,6 +2663,10 @@ trait Types extends api.Types { self: SymbolTable =>
26632663
override def kind = "OverloadedType"
26642664
}
26652665

2666+
def overloadedType(pre: Type, alternatives: List[Symbol]): Type =
2667+
if (alternatives.tail.isEmpty) pre memberType alternatives.head
2668+
else OverloadedType(pre, alternatives)
2669+
26662670
/** A class remembering a type instantiation for some a set of overloaded
26672671
* polymorphic symbols.
26682672
* Not used after phase `typer`.

src/compiler/scala/tools/nsc/typechecker/Typers.scala

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -958,9 +958,14 @@ trait Typers extends Modes with Adaptations with Taggings {
958958
* see test/files/../t5189*.scala
959959
*/
960960
def adaptConstrPattern(): Tree = { // (5)
961-
val extractor = tree.symbol.filter(sym => reallyExists(unapplyMember(sym.tpe)))
961+
def isExtractor(sym: Symbol) = reallyExists(unapplyMember(sym.tpe))
962+
val extractor = tree.symbol filter isExtractor
962963
if (extractor != NoSymbol) {
963964
tree setSymbol extractor
965+
tree.tpe match {
966+
case OverloadedType(pre, alts) => tree.tpe = overloadedType(pre, alts filter isExtractor)
967+
case _ =>
968+
}
964969
val unapply = unapplyMember(extractor.tpe)
965970
val clazz = unapplyParameterType(unapply)
966971

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
trait TreesBase {
2+
type Tree
3+
4+
type Apply <: Tree
5+
6+
val Apply: ApplyExtractor
7+
8+
abstract class ApplyExtractor {
9+
def apply(x: Int): Apply
10+
def unapply(apply: Apply): Option[Int]
11+
}
12+
}
13+
14+
trait TreesApi extends TreesBase {
15+
def Apply(x: String)
16+
}
17+
18+
class Universe extends TreesApi {
19+
abstract class Tree
20+
case class Apply(x: Int) extends Tree
21+
object Apply extends ApplyExtractor
22+
def Apply(x: String) = Apply(x.toInt)
23+
}
24+
25+
object Test extends App {
26+
def foo(tapi: TreesApi) {
27+
import tapi._
28+
def bar(tree: Tree) {
29+
val Apply(x) = tree
30+
}
31+
}
32+
}

0 commit comments

Comments
 (0)