diff options
author | Adriaan Moors <adriaan.moors@epfl.ch> | 2010-08-09 11:51:37 +0000 |
---|---|---|
committer | Adriaan Moors <adriaan.moors@epfl.ch> | 2010-08-09 11:51:37 +0000 |
commit | 3ac03c3d3f0e21f279ba8c405351e445af623ceb (patch) | |
tree | ea405a577a99904525cc9b3042d7c5ac207ae20c /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | 40aafbdf1a9a52c1236f07e06d48fb24b5fa2169 (diff) | |
download | scala-3ac03c3d3f0e21f279ba8c405351e445af623ceb.tar.gz scala-3ac03c3d3f0e21f279ba8c405351e445af623ceb.tar.bz2 scala-3ac03c3d3f0e21f279ba8c405351e445af623ceb.zip |
closes #3582: typedTypeDef needs to run in a ne...
closes #3582: typedTypeDef needs to run in a new typer for TypeDefs with
type parameters
this was honored when typedTypeDef was called by typed1, but other
callers did not this would cause higher-order type parameters to be
re-entered in the scope of a method or a class
(by the way, should we recycle scopes for higher-order type params? now
new scopes are created, symbols entered, and tree's symbols updated)
changed some spurious vars to vals
review by odersky
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 16 |
1 files changed, 13 insertions, 3 deletions
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) |