import java.util.*; import Jakarta.util.FixDosOutputStream; import java.io.*; //-------------------- MODIFIER LIST COMPOSITION ------------------ /** production: AST_Modifiers<br> : ( Modifier )+<br> ;<br> Modifier<br> : ABSTRACT::ModAbstract<br> | FINAL::ModFinal<br> | PUBLIC::ModPublic<br> | PROTECTED::ModProtected<br> ...<br> ;<br> * * @layer<preprocess> */ public class AST_Modifiers { // search modifier list of base for modifier x. // return true if present public boolean findModifier( Modifier x ) { return findModifier( x.GetName() ); } public boolean findModifier( String mod ) { AstCursor c = new AstCursor(); AST_Modifiers b = ( AST_Modifiers ) this; for ( c.FirstElement( b ); c.MoreElement(); c.NextElement() ) { if ( ( ( Modifier ) ( c.node ) ).GetName().equals( mod ) ) return true; } return false; } public void remModifier( Modifier x ) { AstCursor c = new AstCursor(); AST_Modifiers b = ( AST_Modifiers ) this; String xName = x.GetName(); for ( c.FirstElement( b ); c.MoreElement(); c.NextElement() ) { if ( ( ( Modifier ) ( c.node ) ).GetName().equals( xName ) ) c.Delete(); } } /** compose base AST_Modifier tree with extension AST_Modifier tree * @layer<preprocess> */ public void compose( AstNode etree ) { // Note: I'm cloning the extension tree, as I will be modifying // it. If I didn't do this, all sorts of wierd problems // result AST_Modifiers x = ( AST_Modifiers ) etree.clone(); AST_Modifiers b = ( AST_Modifiers ) this; // Step 1: foreach element e of extension modifiers list // see if e is already present on base modifiers list. // if so, delete it from the extension list AstCursor c = new AstCursor(); for ( c.FirstElement( x ); c.MoreElement(); c.NextElement() ) { if ( findModifier( ( Modifier ) c.node ) ) c.Delete(); } // Step 2: now add the truncated modifier list to the base list b.add( x ); } public void addModifier( Modifier m ) { // Step 1: if modifier already is present, do nothing if ( findModifier( m ) ) return; // Step 2: create a list of length one with m on it AST_Modifiers l = new AST_Modifiers(); l.add( new AST_ModifiersElem().setParms( m ) ); // Step 3: add the modifier to the list this.add( l ); } }