diff options
author | Martin Odersky <odersky@gmail.com> | 2008-04-11 17:05:34 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2008-04-11 17:05:34 +0000 |
commit | 551db35802532b66e15638213d7b0010efe95ab4 (patch) | |
tree | fc271e4e95077fdb508822010383b59acedb4a2d /src/compiler/scala/tools/nsc/typechecker/Namers.scala | |
parent | 2fa3294cd903021db12cc93d9477318b128e68ba (diff) | |
download | scala-551db35802532b66e15638213d7b0010efe95ab4.tar.gz scala-551db35802532b66e15638213d7b0010efe95ab4.tar.bz2 scala-551db35802532b66e15638213d7b0010efe95ab4.zip |
(1) add devirtualization phase.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Namers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Namers.scala | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 7b9a1e646c..fe9bc2aeab 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -524,11 +524,20 @@ trait Namers { self: Analyzer => self.symbol = context.scope enter self.symbol } } - val parents = typer.parentTypes(templ) map checkParent + var parents = typer.parentTypes(templ) map checkParent enterSelf(templ.self) val decls = newClassScope(clazz) val templateNamer = newNamer(context.make(templ, clazz, decls)) .enterSyms(templ.body) + // make subclasses of virtual classes virtual as well + if (parents exists (_.typeSymbol.isVirtualClass)) + clazz setFlag DEFERRED + // add overridden virtuals to parents + if (clazz.isVirtualClass) + parents = parents ::: (clazz.overriddenVirtuals map ( + TypeRef(clazz.thisType, _, clazz.typeParams map (_.tpe)))) + // add apply and unapply methods to companion objects of case classes, + // unless they exist already caseClassOfModuleClass get clazz match { case Some(cdef) => addApplyUnapply(cdef, templateNamer) |