summaryrefslogtreecommitdiff
path: root/sources/scalac/transformer/AddConstructors.java
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2003-03-04 10:48:41 +0000
committermihaylov <mihaylov@epfl.ch>2003-03-04 10:48:41 +0000
commite5583b7c1132cb2f35cef316507f5d2b4a18dbe3 (patch)
tree3fdf8efe1c748e8193808934b85ecf4e819ef8e7 /sources/scalac/transformer/AddConstructors.java
parent9427388e5a5817cda5252d2e1edb13bb9dc60973 (diff)
downloadscala-e5583b7c1132cb2f35cef316507f5d2b4a18dbe3.tar.gz
scala-e5583b7c1132cb2f35cef316507f5d2b4a18dbe3.tar.bz2
scala-e5583b7c1132cb2f35cef316507f5d2b4a18dbe3.zip
Set the correct owner of the constructor symbol.
Diffstat (limited to 'sources/scalac/transformer/AddConstructors.java')
-rw-r--r--sources/scalac/transformer/AddConstructors.java113
1 files changed, 38 insertions, 75 deletions
diff --git a/sources/scalac/transformer/AddConstructors.java b/sources/scalac/transformer/AddConstructors.java
index 63781c43cc..160839c6d8 100644
--- a/sources/scalac/transformer/AddConstructors.java
+++ b/sources/scalac/transformer/AddConstructors.java
@@ -48,7 +48,7 @@ import scalac.util.Debug;
*/
public class AddConstructors extends Transformer {
- public final static Name CTOR_N = Name.fromString("<init>");
+ public final static Name CTOR_N = Name.fromString("<init>").toConstrName();
// True iff we generate code for INT backend.
protected final boolean forINT;
@@ -59,7 +59,9 @@ public class AddConstructors extends Transformer {
final HashMap constructors;
- public AddConstructors(Global global, AddConstructorsPhase descr, HashMap constructors) {
+ public AddConstructors(Global global,
+ AddConstructorsPhase descr,
+ HashMap constructors) {
super(global, descr);
this.constructors = constructors;
this.forINT = global.target == global.TARGET_INT;
@@ -71,30 +73,32 @@ public class AddConstructors extends Transformer {
*/
Symbol getConstructor(Symbol classConstr) {
return getConstructor(classConstr,
- (((Type.MethodType)classConstr.info()).vparams));
+ (((Type.MethodType)classConstr.info()).vparams),
+ classConstr.primaryConstructorClass());
}
- Symbol getConstructor(Symbol classConstr, Symbol[] paramSyms) {
- //assert (classConstr.flags & Modifiers.CONSTRUCTOR) != 0:
-// assert classConstr.isConstructor() :
-// "Constructor functions not implemented yet! " +
-// Debug.show(classConstr);
+ Symbol getConstructor(Symbol classConstr, Symbol[] paramSyms, Symbol owner) {
+ assert classConstr.isConstructor() :
+ "Class constructor expected: " + Debug.show(classConstr);
+
Symbol constr = (Symbol) constructors.get(classConstr);
if (constr == null) {
- Symbol clazz = classConstr.primaryConstructorClass();
+ assert !owner.isInterface();
int flags = forJVM
? classConstr.flags & (Modifiers.PRIVATE | Modifiers.PROTECTED)
: classConstr.flags;
constr =
- new TermSymbol(classConstr.pos, CTOR_N, clazz, flags);
- constr.setInfo(Type.MethodType
- (paramSyms, //((Type.MethodType)classConstr.info()).vparams,
- forJVM || forMSIL
- ? global.definitions.UNIT_TYPE
- : clazz.type()).erasure());
+ new TermSymbol(classConstr.pos, CTOR_N, owner, flags);
+
+ Type constrType = Type.MethodType
+ (paramSyms, forJVM ?
+ global.definitions.UNIT_TYPE : owner.type()).erasure();
+
+ constr.setInfo(constrType.erasure());
constructors.put(classConstr, constr);
constructors.put(constr, constr);
}
+
return constr;
}
@@ -105,21 +109,11 @@ public class AddConstructors extends Transformer {
switch (tree) {
case ClassDef(_, _, _, ValDef[][] vparams, _, //:
Template(Tree[] baseClasses, Tree[] body)):
- if (treeSym.isInterface())
- return tree;
assert treeSym.name.isTypeName();
- /*
- System.out.println("Class parameters in the tree:");
- Param[] pparams = vparams[0];
- for (int i = 0; i < pparams.length; i++)
- System.out.println("\t" + Debug.show(pparams[i].symbol()));
- System.out.println("Class parameters in the constructor:");
- Symbol[] sparams = ((Type.MethodType)treeSym.constructor().info()).vparams;
- for (int i = 0; i < sparams.length; i++)
- System.out.println("\t" + Debug.show(sparams[i]));
- */
+ if (treeSym.isInterface())
+ return tree;
Symbol[] paramSyms = new Symbol[vparams[0].length];
for (int i = 0; i < paramSyms.length; i++)
@@ -127,13 +121,19 @@ public class AddConstructors extends Transformer {
ArrayList constrBody = new ArrayList();
ArrayList classBody = new ArrayList();
- Symbol constrSym = getConstructor(treeSym.constructor(), paramSyms);
+ Symbol constrSym =
+ getConstructor(treeSym.constructor(), paramSyms, treeSym);
Scope classScope = new Scope();
classScope.enter(constrSym);
+ assert constrSym.owner() == treeSym :
+ "Wrong owner of the constructor: \n\tfound: " +
+ Debug.show(constrSym.owner()) + "\n\texpected: " +
+ Debug.show(treeSym);
+
// inline the call to the super constructor
Type superType = treeSym.parents()[0];
- if ( !forINT || !superType.symbol().isJava())
+ if ( !forINT || !superType.symbol().isJava()) {
switch (baseClasses[0]) {
case Apply(Tree fun, Tree[] args):
int pos = baseClasses[0].pos;
@@ -144,6 +144,7 @@ public class AddConstructors extends Transformer {
break;
default: assert false;
}
+ }
// for every ValDef move the initialization code into the constructor
for (int i = 0; i < body.length; i++) {
@@ -151,13 +152,14 @@ public class AddConstructors extends Transformer {
if (t.definesSymbol()) {
Symbol sym = t.symbol();
switch (t) {
- case ValDef(_,_,_,Tree rhs):
+ case ValDef(_, _, _, Tree rhs):
if (rhs != Tree.Empty) {
// !!!FIXME: revert to this.whatever when the bug is fixed
//Tree ident = gen.Select(gen.This(t.pos, treeSym), sym);
Tree ident = gen.Ident(sym);
- constrBody.add(gen.Assign(t.pos, ident, transform(rhs)));
+ constrBody.add
+ (gen.Assign(t.pos, ident, transform(rhs)));
t = gen.ValDef(sym, Tree.Empty);
}
break;
@@ -171,13 +173,13 @@ public class AddConstructors extends Transformer {
// add result expression consistent with the
// result type of the constructor
- //if (! forJVM)
- // constrBody.add(gen.This(tree.pos, treeSym));
+ if (! forJVM)
+ constrBody.add(gen.This(tree.pos, treeSym));
Tree constrTree = constrBody.size() > 1 ?
- gen.Block((Tree[])constrBody.toArray(new Tree[constrBody.size()])):
+ gen.Block((Tree[])constrBody.
+ toArray(new Tree[constrBody.size()])):
(Tree) constrBody.get(0);
- // add constructor definition to the body of the class
classBody.add(gen.DefDef(tree.pos, constrSym, constrTree));
// strip off the class constructor from parameters
@@ -190,11 +192,8 @@ public class AddConstructors extends Transformer {
}
Type classType =
-// Type.CompoundType(treeSym.parents(), classScope);
Type.compoundType(treeSym.parents(), classScope, treeSym);
Symbol classSym = treeSym.updateInfo(classType);
- //fixConstructor(classSym);
-
Tree[] newBody = (Tree[]) classBody.toArray(Tree.EMPTY_ARRAY);
return gen.ClassDef(classSym, newBody);
@@ -212,45 +211,9 @@ public class AddConstructors extends Transformer {
}
break;
- // is this still needed?
- case Ident(Name name):
- if (treeSym.isConstructor()) {
- Debug.abort("Not implemented yet: using class constructor as function!");
- //return gen.mkId(tree.pos, getConstructor(treeSym));
- }
- //System.out.println("Processing " + Debug.show(treeSym));
- break;
-
- // is this still needed?
- case Select(Tree qualifier, Name selector):
- if (treeSym.isConstructor()) {
- Debug.abort("Not implemented yet: using class constructor as function!");
- //return gen.mkSel(tree.pos, transform(qualifier), getConstructor(treeSym));
- }
- break;
-
} // switch(tree)
+
return super.transform(tree);
} // transform()
-// /** Given a symbol of a class it strips off the parameters
-// * from the MethodType of the constructor of that class
-// * and all its superclasses
-// */
-// public void fixConstructor(Symbol clazz) {
-// if (clazz != global.definitions.ANY_CLASS) {
-// switch (clazz.constructor().info()) {
-// case MethodType(Symbol[] params, Type result):
-// if (params.length > 0) {
-// clazz.constructor().updateInfo
-// (Type.MethodType(Symbol.EMPTY_ARRAY, result));
-// }
-// //fixConstructor(clazz.basetypes()[0].symbol());
-// break;
-// default:
-// assert false : "Constructor should have a method type!";
-// }
-// }
-// }
-
} // class AddConstructors