import java.util.*; import Jakarta.util.FixDosOutputStream; import Jakarta.util.Util2; import java.io.*; public class MMOutput extends HashMap { protected String name; // name of unit protected String type; // "C" for class, "I" for interface, protected String defn; // "D" for defined, "E" for extends, "R" for refines MMHashMap nested = new MMHashMap(); // for hierarchies of abstractions. int firstline; // starting line number int lastline; // ending line number protected int modifiers; // see MMGlobals for options public MMOutput() { name = ""; type = ""; defn = ""; firstline = -1; lastline = -1; modifiers = 0; } public MMOutput init( String name, String type, String defn ) { this.name = name; this.type = type; this.defn = defn; return ( MMOutput ) this; } // equals needed by HashMap public boolean equals( Object o ) { if ( o instanceof MMOutput ) return ( ( MMOutput ) o ).name.equals( name ); return false; } public void setlines( int start, int end ) { firstline = start; lastline = end; } public int getStartLine() { return firstline; } public int getLastLine() { return lastline; } // set methods for name, type, defn assign values the first time. public String getName() { return name; } public void setName( String x ) { if ( name.equals( "" ) ) name = Util2.unmangleId( x ); } public String getType() { return type; } public void setType( String x ) { if ( type.equals( "" ) ) type = x; } public String getDefn() { return defn; } public void setDefn( String x ) { if ( defn.equals( "" ) ) defn = x; } public MMHashMap getNested() { return nested; } // get methods for modifiers public int getModifiers() { return modifiers; } public void copyModifiers( MMOutput o ) { modifiers = o.modifiers; } public void setModifiers( AstOptNode n ) { // Step 1: if there are no modifiers, return if (n.arg[0] == null) return; // Step 2: iterate over list of modifiers and set booleans modifiers = 0; AstCursor c = new AstCursor(); for (c.FirstElement(n.arg[0]); c.MoreElement(); c.NextElement()) { if (c.node instanceof ModAbstract) { modifiers |= MMGlobals.ModAbstract; } else if (c.node instanceof ModFinal) { modifiers |= MMGlobals.ModFinal; } else if (c.node instanceof ModPublic) { modifiers |= MMGlobals.ModPublic; } else if (c.node instanceof ModProtected) { modifiers |= MMGlobals.ModProtected; } else if (c.node instanceof ModPrivate) { modifiers |= MMGlobals.ModPrivate; } else if (c.node instanceof ModStatic) { modifiers |= MMGlobals.ModStatic; } else if (c.node instanceof ModTransient) { modifiers |= MMGlobals.ModTransient; } else if (c.node instanceof ModVolatile) { modifiers |= MMGlobals.ModVolatile; } else if (c.node instanceof ModNative) { modifiers |= MMGlobals.ModNative; } else if (c.node instanceof ModSynchronized) { modifiers |= MMGlobals.ModSynchronized; } } } // ---------------------- public void print() { print( "" ); } protected void print( String indent ) { String nametype = ""; if (type == MMGlobals.Constructor) nametype = "__"; System.out.println( indent + type + " " + defn + " " + name + " " + nametype); System.out.println( indent + "Line range (" + firstline + ", " + lastline + ")" ); System.out.print( indent ); if ((modifiers & MMGlobals.ModAbstract) != 0) System.out.print( "abstract " ); if ((modifiers & MMGlobals.ModFinal) != 0) System.out.print( "final " ); if ((modifiers & MMGlobals.ModPublic) != 0) System.out.print( "public " ); if ((modifiers & MMGlobals.ModProtected) != 0) System.out.print( "protected " ); if ((modifiers & MMGlobals.ModPrivate) != 0) System.out.print( "private " ); if ((modifiers & MMGlobals.ModStatic) != 0) System.out.print( "static " ); if ((modifiers & MMGlobals.ModTransient) != 0) System.out.print( "transient " ); if ((modifiers & MMGlobals.ModVolatile) != 0) System.out.print( "volatile " ); if ((modifiers & MMGlobals.ModNative) != 0) System.out.print( "native " ); if ((modifiers & MMGlobals.ModSynchronized) != 0) System.out.print( "synchronized " ); System.out.println(" endMods "); List keys = new ArrayList( keySet() ) ; if (keys.size() != 0) { Collections.sort( keys ) ; // print out all collected named vectors (e.g., super, extends, implements) System.out.println(indent + " beginKeys"); for ( Iterator p = keys.iterator() ; p.hasNext() ; ) ( ( NamedVector ) get( p.next() ) ) . print( indent ) ; System.out.println(indent + " endKeys"); } // now print out all objects nested inside this construct if ( nested != null && nested.size() != 0) { System.out.println(indent + " beginNest"); nested.print( indent + MMGlobals.INDENT ) ; System.out.println(indent + " endNest"); } } public void union( NamedVector v ) { // the idea here is that when a named vector is to be added, // it should have a unique name. If a vector already exists // with this name, its contents are added to the existing vector. // this wierdness is imposed upon us by mixin-produced files. // in particular, interfaces. if ( v.isEmpty() ) return ; NamedVector previous = ( NamedVector ) get( v.getName() ) ; if ( previous == null ) { put( v.getName(), v ) ; return ; } previous.addAll( v ) ; } // has a result been computed? public boolean computed() { return !type.equals( "" ); } public void merge( MMOutput o ) { // this method is called to merge method declarations in mixin-produced // files. The throws clauses are unioned, and so too are the modifiers. for ( Iterator p = o.keySet().iterator() ; p.hasNext() ; ) { String key = (String) p.next(); NamedVector nv = (NamedVector) o.get(key); if (nv != null) { union( nv ); } } modifiers |= o.modifiers; } }