import java.util.*; import Jakarta.util.FixDosOutputStream; import Jakarta.util.Util2; import java.io.*; public class ConDecl { public void ok2compose( int stage, Hashtable hb ) {} public String signature() { // Signature of a constructor is "<name>(<signature of arguments>" // Step 1: get name String result = arg[1].tok[0].tokenName() + "("; // Step 2: add signature of arguments AST_ParList p = ( AST_ParList ) arg[2].arg[0]; if ( p != null ) result = result + p.signature(); return result; } public void add2Hash( Hashtable h ) { h.put( signature(), this ); } // cleanUpBase is where composition of constructors and their refinements // is performed. public void cleanUpBase( AstCursor k, Hashtable he ) { // Step 1: see if extension has a constructor that can be composed. String sig = signature(); AstNode c = ( AstNode ) he.get( sig ); if ( c == null ) return; if ( c instanceof RefCons ) { // Step 2: get variables for the base code and extension code // both are of type AST_Stmt AstList baseCode = ( AstList ) arg[5].arg[0]; AstList extCode = ( AstList ) c.arg[2].arg[0]; // Step 3: create the new body of the constructor AST_Stmt body =(AST_Stmt) AstNode.markStack(AstNode.aliasStack.size(), (AST_Stmt) new AST_Stmt() .add( (AST_StmtElem) new AST_StmtElem().setParms( (BlockC) new BlockC().setParms( new AstToken().setParms(" ","{", 0), new AstOptNode( ).setParms( (AST_Stmt) new AST_Stmt() .add( (AST_Stmt) AstNode.addComment( AstNode.safeCopy( baseCode),"\r\n ")) ) /* AstOptNode */ , new AstToken().setParms("\r\n ","}", 0)) /* BlockC */ ))/* AST_StmtElem + add */ .add( (AST_StmtElem) new AST_StmtElem().setParms( (BlockC) new BlockC().setParms( new AstToken().setParms(" ","{", 0), new AstOptNode( ).setParms( (AST_Stmt) new AST_Stmt() .add( (AST_Stmt) AstNode.addComment( AstNode.safeCopy( extCode),"\r\n ")) ) /* AstOptNode */ , new AstToken().setParms("\r\n ","}", 0)) /* BlockC */ ))/* AST_StmtElem + add */ ).patch() ; // Step 4: replace old body with new body arg[5].Replace( body ); // Step 5: delete refinement from extension c.Delete(); } else if ( c instanceof ConDecl ) AstNode.error( arg[1].tok[0], "Overriding of constructor with signature " + sig + ") not permitted" ); else AstNode.error( arg[1].tok[0], "Unrecognized constructor declaration with signature " + sig + ") in extension" ); } public void compose( AstNode etree ) { AstNode.fatalError( arg[1].tok[0], "cannot redefine constructor " + signature() + ")" ); } }