import java.util.*;
import Jakarta.util.*;
import java.io.*;
//---------- code for locating file, parsing it, and locating
//---------- declaration to update
public class UnMixinUtil {
public AST_Program root = null;
public ModTypeDecl location = null;
public UnMixinUtil() {
Parser parser;
// Step 1: open file
FileInputStream inputFile = null;
try {
inputFile = new FileInputStream( kernelConstants.globals().unmixin.fileName );
}
catch ( Exception e ) {
AstNode.fatalError( e.getMessage() );
}
// Step 2: parse the file, and close it afterwards
parser = Parser.getInstance( inputFile ) ;
try {
root = (AST_Program) parser.parseAll () ;
}
catch ( Exception e ) {
AstNode.parseError2( "Parsing Exception Thrown in " +
kernelConstants.globals().unmixin.fileName + ": " + e.getMessage() );
}
try {
inputFile.close();
}
catch ( Exception e ) {
AstNode.fatalError( "can't close " + kernelConstants.globals().unmixin.fileName );
}
// Step 3: find first ModTypeDecl -- that should be the only
// such declaration in the file itself
AstCursor c = new AstCursor();
for ( c.First( root ); c.More(); c.PlusPlus() ) {
if ( c.node instanceof ModTypeDecl ) {
if ( location == null )
location = ( ModTypeDecl ) c.node;
else
AstNode.fatalError( "Too many ModTypeDecl statements in " +
kernelConstants.globals().unmixin.fileName );
}
if ( c.node instanceof TypeDeclaration )
c.Sibling();
}
if ( location == null )
AstNode.fatalError( "No ModTypeDecl statements in " + kernelConstants.globals().unmixin.fileName );
}
// propagate output to file itself
public void output() {
String fileName;
String dirName;
// Step 1: create AstProperties for outputting AST
int i = kernelConstants.globals().unmixin.fileName.lastIndexOf( File.separatorChar );
if ( i>=0 ) {
fileName = kernelConstants.globals().unmixin.fileName.substring( i+1 );
dirName = kernelConstants.globals().unmixin.fileName.substring( 0,i );
}
else {
fileName = kernelConstants.globals().unmixin.fileName;
dirName = ".";
}
AstProperties props = AstProperties.open( dirName, fileName );
// Step 3: output to file
root.print( props );
PrintWriter pw = ( PrintWriter ) props.getProperty( "output" );
pw.println( "" ); // finish the file with a complete line
pw.close();
// Step 4: now if verbose is selected, announce file has been
// updated.
if ( Main.verbose )
System.err.println( "changes propagated to file " +
dirName + File.separator + fileName );
}
}