summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-06-27 15:05:00 +0000
committerMartin Odersky <odersky@gmail.com>2008-06-27 15:05:00 +0000
commitde69837219fcd49eb39d42e4e2670a02e632d9ad (patch)
tree6cb5564c63344e6462d7a5cef21343d57b08e782 /src
parent73006bc163947638aecd20d1b0be31467625751f (diff)
downloadscala-de69837219fcd49eb39d42e4e2670a02e632d9ad.tar.gz
scala-de69837219fcd49eb39d42e4e2670a02e632d9ad.tar.bz2
scala-de69837219fcd49eb39d42e4e2670a02e632d9ad.zip
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index 823888784f..920f8a0cd9 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -22,9 +22,9 @@ abstract class Constructors extends Transform {
val phaseName: String = "constructors"
protected def newTransformer(unit: CompilationUnit): Transformer =
- new ConstructorTransformer
+ new ConstructorTransformer(unit)
- class ConstructorTransformer extends Transformer {
+ class ConstructorTransformer(unit: CompilationUnit) extends Transformer {
def transformClassTemplate(impl: Template): Template = {
val clazz = impl.symbol.owner // the transformed class
@@ -108,9 +108,12 @@ abstract class Constructors extends Transform {
def canBeMoved(tree: Tree) = tree match {
//todo: eliminate thisRefSeen
case ValDef(mods, _, _, _) =>
-// if (!(mods hasFlag PRESUPER | PARAMACCESSOR) && !thisRefSeen)
-// println("not moving forward in "+clazz+": "+tree)
- (mods hasFlag PRESUPER | PARAMACCESSOR)// || !thisRefSeen
+ if (!(mods hasFlag PRESUPER | PARAMACCESSOR) && !thisRefSeen &&
+ { val g = tree.symbol.getter(tree.symbol.owner);
+ g != NoSymbol && !g.allOverriddenSymbols.isEmpty
+ })
+ unit.warning(tree.pos, "the semantics of this definition will change; the initialization will no longer be executed before the superclass is called")
+ (mods hasFlag PRESUPER | PARAMACCESSOR) || !thisRefSeen
case _ => false
}
@@ -196,7 +199,7 @@ abstract class Constructors extends Transform {
}
case ClassDef(_, _, _, _) =>
// classes are treated recursively, and left in the template
- defBuf += (new ConstructorTransformer).transform(stat)
+ defBuf += new ConstructorTransformer(unit).transform(stat)
case _ =>
// all other statements go into the constructor
constrStatBuf += intoConstructor(impl.symbol, stat)
@@ -278,7 +281,5 @@ abstract class Constructors extends Transform {
case _ =>
super.transform(tree)
}
-
} // ConstructorTransformer
-
}