From e5583b7c1132cb2f35cef316507f5d2b4a18dbe3 Mon Sep 17 00:00:00 2001 From: mihaylov Date: Tue, 4 Mar 2003 10:48:41 +0000 Subject: Set the correct owner of the constructor symbol. --- sources/scalac/transformer/AddConstructors.java | 113 ++++++++---------------- 1 file changed, 38 insertions(+), 75 deletions(-) (limited to 'sources/scalac/transformer/AddConstructors.java') 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(""); + public final static Name CTOR_N = Name.fromString("").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 -- cgit v1.2.3