

import java.util.*;
import Jakarta.util.FixDosOutputStream;
import java.io.*;

public class RefCons {

    public void reduce2java( AstProperties props ) {

        // Step 0: if we haven't seen a SoUrCe decl, then we have an error.
        //         RefCons should only occur within the context of a mixin-produced file

        if ( props.getProperty( "SoUrCe" ) == null ) {
            AstNode.error( tok[0], 
                        "constructor refinement illegal in non-mixin-produced file" );
            return;
        }

        // Step 1: register the fact that a constructor refinement has been
        //         reduced.  To see the impact, review the reduce2java method
        //         of ConstructorMarker

        String sig = "";
        AST_ParList parlist = ( AST_ParList ) arg[1].arg[0];
        if ( parlist != null )
            sig = parlist.Signature();
        kernelConstants.globals().j2jbase.refinedSet.add( sig );

        // Step 2: generate the class constructor here.  Get a handle on the
        //         original definition (so that we can generate the correct modifiers
        //         and throws clauses), and proceed accordingly.

        ConDecl c = ( ConDecl )  kernelConstants.globals().j2jbase.constructorTable.get( sig );
        if ( c == null ) {
            String name = arg[0].tok[0].tokenName();
            AstNode.error( tok[0], "refining non-existent constructor " + name );
            return;
        }

        String params = "";
        if ( parlist != null )
            params = parlist.onlyParams();

        c.arg[0].print( props ); // modifiers
        String className = ( String ) props.getProperty( "MixinDeclName" );
        props.print( arg[0].getComment() + className + "(" );
        arg[1].print( props ); // arguments
        props.print( ") " );
        c.arg[3].print( props ); // throws
        props.println( "{ super(" + params + "); " );
        arg[2].reduce2java( props ); // refinement code
        props.println( " }" );
    }
}
