summaryrefslogtreecommitdiff
path: root/sources/scalac
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2003-10-15 14:56:49 +0000
committerpaltherr <paltherr@epfl.ch>2003-10-15 14:56:49 +0000
commit79d406a6e924e5257230f5442e30df75642140aa (patch)
treeb32b61bf74b1bb4c5298ca60e9d14b9c43db29fa /sources/scalac
parent85ecdee41a4619105433e29ee3ed97e127ecf8d5 (diff)
downloadscala-79d406a6e924e5257230f5442e30df75642140aa.tar.gz
scala-79d406a6e924e5257230f5442e30df75642140aa.tar.bz2
scala-79d406a6e924e5257230f5442e30df75642140aa.zip
- Cleaned
Diffstat (limited to 'sources/scalac')
-rw-r--r--sources/scalac/transformer/Erasure.java90
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();