import java.util.*; import Jakarta.util.FixDosOutputStream; import java.io.*; /*********************** AST_IMPORT CODE *************************** * @layer<preprocess> */ /** production AST_Imports<br> : ( ImportDeclaration )+<br> ;<br> **/ public class AST_Imports { private boolean findImport( ImpQual x ) { AstCursor c = new AstCursor(); AST_Imports b = ( AST_Imports ) this; String xName = x.GetName(); for ( c.FirstElement( b ); c.MoreElement(); c.NextElement() ) { if ( ( ( ImportDeclaration ) ( c.node ) ).GetName().equals( xName ) ) return true; } return false; } /** algorithm is to compose sequence of import statements ideally without replicating imports. etree points to an AST_Imports object * * @layer<preprocess> */ /** compose sequence of base import declarations with extension import declarations without replication */ public void compose( AstNode etree ) { AST_Imports b = ( AST_Imports ) this; AST_Imports x = ( AST_Imports ) etree; // Step 1: foreach element e of extension imports list // see if e is already present on base imports list. // if so, delete it from the extension list AstCursor c = new AstCursor(); for ( c.FirstElement( x ); c.MoreElement(); c.NextElement() ) { if ( findImport( ( ImpQual ) c.node ) ) c.Delete(); } // Step 2: now add the truncated imports list to the base // list b.add( x ); } }