import java.util.*;
import Jakarta.util.FixDosOutputStream;
import java.io.*;
/** production:
InterfaceMemberDeclaration:
MethodDeclaration::MDecl
*
* @layer<CompInt>
*/
public class MDecl {
public void add2Hash( Hashtable h ) {
h.put( signature(), this );
}
public boolean actOnHash( Hashtable h ) {
// this method is called only on extension tree nodes
InterfaceMemberDeclaration d;
String sig = signature();
d = ( InterfaceMemberDeclaration ) h.get( sig );
// get the modifier list of the extension and perform
// some modifier error checking
AST_Modifiers ml = ( AST_Modifiers ) arg[0].arg[0].arg[0];
if ( ml!=null ) {
if ( ml.findModifier( MethodDeclaration.mn ) ) {
// new modifier is present in the extension -- make
// sure that there is no corresponding method in the base
// and remove new modifier if base is an interface -- we
// don't want to propagate this modifier to the base
if ( d!=null )
AstNode.error( arg[0].arg[2].tok[0],
"new method " + sig + ") in refinement is overriding "
+ "method in base" );
if ( kernelConstants.globals().isBaseAnInterface )
ml.remModifier( MethodDeclaration.mn );
}
if ( ml.findModifier( MethodDeclaration.mo ) ) {
// "override" modifer is present in extension method
// make sure that there is a corresponding method in the
// base. And remove the "override" modifier in the
// appropriate case
if ( d==null && kernelConstants.globals().isBaseAnInterface )
AstNode.error( arg[0].arg[2].tok[0],
"override method " + sig + ") in refinement does not "
+ "override method in base" );
if ( kernelConstants.globals().isBaseAnInterface || d!=null )
ml.remModifier( MethodDeclaration.mo );
}
}
// if d != null, then the extension is overriding a method
// in the base -- d is the tree of this method. If d!=null,
// compose them and return true (to delete) else return false
if ( d != null ) {
d.compose( this );
return true;
}
return false;
}
public String signature() {
return ( ( MethodDeclaration ) arg[0] ).signature();
}
}