summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Namers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-04-11 17:05:34 +0000
committerMartin Odersky <odersky@gmail.com>2008-04-11 17:05:34 +0000
commit551db35802532b66e15638213d7b0010efe95ab4 (patch)
treefc271e4e95077fdb508822010383b59acedb4a2d /src/compiler/scala/tools/nsc/typechecker/Namers.scala
parent2fa3294cd903021db12cc93d9477318b128e68ba (diff)
downloadscala-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.scala11
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)