summaryrefslogtreecommitdiff
path: root/sources/scala/tools/nsc/transform/Mixin.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-09-07 17:37:12 +0000
committerMartin Odersky <odersky@gmail.com>2005-09-07 17:37:12 +0000
commit5d7078f6b8e9c59c945bfcd421342df27ebc43b3 (patch)
tree5f61050f4a2fee61281811f687300dfdae6ce385 /sources/scala/tools/nsc/transform/Mixin.scala
parent7517bd975a89466dbe5e2a2e415a48588e7b8c1a (diff)
downloadscala-5d7078f6b8e9c59c945bfcd421342df27ebc43b3.tar.gz
scala-5d7078f6b8e9c59c945bfcd421342df27ebc43b3.tar.bz2
scala-5d7078f6b8e9c59c945bfcd421342df27ebc43b3.zip
*** empty log message ***
Diffstat (limited to 'sources/scala/tools/nsc/transform/Mixin.scala')
-rwxr-xr-xsources/scala/tools/nsc/transform/Mixin.scala60
1 files changed, 25 insertions, 35 deletions
diff --git a/sources/scala/tools/nsc/transform/Mixin.scala b/sources/scala/tools/nsc/transform/Mixin.scala
index 659659b3c5..5dfd7973cd 100755
--- a/sources/scala/tools/nsc/transform/Mixin.scala
+++ b/sources/scala/tools/nsc/transform/Mixin.scala
@@ -30,7 +30,14 @@ abstract class Mixin extends InfoTransform {
case Super(_, mix) => mix != nme.EMPTY.toTypeName
case _ => false
}
+/*
+ def toImplClass(sym: Symbol): Symbol = {
+ val impl = clazz.owner.info.decl(nme.IMPL_CLASS_NAME(clazz.name));
+
+ }
+ def toInterface(sym: Symbol): Symbol;
+*/
def toInterface(tp: Type): Type =
if (tp.symbol.isImplClass) {
val iface = tp.parents.last;
@@ -68,42 +75,30 @@ abstract class Mixin extends InfoTransform {
case ClassInfoType(parents, decls, clazz) =>
var parents1 = parents;
var decls1 = decls;
+ def addMember(member: Symbol): unit = {
+ if (decls1 eq decls) decls1 = new Scope(decls.toList);
+ System.out.println("new member of " + clazz + ":" + member);//debug
+ decls1 enter member
+ }
if (clazz.isPackageClass) {
for (val sym <- decls.elements) {
if (sym.isImplClass) {
sym setFlag lateMODULE;
- val sourceModule =
+ addMember(
clazz.newModule(sym.pos, sym.name.toTermName, sym.asInstanceOf[ClassSymbol])
- setInfo sym.tpe;
- if (decls1 eq decls) decls1 = new Scope(decls.toList);
- System.out.println("new member of " + clazz + ":" + sourceModule);//debug
- decls1 enter sourceModule;
+ setInfo sym.tpe)
}
}
/*
- } else if (clazz hasFlag lateINTERFACE) {
- val impl = clazz.owner.decl(nme.IMPL_CLASS_NAME(clazz.name));
+ } else if (clazz hasFlag lateINTEunPiRFACE) {
+ val impl = clazz.owner.info.decl(nme.IMPL_CLASS_NAME(clazz.name));
assert(impl != NoSymbol, clazz);
for (val member <- impl.info.decls.toList) {
- if (!member.isMethod && member.hasFlag(PRIVATE)) {
- addMember(
- clazz.newMethod(member.pos, nme.GETTER_NAME(name))
- setFlag(DEFERRED | ACCESSOR) setInfo member.tpe);
- addMember(
- clazz.newmethod(member.pos, nme.SETTER_NAME(name))
- setFlag(DEFERRED | ACCESSOR) setInfo MethodType(member.tpe, UnitClass.tpe));
- }
-
-
- if (member.getter == NoSymbol) {
- if (decls1 eq decls) decls1 = new Scope(decls.toList);
- decls1 enter member.newGetter.notPrivate;
- }
- if (member.setter == NoSymbol) {
- if (decls1 eq decls) decls1 = new Scope(decls.toList);
- decls1 enter member.newSetter.notPrivate;
- }
- }
+ if (!member.isMethod && member.hasFlag(PRIVATE) && !member.tpe.isInstanceOf[ConstantType]) {
+ if (member.getter == NoSymbol) addMember(makeGetter(member));
+ if (member.setter == NoSymbol) addMember(makeSetter(member));
+ }
+ }
*/
} else if (clazz.isImplClass) {
transformInfo(clazz.owner, clazz.owner.info);
@@ -111,25 +106,20 @@ abstract class Mixin extends InfoTransform {
decls1 = new Scope(decls.toList filter isForwarded)
} else if (!parents.isEmpty) {
parents1 = parents.head :: (parents.tail map toInterface);
- for (val bc <- clazz.info.baseClasses.tail.takeWhile(parents.head.symbol !=))
+ for (val bc <- clazz.info.baseClasses.tail.takeWhile(parents.head.symbol !=)) {
if (bc.isImplClass) {
for (val member <- bc.info.decls.toList) {
- if (!isStatic(member) &&
- ((member hasFlag PRIVATE) ||
- (clazz.info.member(member.name).alternatives contains member))) {
- if (decls1 eq decls) decls1 = new Scope(decls.toList);
+ if (!(clazz.info.member(member.name).alternatives contains member)) {
val member1 = member.cloneSymbol(clazz) setFlag MIXEDIN;
if (isForwarded(member))
member1.asInstanceOf[TermSymbol] setAlias member;
else if (member1 hasFlag SUPERACCESSOR)
member1.asInstanceOf[TermSymbol] setAlias rebindSuper(clazz, member.alias, bc);
- else
- makeUnique(decls1, member1);
- System.out.println("new member of " + clazz + ":" + member1);//debug
- decls1 enter member1
+ addMember(member1)
}
}
}
+ }
}
if ((parents1 eq parents) && (decls1 eq decls)) tp else ClassInfoType(parents, decls1, clazz)
case MethodType(formals, restp) =>