

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

public class MethodDcl {
    public void execute( int stage ) {
        if ( stage != 0 ) {
            super.executeBypass( stage );
            return;
        }
        ;

        // Step 1: form signature of method

        String methType = ( ( AST_TypeName ) arg[1] ).GetSignature();
        String methSig  = ( ( MethodDeclarator ) arg[2] ).GetSignature();
		  String dims     = ( ( MethodDeclarator ) arg[2] ).GetDims();
        String sig = methSig + " " + methType + dims;

        // Step 2: determine if method refines its parent method.
        //         This is done by setting PrimaryPrefix's signature,
        //         and traversing the body of the method.

        PrimaryPrefix.parentSig = methSig;
        String defines =  MMGlobals.Defines;
        try {
            arg[4].execute( stage );
        }
        catch ( ResultException e ) {
            defines =  MMGlobals.Refines;
        }

        // Step 3: create an MMOutput object with this signature
        //         for now, guess that it defines, not refines

        MMOutput o = new  MMOutput().init( sig, 
                                 MMGlobals.Method,
                                defines );
        o.setlines( this.getFirstLineNum(), this.getLastLineNum() );
		  o.setModifiers( (AstOptNode) arg[0] );

		  // Step 3: now harvest the throws clause

		  if (arg[3].arg[0] != null) {
		     NamedVector nv = new NamedVector( MMGlobals.Throws );
			  arg[3].arg[0].harvestAST_QualifiedNames( nv );
			  o.union(nv);

		  }

        // Step 5: now add o to the main object.  If the method
		  //         was already defined (as can happen in a mixin-produced
		  //         file), add the throws clauses

        MMOutput m =  Main.mmresult;
		  if (m.nested.containsKey(sig)) {
		     ((MMOutput) m.nested.get(sig)).merge(o);
		  }
		  else {
           m.nested.putUnique( sig, o );
		  }
    }
}
