diff options
author | Paul Phillips <paulp@improving.org> | 2011-06-29 20:47:18 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-06-29 20:47:18 +0000 |
commit | e90e836a1ebc9b7537d9631fabd7abac70266bb0 (patch) | |
tree | d4b17f4d0dce0d0813fa9a1fbac1bf42e8625202 | |
parent | aa3c70cb5249dea6840eb13f6c4fd2e8a03f1080 (diff) | |
download | scala-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.scala | 6 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 16 |
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 |