import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.TreeSet; /** * Modifies code generation for rules by generating "require" statements * for referenced rules that aren't defined. * * @layer<requireComposer> */ public class BaliRulesData { /** * Refined to set <code>REQUIRED</code> bit only if the given rule is * not already <code>DEFINED</code>. This allows <code>REQUIRED</code> * statements to be erased by previous rule definitions. * * @layer<requireComposer> */ public void addRequire( String name ) { if ( ( getStatus( name ) & DEFINED ) == 0 ) setBits( name, REQUIRED ) ; } /** * Returns rules that are referenced but not defined. * * @layer<requireComposer> */ public List misDefined() { return getList( DEFINED | REFERENCED | REQUIRED, REFERENCED ) ; } public String toString() { Set requireSet = new TreeSet( getList( REQUIRED, REQUIRED ) ) ; if ( requireSet.size() < 1 ) return original() ; StringBuffer buffer = new StringBuffer() ; for ( Iterator p = requireSet.iterator() ; p.hasNext() ; ) { String rule = ( String ) p.next() ; String type = getType( rule ) ; buffer.append( "require " + rule + ( rule.equals( type ) ? "" : ( " -> " + type ) ) + " ;" + Main.LINE_SEPARATOR ) ; } return buffer.toString() + Main.LINE_SEPARATOR + original() ; } }