diff options
author | paltherr <paltherr@epfl.ch> | 2003-09-12 20:51:21 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-09-12 20:51:21 +0000 |
commit | 8c482d22ebf6c86a436b767422890473f8959aae (patch) | |
tree | 65912459aa766da2a9a05b43f30bee511c4aee3c /sources/scalac | |
parent | 33fa93d62b111d62de267943bdb6a7674f392a07 (diff) | |
download | scala-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/scalac')
-rw-r--r-- | sources/scalac/transformer/ExpandMixins.java | 29 |
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. |