import java.util.*; import Jakarta.util.FixDosOutputStream; import java.io.*; /** production InterfaceMemberDeclarations : (InterfaceMemberDeclaration)+ ; * * @layer<CompInt> */ public class InterfaceMemberDeclarations { public AstList makeList( AstNode n ) { InterfaceMemberDeclarations l = new InterfaceMemberDeclarations(); l.add( new InterfaceMemberDeclarationsElem().setParms( n ) ); return l; } public void compose( AstNode etree ) { // Composition algorithm is reasonably straightforward. // (a) collect all the signatures of interface members // of the base into a hash table. // (b) for each member of the extension, see if there is a // corresponding member in the base. if so, compose them -- // and remove the member from the extension. // (c) the remaining members on the extension list are to be // added to the base list. // (d) optionally typeSort the list of composed declarations // Step 1: collect signatures of base interface members into a // hash table Hashtable h = new Hashtable(); AstCursor c = new AstCursor(); for ( c.FirstElement( this ); c.MoreElement(); c.NextElement() ) { ( ( InterfaceMemberDeclaration ) c.node ).add2Hash( h ); } // Step 2: for each member of the extension, see if it is present // in the base InterfaceMemberDeclaration d; for ( c.FirstElement( etree ); c.MoreElement(); c.NextElement() ) { if ( ( ( InterfaceMemberDeclaration ) c.node ).actOnHash( h ) ) c.Delete(); } // Step 3: the remaining members on the extension list should // be added to the base list this.add( ( AstList ) etree ); // Step 4: optionally typeSort the list of declarations if ( Main.typeSort ) typeSort( new InterfaceMemberDeclarations() ); } }