summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-09-12 20:51:21 +0000
committerpaltherr <paltherr@epfl.ch>2003-09-12 20:51:21 +0000
commit8c482d22ebf6c86a436b767422890473f8959aae (patch)
tree65912459aa766da2a9a05b43f30bee511c4aee3c /sources
parent33fa93d62b111d62de267943bdb6a7674f392a07 (diff)
downloadscala-8c482d22ebf6c86a436b767422890473f8959aae.tar.gz
scala-8c482d22ebf6c86a436b767422890473f8959aae.tar.bz2
scala-8c482d22ebf6c86a436b767422890473f8959aae.zip
- Augmented symbol map with abstract types from...
- Augmented symbol map with abstract types from superinterfaces.
Diffstat (limited to 'sources')
-rw-r--r--sources/scalac/transformer/ExpandMixins.java29
1 files changed, 29 insertions, 0 deletions
diff --git a/sources/scalac/transformer/ExpandMixins.java b/sources/scalac/transformer/ExpandMixins.java
index c0657b1513..6492a1d658 100644
--- a/sources/scalac/transformer/ExpandMixins.java
+++ b/sources/scalac/transformer/ExpandMixins.java
@@ -98,6 +98,7 @@ public class ClassExpander {
inlineMixinTParams(type);
Tree.Apply constr = (Tree.Apply)template.parents[i];
inlineMixinVParams(mixin.valueParams(), constr.args);
+ handleMixinInterfaceMembers(mixin);
inlineMixinMembers(mixin.nextInfo().members(), impl);
parents[i] = Type.TypeRef(prefix, iface, args);
template.parents[i] = gen.mkPrimaryConstr(constr.pos, parents[i]);
@@ -160,6 +161,34 @@ public class ClassExpander {
}
}
+ // !!! This is just rapid fix. Needs to be reviewed.
+ private void handleMixinInterfaceMembers(Symbol mixin) {
+ Type[] parents = mixin.info().parents();
+ //assert parents.length == 2: Debug.show(mixin) +" -- "+ mixin.info();
+ for (int i = 1; i < parents.length; i++)
+ handleMixinInterfaceMembersRec(parents[i].symbol());
+ }
+ private void handleMixinInterfaceMembersRec(Symbol interfase) {
+ handleMixinInterfaceMembersAux(interfase.nextInfo().members());
+ Type[] parents = interfase.parents();
+ for (int i = 0; i < parents.length; i++) {
+ Symbol clasz = parents[i].symbol();
+ if (clasz.isInterface()) handleMixinInterfaceMembersRec(clasz);
+ }
+ }
+ private void handleMixinInterfaceMembersAux(Scope symbols) {
+ for (SymbolIterator i = symbols.iterator(true); i.hasNext();) {
+ Symbol member = i.next();
+ if (member.kind != scalac.symtab.Kinds.TYPE) continue;
+ Symbol subst = clasz.thisType().memberType(member).symbol();
+ if (subst == member) continue;
+ Symbol subst1 = map.lookupSymbol(member);
+ assert subst1 == null || subst1 == subst:
+ Debug.show(member," -> ",subst," + ",subst1);
+ if (subst1 == null) map.insertSymbol(member, subst);
+ }
+ }
+
private void inlineMixinMembers(Scope symbols, Template mixin) {
// The map names is used to implement an all or nothing
// strategy for overloaded symbols.