summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2011-06-29 20:47:18 +0000
committerPaul Phillips <paulp@improving.org>2011-06-29 20:47:18 +0000
commite90e836a1ebc9b7537d9631fabd7abac70266bb0 (patch)
treed4b17f4d0dce0d0813fa9a1fbac1bf42e8625202
parentaa3c70cb5249dea6840eb13f6c4fd2e8a03f1080 (diff)
downloadscala-e90e836a1ebc9b7537d9631fabd7abac70266bb0.tar.gz
scala-e90e836a1ebc9b7537d9631fabd7abac70266bb0.tar.bz2
scala-e90e836a1ebc9b7537d9631fabd7abac70266bb0.zip
Test files/jvm/t2585 passing again.
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala6
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala16
2 files changed, 15 insertions, 7 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index 7a315dbcb5..c78d05cd7e 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -421,6 +421,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
final def isErroneous = isError || isInitialized && tpe.isErroneous
override final def isTrait: Boolean = isClass && hasFlag(TRAIT | notDEFERRED) // A virtual class becomes a trait (part of DEVIRTUALIZE)
final def isTypeParameterOrSkolem = isType && hasFlag(PARAM)
+ final def isHigherOrderTypeParameter = owner.isTypeParameterOrSkolem
final def isTypeSkolem = isSkolem && hasFlag(PARAM)
// a type symbol bound by an existential type, for instance the T in
// List[T] forSome { type T }
@@ -634,6 +635,11 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
override final def owner_=(owner: Symbol) { rawowner = owner }
def ownerChain: List[Symbol] = this :: owner.ownerChain
+ def enclClassChain: List[Symbol] = {
+ if (this eq NoSymbol) Nil
+ else if (isClass && !isPackageClass) this :: owner.enclClassChain
+ else owner.enclClassChain
+ }
def ownersIterator: Iterator[Symbol] = new Iterator[Symbol] {
private var current = Symbol.this
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index 15302c89f3..6ae417af17 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -218,10 +218,12 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
// * higher-order type parameters (aka !sym.owner.isTypeParameterOrSkolem)
// * parameters of methods
// * type members not visible in the enclosing template
- private def isTypeParameterInSig(sym: Symbol, nestedIn: Symbol) = (
- !sym.owner.isTypeParameterOrSkolem &&
- sym.isTypeParameterOrSkolem &&
- (sym isNestedIn nestedIn)
+ private def isTypeParameterInSig(sym: Symbol, initialSymbol: Symbol) = (
+ !sym.isHigherOrderTypeParameter &&
+ sym.isTypeParameterOrSkolem && (
+ (initialSymbol.enclClassChain.exists(sym isNestedIn _)) ||
+ (initialSymbol.isMethod && initialSymbol.typeParams.contains(sym))
+ )
)
// Ensure every '.' in the generated signature immediately follows
// a close angle bracket '>'. Any which do not are replaced with '$'.
@@ -374,7 +376,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
)
)
}
- else jsig(erasure(tp), existentiallyBound, toplevel, primitiveOK)
+ else jsig(erasure(tp))
case PolyType(tparams, restpe) =>
assert(tparams.nonEmpty)
def boundSig(bounds: List[Type]) = {
@@ -398,10 +400,10 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
case ClassInfoType(parents, _, _) =>
(parents map (boxedSig(_))).mkString
case AnnotatedType(_, atp, _) =>
- jsig(atp, existentiallyBound, toplevel, primitiveOK)
+ jsig(atp)
case BoundedWildcardType(bounds) =>
println("something's wrong: "+sym0+":"+sym0.tpe+" has a bounded wildcard type")
- jsig(bounds.hi, existentiallyBound, toplevel, primitiveOK)
+ jsig(bounds.hi)
case _ =>
val etp = erasure(tp)
if (etp eq tp) throw new UnknownSig