import java.util.*; import Jakarta.util.FixDosOutputStream; import java.io.*; public class ConDecl { public void harvestConstructors( int stage ) { // Step 0: do nothing if we are within quoted text if ( stage != 0 ) { super.harvestConstructors( stage ); return; } // Step 1: get the constructor's formal parameter list AST_ParList p = ( AST_ParList ) arg[2].arg[0]; // Step 2: remember this constructor for possible later refinement. // see the reduce2java method of RefCons for details if ( p == null ) kernelConstants.globals().j2jbase.constructorTable.put( "", this ); else kernelConstants.globals().j2jbase.constructorTable.put( p.Signature(), this ); // Step 3: form the call to super String supercall = "{ super(); }"; if ( p != null ) supercall= "{ super(" + p.onlyParams() + "); }"; // Step 4: form constructor as a string String constructor = arg[0].toString() // modifiers + arg[1].toString() // QName + " ( " // "(" + arg[2].toString() // [AST_ParList] + " ) " // ")" + arg[3].toString() // [ThrowsClause] + supercall; // super(...) // Step 5: convert into tree; actual constructor is the // first element on the AST_FieldDecl list AST_FieldDecl f = AST_FieldDecl.MakeAST( constructor ); ConDecl cd = ( ConDecl ) f.arg[0].arg[0]; // Step 6: add constructor to those that will be inherited // by all subclasses (again, useful only for Mixin // produced-files String sig = ""; AST_ParList pl = ( AST_ParList ) arg[2].arg[0]; if ( pl != null ) sig = pl.Signature(); kernelConstants.globals().j2jbase.inheritedCons.add( sig, cd, tok[0] ); // Step 7: finally, search the body of the constructor // for any ConSSuper instances arg[4].harvestConstructors( stage ); } // the following marker is needed for correctly translating // "this" constructs. See ThisPre.jak public void reduce2java( AstProperties props ) { props.setProperty( "insideConstructor", "" ); super.reduce2java(props); props.removeProperty( "insideConstructor" ); } public void changeNameTo( String name ) { arg[1].tok[0].setTokenName( name ); } }