diff options
author | paltherr <paltherr@epfl.ch> | 2003-10-15 14:56:49 +0000 |
---|---|---|
committer | paltherr <paltherr@epfl.ch> | 2003-10-15 14:56:49 +0000 |
commit | 79d406a6e924e5257230f5442e30df75642140aa (patch) | |
tree | b32b61bf74b1bb4c5298ca60e9d14b9c43db29fa | |
parent | 85ecdee41a4619105433e29ee3ed97e127ecf8d5 (diff) | |
download | scala-79d406a6e924e5257230f5442e30df75642140aa.tar.gz scala-79d406a6e924e5257230f5442e30df75642140aa.tar.bz2 scala-79d406a6e924e5257230f5442e30df75642140aa.zip |
- Cleaned
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 90 |
1 files changed, 41 insertions, 49 deletions
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java index 951f4375bd..e9b9f3020b 100644 --- a/sources/scalac/transformer/Erasure.java +++ b/sources/scalac/transformer/Erasure.java @@ -356,28 +356,51 @@ public class Erasure extends Transformer implements Modifiers { assert tree.type != null : tree; Type owntype = eraseFully ? tree.type.fullErasure() : tree.type.erasure(); switch (tree) { - case ClassDef(_, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Template impl): + case ClassDef(_, _, _, _, _, Template(_, Tree[] body)): Symbol oldCurrentClass = currentClass; - currentClass = tree.symbol(); - Tree newTree = - copy.ClassDef(tree, new AbsTypeDef[0], - transform(vparams), tpe, transform(impl, tree.symbol())) - .setType(owntype); + TreeList savedBridges = bridges; + HashMap savedBridgeSyms = bridgeSyms; + Symbol clazz = currentClass = tree.symbol(); + bridges = new TreeList(); + bridgeSyms = new HashMap(); + + TreeList body1 = new TreeList(transform(body)); + if (!clazz.isInterface()) addInterfaceBridges(clazz); + body1.append(bridges); + if (bridges.length() > 0) { + Type info = clazz.nextInfo(); + switch (info) { + case CompoundType(Type[] parts, Scope members): + members = new Scope(members); + for (int i = 0; i < bridges.length(); i++) { + Tree bridge = (Tree)bridges.get(i); + members.enterOrOverload(bridge.symbol()); + } + clazz.updateInfo(Type.compoundType(parts, members, info.symbol())); + break; + default: + throw Debug.abort("class = " + Debug.show(clazz) + ", " + + "info = " + Debug.show(info)); + } + } + Tree newTree = gen.ClassDef(clazz, body1.toArray()); + + bridgeSyms = savedBridgeSyms; + bridges = savedBridges; currentClass = oldCurrentClass; return newTree; - case DefDef(_, _, AbsTypeDef[] tparams, ValDef[][] vparams, Tree tpe, Tree rhs): - addBridges(tree.symbol()); - Tree tpe1 = gen.mkType(tpe.pos, tpe.type.fullErasure()); - Tree rhs1 = (rhs == Tree.Empty) ? rhs : transform(rhs, tpe1.type); - return copy.DefDef( - tree, new AbsTypeDef[0], transform(vparams), tpe1, rhs1) - .setType(owntype); + case DefDef(_, _, _, _, _, Tree rhs): + Symbol method = tree.symbol(); + addBridges(method); + if (rhs != Tree.Empty) + rhs = transform(rhs, method.nextType().resultType()); + return gen.DefDef(method, rhs); - case ValDef(_, _, Tree tpe, Tree rhs): - Tree tpe1 = transform(tpe); - Tree rhs1 = (rhs == Tree.Empty) ? rhs : transform(rhs, tpe1.type); - return copy.ValDef(tree, tpe1, rhs1).setType(owntype); + case ValDef(_, _, _, Tree rhs): + Symbol field = tree.symbol(); + if (rhs != Tree.Empty) rhs = transform(rhs, field.nextType()); + return gen.ValDef(field, rhs); case AbsTypeDef(_, _, _, _): case AliasTypeDef(_, _, _, _): @@ -388,7 +411,7 @@ public class Erasure extends Transformer implements Modifiers { Tree[] newStats = new Tree[stats.length]; for (int i = 0; i < stats.length; ++i) newStats[i] = transform(stats[i], true); - return copy.Block(tree, newStats).setType(owntype.fullErasure()); + return gen.Block(tree.pos, newStats); case Assign(Tree lhs, Tree rhs): Tree lhs1 = transformLhs(lhs); @@ -592,37 +615,6 @@ public class Erasure extends Transformer implements Modifiers { return transform(tree, false); } - public Template transform(Template templ, Symbol clazz) { - TreeList savedBridges = bridges; - HashMap savedBridgeSyms = bridgeSyms; - bridges = new TreeList(); - bridgeSyms = new HashMap(); - Tree[] bases1 = transform(templ.parents); - TreeList body1 = new TreeList(transform(templ.body)); - if (!clazz.isInterface()) addInterfaceBridges(clazz); - body1.append(bridges); - if (bridges.length() > 0) { - Type info = clazz.nextInfo(); - switch (info) { - case CompoundType(Type[] parts, Scope members): - members = new Scope(members); - for (int i = 0; i < bridges.length(); i++) { - Tree bridge = (Tree)bridges.get(i); - members.enterOrOverload(bridge.symbol()); - } - clazz.updateInfo(Type.compoundType(parts, members, info.symbol())); - break; - default: - throw Debug.abort("class = " + Debug.show(clazz) + ", " + - "info = " + Debug.show(info)); - } - } - bridges = savedBridges; - bridgeSyms = savedBridgeSyms; - return (Template) copy.Template(templ, bases1, body1.toArray()) - .setType(templ.type.erasure()); - } - // !!! This is just rapid fix. Needs to be reviewed. private void addInterfaceBridges(Symbol owner) { Type[] parents = owner.info().parents(); |