diff options
Diffstat (limited to 'src')
4 files changed, 16 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index 9e10d3a408..acf4f6d43d 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -137,7 +137,7 @@ trait Types extends reflect.generic.Types { self: SymbolTable => * It makes use of the fact that these two operations depend only on the parents, * not on the refinement. */ - var intersectionWitness = new WeakHashMap[List[Type], Type] + val intersectionWitness = new WeakHashMap[List[Type], Type] private object gen extends { val global : Types.this.type = Types.this diff --git a/src/compiler/scala/tools/nsc/transform/TypingTransformers.scala b/src/compiler/scala/tools/nsc/transform/TypingTransformers.scala index 6656b79d26..de5355de61 100644 --- a/src/compiler/scala/tools/nsc/transform/TypingTransformers.scala +++ b/src/compiler/scala/tools/nsc/transform/TypingTransformers.scala @@ -26,7 +26,7 @@ trait TypingTransformers { protected def typedPos(pos: Position)(tree: Tree) = localTyper typed { atPos(pos)(tree) } /** a typer for each enclosing class */ - var typers: Map[Symbol, analyzer.Typer] = new HashMap + val typers: Map[Symbol, analyzer.Typer] = new HashMap override def atOwner[A](owner: Symbol)(trans: => A): A = atOwner(curTree, owner)(trans) diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 5687917e46..22a1bee9b2 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -297,7 +297,7 @@ trait Namers { self: Analyzer => val sym = tree.symbol if (settings.debug.value) log("entered " + sym + " in " + context.owner + ", scope-id = " + context.scope.## ) var ltype = namerOf(sym).typeCompleter(tree) - if (!tparams.isEmpty) { + if (tparams nonEmpty) { //@M! TypeDef's type params are handled differently //@M e.g., in [A[x <: B], B], A and B are entered first as both are in scope in the definition of x //@M x is only in scope in `A[x <: B]' diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index cbdbadc4bf..381b1ceed3 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1788,8 +1788,18 @@ trait Typers { self: Analyzer => } def typedTypeDef(tdef: TypeDef): TypeDef = { - reenterTypeParams(tdef.tparams) // @M! - val tparams1 = tdef.tparams mapConserve (typedTypeDef) // @M! + def typeDefTyper = { + if(tdef.tparams isEmpty) Typer.this + else newTyper(context.makeNewScope(tdef, tdef.symbol)) + } + typeDefTyper.typedTypeDef0(tdef) + } + + // call typedTypeDef instead + // a TypeDef with type parameters must always be type checked in a new scope + private def typedTypeDef0(tdef: TypeDef): TypeDef = { + reenterTypeParams(tdef.tparams) + val tparams1 = tdef.tparams mapConserve {typedTypeDef(_)} val typedMods = removeAnnotations(tdef.mods) // complete lazy annotations val annots = tdef.symbol.annotations @@ -3803,7 +3813,7 @@ trait Typers { self: Analyzer => newTyper(context.makeNewScope(tree, sym)).typedDefDef(ddef) case tdef @ TypeDef(_, _, _, _) => - newTyper(context.makeNewScope(tree, sym)).typedTypeDef(tdef) + typedTypeDef(tdef) case ldef @ LabelDef(_, _, _) => labelTyper(ldef).typedLabelDef(ldef) |