

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

public class UmodClassDecl {
    public String GetName() {
        return arg[0].tok[0].tokenName();
    }

    public String GetType() {
        return "class";
    }
           
    public void compose( AstNode etree ) {
        // etree is of type Ute -- convert this into UmodClassExt
        // composition of class declarations involves three steps.
        // (a) etree is of type Ute -- translate into UmodClassExt
        // (b) compose implements lists
        // (c) compose classbody

        // Step 0: set flag for error checking

        kernelConstants.globals().compclass.isBaseAClass = true;

        // Step 1: convert etree and check to see if 
        //         names are the same

        UmodClassExt e = ( UmodClassExt ) etree.arg[0];
        String bname = arg[0].tok[0].tokenName();
        String ename = e.arg[0].tok[0].tokenName();
        if ( !bname.equals( ename ) )
            AstNode.fatalError( tok[0], 
                         "attempting to compose files with different names: " +
                     bname + "  " + ename );

        // Step 2: if both the base implements list and extension
        //         implements list are not empty, then compose them
        //         otherwise set the base to be the non-empty list
        //         of the two.

        arg[2].compose( e.arg[1] );

        // Step 3: compose corresponding AST_FieldDeclarations -- there
        //         are no additional extension code fragments, so pass in
        //         a null linked list

        arg[3].arg[0].arg[0] = 
                AST_FieldDecl.compose( arg[3].arg[0].arg[0], 
                                     e.arg[2].arg[0].arg[0], null );
    }
/*
      // called when the base class/extension is empty ({})
      // it merely checks if references to Base() are correct --

      private void checkExtension( $TEqn.AstNode n ) {
          
         // Step 1: collect signatures of all class member declarations
         //         in both the base and extension declarations
         Hashtable          hb = new Hashtable();
         Hashtable          he = new Hashtable();
         $TEqn.AstCursor     c = new $TEqn.AstCursor();

         // Step 2: n is a ClassBody, n.arg[0] is an AstOptNode
         //         n.arg[0].arg[0] is a AST_FieldDecl

         $TEqn.AST_FieldDecl e = ($TEqn.AST_FieldDecl) n.arg[0].arg[0];
         for ( c.FirstElement(e); c.MoreElement(); c.NextElement() ) { 
             (($TEqn.ClassBodyDeclaration) c.node).add2Hash(he);
         }

         // Step 2: invoke baseRewrite to rewrite all "Base(...).method(...)"
         //         invocations in the extension

         e.baseRewrite( hb, he, 0 );
      }
      */
}
