import java.util.*;
import java.io.*;
import Jakarta.util.Util2;
//------------------------ j2jSmx layer -------------------
// encapsulates refinement of state machines and anything
// to do with their composition. in this case, the j2j tool
// requires some rewrites of state machines *prior* to their
// reduction. Also, the j2j tool will be able to parse extensions
// to state machines, but will flag them as errors.
public class UmodSmDecl {
String previous;
public void harvestConstructors( int stage ) {
// Step 0: do nothing if we're inside quoted text
if ( stage != 0 ) {
super.harvestConstructors( stage );
return;
}
// Step 1: copy the inheritedCons of $TEqn.kernelConstants.
// globals().j2jbase -- these
// are the constructors we want to inherit
copyConstructors();
// Step 2: now harvest the constructors of the SDClassBody
arg[3].harvestConstructors( stage );
// Step 3: add reference to this type declaration
kernelConstants.globals().j2jbase.previousTypeDecls.add( this );
}
public void reduce2java( AstProperties props ) {
// Step 0: do a normal reduction if we haven't seen SoUrCe decls
if ( props.getProperty( "SoUrCe" ) == null ) {
original( props );
return;
}
// Step 1: remember the name of the state machine that is being reduced
// and the name of the class or machine that is being extended.
String smName = arg[0].tok[0].tokenName();
props.setProperty( "MixinDeclName", smName );
previous = (String) props.getProperty( "ThisName" );
if (previous == null) previous = "";
props.setProperty( "ThisName", Util2.unmangleId(smName) );
String extendsName = "";
SmExtendsClause ec = ( SmExtendsClause ) arg[1].arg[0];
if ( ec != null )
extendsName = ec.GetName();
props.setProperty( "SuperName", extendsName );
// Step 2: make sure that an FieldDecl is present
if ( arg[3].arg[4].arg[0] == null ) {
// can't set it because there is an empty AST_FieldDecl
// so here's the hack -- we'll add an empty AST_FieldDecl
// so that we can set its boolean
arg[3].arg[4].Replace( new AST_FieldDecl() );
}
// Step 4: set the addInheritedConstructors boolean
AST_FieldDecl f = ( AST_FieldDecl ) arg[3].arg[4].arg[0];
f.addMarker( inheritedCons );
// Step 5: now reduce normally - and clear the list of
// methods that are refined.
kernelConstants.globals().j2jbase.refinedSet.clear();
original( props );
// Step 6: reset the MixinDeclName
props.setProperty( "MixinDeclName", "" );
props.setProperty( "SuperName", "" );
props.setProperty( "ThisName", previous );
}
}