summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/Mixin.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2008-12-10 14:37:15 +0000
committerMartin Odersky <odersky@gmail.com>2008-12-10 14:37:15 +0000
commit1566ee0c368dadec297858d6ff3c849f70b5f137 (patch)
tree822766986dc7a5f895db263ee64972af0d8b247d /src/compiler/scala/tools/nsc/transform/Mixin.scala
parentf83d8977544ec7fc3eed59e032e3705f30290c00 (diff)
downloadscala-1566ee0c368dadec297858d6ff3c849f70b5f137.tar.gz
scala-1566ee0c368dadec297858d6ff3c849f70b5f137.tar.bz2
scala-1566ee0c368dadec297858d6ff3c849f70b5f137.zip
fixed #1364 (overeriding vals in traits)
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Mixin.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala33
1 files changed, 23 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index b8ba347b8f..542857533d 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -140,7 +140,8 @@ abstract class Mixin extends InfoTransform {
}
def needsExpandedSetterName(field: Symbol) =
- settings.Xexperimental.value && !field.hasFlag(LAZY | MUTABLE)
+ !(field hasFlag LAZY) &&
+ (if (field.isMethod) (field hasFlag STABLE) else !(field hasFlag MUTABLE))
/** Add getters and setters for all non-module fields of an implementation
* class to its interface unless they are already present. This is done
@@ -157,19 +158,26 @@ abstract class Mixin extends InfoTransform {
/** Create a new getter. Getters are never private or local. They are
* always accessors and deferred. */
- def newGetter(field: Symbol): Symbol =
+ def newGetter(field: Symbol): Symbol = {
+ //println("creating new getter for "+field+field.locationString+(field hasFlag MUTABLE))
clazz.newMethod(field.pos, nme.getterName(field.name))
- .setFlag(field.flags & ~(PRIVATE | LOCAL) | ACCESSOR | lateDEFERRED)
+ .setFlag(field.flags & ~(PRIVATE | LOCAL) | ACCESSOR | lateDEFERRED |
+ (if (field hasFlag MUTABLE) 0 else STABLE))
.setInfo(MethodType(List(), field.info))
+ }
/** Create a new setter. Setters are never private or local. They are
* always accessors and deferred. */
def newSetter(field: Symbol): Symbol = {
+ //println("creating new setter for "+field+field.locationString+(field hasFlag MUTABLE))
val setterName = nme.getterToSetter(nme.getterName(field.name))
val setter = clazz.newMethod(field.pos, setterName)
.setFlag(field.flags & ~(PRIVATE | LOCAL) | ACCESSOR | lateDEFERRED)
.setInfo(MethodType(List(field.info), UnitClass.tpe))
- if (needsExpandedSetterName(field)) setter.name = clazz.expandedSetterName(setter.name)
+ if (needsExpandedSetterName(field)) {
+ //println("creating expanded setter from "+field)
+ setter.name = clazz.expandedSetterName(setter.name)
+ }
setter
}
@@ -793,7 +801,7 @@ abstract class Mixin extends InfoTransform {
}
if (sym.isSetter) {
val isOverriddenSetter =
- settings.Xexperimental.value && nme.isTraitSetterName(sym.name) && {
+ nme.isTraitSetterName(sym.name) && {
sym.allOverriddenSymbols match {
case other :: _ =>
isOverriddenAccessor(other.getter(other.owner), clazz.info.baseClasses)
@@ -960,10 +968,14 @@ abstract class Mixin extends InfoTransform {
// assign to fields in some implementation class via an abstract
// setter in the interface.
localTyper.typed {
- // println(lhs.symbol)
- // println(lhs.symbol.owner.info.decls)
- // println(needsExpandedSetterName(lhs.symbol))
- // util.trace("generating tree: ") {
+/*
+ println(lhs.symbol)
+ println(lhs.symbol.owner.info.decls)
+ println(needsExpandedSetterName(lhs.symbol))
+ println(toInterface(lhs.symbol.owner.tpe).typeSymbol)
+ println(toInterface(lhs.symbol.owner.tpe).typeSymbol.info.decls)
+ util.trace("generating tree: ") {
+*/
atPos(tree.pos) {
Apply(
Select(
@@ -973,7 +985,8 @@ abstract class Mixin extends InfoTransform {
needsExpandedSetterName(lhs.symbol))) setPos lhs.pos,
List(rhs))
}
- } //}
+// }
+ }
case _ =>
tree
}