summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2012-05-09 19:10:37 +0200
committerEugene Burmako <xeno.by@gmail.com>2012-05-11 17:55:21 +0200
commit82f3e49b37043e9f7661a43fe28c158dec4a3f31 (patch)
treec0b893ea954cc9ab0e88ff63baf7b9d80d6dab67
parent2422b064e7a52c04dfb2239fc8e7b9ffbab24251 (diff)
downloadscala-82f3e49b37043e9f7661a43fe28c158dec4a3f31.tar.gz
scala-82f3e49b37043e9f7661a43fe28c158dec4a3f31.tar.bz2
scala-82f3e49b37043e9f7661a43fe28c158dec4a3f31.zip
fixes a problem with an extractor object overloaded by a regular def
-rw-r--r--src/compiler/scala/reflect/internal/Types.scala4
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala7
-rw-r--r--test/files/pos/overloaded_extractor_and_regular_def.scala32
3 files changed, 42 insertions, 1 deletions
diff --git a/src/compiler/scala/reflect/internal/Types.scala b/src/compiler/scala/reflect/internal/Types.scala
index 09e7303b90..81582db5f2 100644
--- a/src/compiler/scala/reflect/internal/Types.scala
+++ b/src/compiler/scala/reflect/internal/Types.scala
@@ -2663,6 +2663,10 @@ trait Types extends api.Types { self: SymbolTable =>
override def kind = "OverloadedType"
}
+ def overloadedType(pre: Type, alternatives: List[Symbol]): Type =
+ if (alternatives.tail.isEmpty) pre memberType alternatives.head
+ else OverloadedType(pre, alternatives)
+
/** A class remembering a type instantiation for some a set of overloaded
* polymorphic symbols.
* Not used after phase `typer`.
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 34e1aaedfd..b5e58efaff 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -958,9 +958,14 @@ trait Typers extends Modes with Adaptations with Taggings {
* see test/files/../t5189*.scala
*/
def adaptConstrPattern(): Tree = { // (5)
- val extractor = tree.symbol.filter(sym => reallyExists(unapplyMember(sym.tpe)))
+ def isExtractor(sym: Symbol) = reallyExists(unapplyMember(sym.tpe))
+ val extractor = tree.symbol filter isExtractor
if (extractor != NoSymbol) {
tree setSymbol extractor
+ tree.tpe match {
+ case OverloadedType(pre, alts) => tree.tpe = overloadedType(pre, alts filter isExtractor)
+ case _ =>
+ }
val unapply = unapplyMember(extractor.tpe)
val clazz = unapplyParameterType(unapply)
diff --git a/test/files/pos/overloaded_extractor_and_regular_def.scala b/test/files/pos/overloaded_extractor_and_regular_def.scala
new file mode 100644
index 0000000000..c8e7da5cad
--- /dev/null
+++ b/test/files/pos/overloaded_extractor_and_regular_def.scala
@@ -0,0 +1,32 @@
+trait TreesBase {
+ type Tree
+
+ type Apply <: Tree
+
+ val Apply: ApplyExtractor
+
+ abstract class ApplyExtractor {
+ def apply(x: Int): Apply
+ def unapply(apply: Apply): Option[Int]
+ }
+}
+
+trait TreesApi extends TreesBase {
+ def Apply(x: String)
+}
+
+class Universe extends TreesApi {
+ abstract class Tree
+ case class Apply(x: Int) extends Tree
+ object Apply extends ApplyExtractor
+ def Apply(x: String) = Apply(x.toInt)
+}
+
+object Test extends App {
+ def foo(tapi: TreesApi) {
+ import tapi._
+ def bar(tree: Tree) {
+ val Apply(x) = tree
+ }
+ }
+} \ No newline at end of file