summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-10-31 10:33:19 +0000
committerMartin Odersky <odersky@gmail.com>2006-10-31 10:33:19 +0000
commitee7252af4701c57adde1da9ab2e0a19d388c2a7b (patch)
treea09a6b2de590e41946145a87ff40e509eac12462 /src
parent8d82ebbe360a33883d4904918321780d9d349928 (diff)
downloadscala-ee7252af4701c57adde1da9ab2e0a19d388c2a7b.tar.gz
scala-ee7252af4701c57adde1da9ab2e0a19d388c2a7b.tar.bz2
scala-ee7252af4701c57adde1da9ab2e0a19d388c2a7b.zip
fixed bug729
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala45
1 files changed, 20 insertions, 25 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index 680cc8cf91..3223349237 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -272,29 +272,29 @@ trait Infer requires Analyzer {
*/
private def withDisambiguation[T](tp1: Type, tp2: Type)(op: => T): T = {
- def explainName(sym: Symbol) = { sym.name = newTypeName("<"+sym+" in "+sym.owner+">") }
+ def explainName(sym: Symbol) = { sym.name = newTypeName(sym.name.toString+"(in "+sym.owner+")") }
val patches = {
- val tparams1 = freeTypeParams.collect(tp1)
- val tparams2 = freeTypeParams.collect(tp2)
+ val syms1 = typeRefs.collect(tp1)
+ val syms2 = typeRefs.collect(tp2)
for {
- val tparam1 <- tparams1
- val tparam2 <- tparams2
- tparam1 != tparam2 && tparam1.name == tparam2.name
+ val sym1 <- syms1
+ val sym2 <- syms2
+ sym1 != sym2 && sym1.name == sym2.name
} yield {
- val name = tparam1.name
- explainName(tparam1)
- explainName(tparam2)
- if (tparam1.owner == tparam2.owner) tparam2.name = newTypeName("some other "+tparam2.name)
- Triple(tparam1, tparam2, tparam1.name)
+ val name = sym1.name
+ explainName(sym1)
+ explainName(sym2)
+ if (sym1.owner == sym2.owner) sym2.name = newTypeName("(some other)"+sym2.name)
+ Triple(sym1, sym2, sym1.name)
}
}
val result = op
- for (val Triple(tparam1, tparam2, name) <- patches) {
- tparam1.name = name
- tparam2.name = name
+ for (val Triple(sym1, sym2, name) <- patches) {
+ sym1.name = name
+ sym2.name = name
}
result
@@ -877,18 +877,14 @@ trait Infer requires Analyzer {
}
}
- abstract class FreeSymCollector extends TypeTraverser {
+ abstract class SymCollector extends TypeTraverser {
private var result: List[Symbol] = _
protected def includeCondition(sym: Symbol): boolean
- private def include(sym: Symbol): unit =
- if (includeCondition(sym) && !result.contains(sym)) result = sym :: result
override def traverse(tp: Type): TypeTraverser = {
tp match {
- case TypeRef(NoPrefix, sym, _) =>
- include(sym)
- case TypeRef(ThisType(_), sym, _) =>
- include(sym)
+ case TypeRef(_, sym, _) =>
+ if (includeCondition(sym) && !result.contains(sym)) result = sym :: result
case _ =>
}
mapOver(tp)
@@ -909,13 +905,12 @@ trait Infer requires Analyzer {
/** A traverser to collect type parameters referred to in a type
*/
- object freeTypeParamsOfTerms extends FreeSymCollector {
+ object freeTypeParamsOfTerms extends SymCollector {
protected def includeCondition(sym: Symbol): boolean = sym.isAbstractType && sym.owner.isTerm
}
- object freeTypeParams extends FreeSymCollector {
- protected def includeCondition(sym: Symbol): boolean =
- sym.isAbstractType && (sym.owner.isTerm || (sym hasFlag PARAM))
+ object typeRefs extends SymCollector {
+ protected def includeCondition(sym: Symbol): boolean = true
}
/* -- Overload Resolution ---------------------------------------------- */