import java.util.*;
import Jakarta.util.FixDosOutputStream;
import Jakarta.util.Util2;
import java.io.*;
public class MethodDcl {
public void mangleBaseMethod() {
AST_Modifiers baseModifiers = ( AST_Modifiers ) arg[0].arg[0];
setName( mangledName );
// remember comment in front of method declaration
// and nullify it for now
String savedComment = this.getComment();
this.setComment( " " );
addModifier( new ModFinal().setParms( new AstToken().setParms( " ", "final", 0 ) ) );
// remove "new" or "overrides" modifier from base
if ( baseModifiers!=null ) {
baseModifiers.remModifier( MethodDeclaration.mn );
baseModifiers.remModifier( MethodDeclaration.mo );
}
// restore comment associated with method -- place at front
// of method declaration.
this.setComment( savedComment );
}
public String GetName() {
return ( ( MethodDeclarator ) this.arg[2] ).GetName();
}
public void cleanUpBase( AstCursor k, Hashtable he ) {
if ( isReferenced && isOverridden ) {
// propagate the modifiers and throws clause of the base
// to the extension.
( overriddenBy.arg[0] ).compose( ( AstNode ) arg[0].clone() );
( overriddenBy.arg[3] ).compose( ( AstNode ) arg[3].clone() );
// mangle the base name, and add final to the declaration
mangleBaseMethod();
}
else
if ( isReferenced && !isOverridden ) {
// create a call to self and add it before the original base method
String call = call2Self( GetName(), mangledName );
AstList l = AST_FieldDecl.MakeAST( call );
// we need to identify this code with some layer
// but since we are manufacturing this method and it
// doesn't really belong to a layer, we'll invent a layer name
l.setSource( kernelConstants.globals().compclass.ManufacturedName++ + "" );
k.AddBefore( l );
// mangle original base method
mangleBaseMethod();
}
else
if ( !isReferenced && isOverridden ) {
// just delete the base method -- no one references it
// and it is overridden
k.Delete();
}
else
if ( !isReferenced && !isOverridden ) {
// do nothing --leave as is
}
}
public String call2Self( String unmangled, String mangled ) {
String modifiers = arg[0].toString();
String typeName = arg[1].toString();
String methdecl = ( ( MethodDeclarator ) arg[2] )
.selfDeclarator( unmangled );
String selfcall = ( ( MethodDeclarator ) arg[2] )
.selfCall( mangled );
String throwsc = arg[3].toString();
boolean isVoid = false;
if ( arg[1] instanceof PrimType &&
arg[1].arg[0] instanceof VoidTyp )
isVoid = true;
return "\n" + modifiers + typeName + methdecl + throwsc +
"{ " + ( isVoid?"":"return " ) + selfcall + "; }";
}
public String signature() {
return ( ( MethodDeclarator ) arg[2] ).signature();
}
}