

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

   /** production
       UnmodifiedInterfaceDeclaration
: "interface" QName [ IntExtClause ]
"{" [ InterfaceMemberDeclarations ] "}"::UmInterDecl
;
   *
   * @layer<CompInt>
   */

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

    public String GetType() {
        return "interface";
    }
      
    public void compose( AstNode etree ) {
        // etree is of type Ute.
        // composition of interface declarations involves four steps.
        // (.) check to see if the names of the base and extension are
        //     the same
        // (a) etree is of type Ute.  get UnmodifiedTypeExtension
        //     as the correct tree argument
        // (b) compose extends lists
        // (c) compose list of member declarations

        // Step 0: check the names
        String bname = arg[0].tok[0].tokenName();
        String ename = etree.arg[0].arg[0].tok[0].tokenName();
        if ( !bname.equals( ename ) )
            AstNode.fatalError( tok[0], 
                       "names of base (" + bname + ") and refinement (" +
                   ename + ") are different:" );

        // Step 1: get correct composition tree

        UmodIntExt e = ( UmodIntExt ) etree.arg[0];
         
        // Step 2: if both the base extends list and extension
        //         extends list are not empty, then compose them
        //         otherwise set the base to be the non-empty list
        //         of the two.

        kernelConstants.globals().isBaseAnInterface = true;
        arg[1].compose( e.arg[1] );

        // Step 3: now compose interface member declarations

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