summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-09-04 17:29:37 +0000
committerMartin Odersky <odersky@gmail.com>2006-09-04 17:29:37 +0000
commitcd2cfe19995eae25719fe775dd57b5e8e7802f1c (patch)
tree47e039998bee4beb8c71b4ae80bcad15d44be565 /src
parenta202a68496798b2676556c046f7a9656f113bf88 (diff)
downloadscala-cd2cfe19995eae25719fe775dd57b5e8e7802f1c.tar.gz
scala-cd2cfe19995eae25719fe775dd57b5e8e7802f1c.tar.bz2
scala-cd2cfe19995eae25719fe775dd57b5e8e7802f1c.zip
fixed bug 719
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala5
-rw-r--r--src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala3
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala15
3 files changed, 18 insertions, 5 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index 085c15b43f..2cc39d5576 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -719,10 +719,11 @@ trait Symbols requires SymbolTable {
* term symbol rename it by expanding its name to avoid name clashes
*/
final def makeNotPrivate(base: Symbol): unit =
- if (isTerm && (this hasFlag PRIVATE)) {
+ if (this hasFlag PRIVATE) {
setFlag(notPRIVATE)
- if (!hasFlag(DEFERRED)) setFlag(lateFINAL)
+ if (!hasFlag(DEFERRED) && isTerm) setFlag(lateFINAL)
expandName(base)
+ if (isModule) moduleClass.makeNotPrivate(base)
}
/** change name by appending $$<fully-qualified-name-of-class `base'>
diff --git a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
index 30569e77e6..5811c279c8 100644
--- a/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
+++ b/src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala
@@ -43,8 +43,7 @@ with PatternMatchers {
*/
def transformInfo(sym: Symbol, tp: Type): Type = tp match {
case MethodType(formals, restpe) =>
- //todo: needed?
- if (sym.owner.isTrait && (sym hasFlag SUPERACCESSOR))
+ if (sym.owner.isTrait && ((sym hasFlag SUPERACCESSOR) || sym.isModule))
sym.makeNotPrivate(sym.owner);
if (sym.owner.isTrait && (sym hasFlag PROTECTED)) sym setFlag notPROTECTED
if (sym.isConstructor && !isStatic(sym.owner)) {
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index b69872ee34..94260e4d89 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -67,6 +67,9 @@ abstract class Mixin extends InfoTransform {
member setFlag MIXEDIN
}
+ /** add getters and setters for all non-module fields of an implementation class
+ * to its interface.
+ */
def addLateInterfaceMembers(clazz: Symbol): unit =
if (!(clazz hasFlag MIXEDIN)) {
clazz setFlag MIXEDIN
@@ -97,6 +100,16 @@ abstract class Mixin extends InfoTransform {
if (settings.debug.value) log("new defs of " + clazz + " = " + clazz.info.decls);
}
+ /** Add all members to be mixed in into a (non-trait-) class
+ * These are:
+ * for every mixin trait T that is not also inherited by the superclass:
+ * add late interface members to T and then:
+ * - if a member M of T is forwarded to the implementation class, a forwarder for M
+ * unless one exists already
+ * - for every abstract accessor in T, add a field and an implementation for that acessor
+ * - for every super accessor in T, add an implementation of that accessor
+ * - for every module in T, add a module
+ */
def addMixedinMembers(clazz: Symbol): unit = {
if (!(clazz hasFlag MIXEDIN) && (clazz != ObjectClass)) {
assert(!clazz.isTrait, clazz)
@@ -107,7 +120,7 @@ abstract class Mixin extends InfoTransform {
//System.out.println("adding members of " + clazz.info.baseClasses.tail.takeWhile(superclazz !=) + " to " + clazz);//DEBUG
val mixins = clazz.info.baseClasses.tail.takeWhile(superclazz !=)
def mixinMembers(mixinClass: Symbol): unit = {
- //Console.println("mixin members of "+mixinClass+" to "+clazz+" "+clazz.info.baseClasses)//DEBUG
+ //Console.println("mixin members of "+mixinClass+":"+mixinClass.info.decls+" into "+clazz)//DEBUG
if (mixinClass.isImplClass) {
addLateInterfaceMembers(mixinClass.toInterface)
for (val member <- mixinClass.info.decls.toList) {