JML

org.multijava.mjc
Class MJGenericFunctionDecl

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JMemberDeclaration
                  extended byorg.multijava.mjc.JTypeDeclaration
                      extended byorg.multijava.mjc.JClassDeclaration
                          extended byorg.multijava.mjc.MJGenericFunctionDecl
All Implemented Interfaces:
Annotatable, Cloneable, Comparable, CompilerPassEnterable, Constants, Constants, JClassDeclarationType, JMemberDeclarationType, JTypeDeclarationType, PhylumType

public class MJGenericFunctionDecl
extends JClassDeclaration
implements Constants, Cloneable

This class represents a group of method declarations, all sharing the same name, that together form the top of one or more overloaded external generic function lattices. It corresponds to the anchor class for an external generic function.


Nested Class Summary
 
Nested classes inherited from class org.multijava.mjc.JTypeDeclaration
JTypeDeclaration.WrapResult
 
Field Summary
(package private)  MJTopLevelMethodDeclaration[] externalMethods
          Stores the external methods declared within this anchor declaration.
 
Fields inherited from class org.multijava.mjc.JClassDeclaration
self, superType
 
Fields inherited from class org.multijava.mjc.JTypeDeclaration
cachedContext, fieldsAndInits, ident, inners, instanceInit, interfaces, methods, modifiers, sourceClass, statInit, typevariables, uniqueSourceClass
 
Fields inherited from class org.multijava.mjc.JMemberDeclaration
 
Fields inherited from class org.multijava.mjc.JPhylum
EMPTY
 
Fields inherited from class org.multijava.util.compiler.Phylum
 
Fields inherited from class org.multijava.util.Utils
DBG_LEVEL_HIGH, DBG_LEVEL_LOW, DBG_LEVEL_NO
 
Fields inherited from interface org.multijava.mjc.Constants
ACC_MODIFIER_FLAGS_MASK, ACC_NON_NULL, ACC_NON_NULL_BY_DEFAULT, ACC_NULLABLE, ACC_NULLABLE_BY_DEFAULT, ACC_PURE, ACCESS_FLAG_ARRAY, ACCESS_FLAG_NAMES, AMID_JAVA_MATH, AMID_MAX, AMID_SAFE_MATH, CMP_VERSION, IMPLICITLY_NON_NULL, JAV_ASSERTION_ERROR, JAV_CLASS, JAV_CLASSLOADER, JAV_CLASSNOTFOUND_EXCEPTION, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_NOCLASSDEFFOUND_ERROR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RMJ_RUNTIME_EXCEPTION, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_SERIALIZABLE, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_SUPER, JAV_THIS, JAV_THROWABLE, MJ_ANCHOR, NULLITY_MODS, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LAND, OPE_LE, OPE_LNOT, OPE_LOR, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_MAX, TID_SHORT, TID_VOID, UNIV_ARRAY_TMP, UNIV_TMP
 
Fields inherited from interface org.multijava.util.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VOLATILE, ATT_ANCHOR, ATT_BRIDGE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_DISPATCHER, ATT_EXCEPTIONS, ATT_GENERIC, ATT_GENERIC_FUNCTIONS, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_MM_BODY, ATT_REDIRECTOR, ATT_RMJ_GLUE, ATT_RMJ_SIGNATURE, ATT_RUNTIME_VISIBLE_ANNOTATIONS, ATT_RUNTIME_VISIBLE_PARAMETER_ANNOTATIONS, ATT_SIGNATURE, ATT_SOURCEFILE, ATT_SYNTHETIC, ATT_UNIVERSE_FIELD, ATT_UNIVERSE_METHOD, ATT_UNIVERSE_VERSION, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_dup_x1, opc_dup_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc2_w, opc_ldc_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Constructor Summary
MJGenericFunctionDecl(TokenReference where, long modifiers, String ident, MJTopLevelMethodDeclaration[] methods)
          Constructs a generic function anchor declaration in the parsing tree.
 
Method Summary
 void accept(MjcVisitor v)
          Accepts the specified visitor
 void checkInterface(CContextType context)
          Checks the basic interfaces to make sure things generally look OK.
 Object clone()
          Produces a copy of this declaration, including a deep copy of the external method declarations housed here-in.
 MJTopLevelMethodDeclaration[] externalMethods()
          Return the top-level methods in this GF
protected  CSourceClass makeSignature(Main compiler, CClass owner, CMemberHost host, String prefix, boolean isAnon, boolean isMember)
          Generates the signature object for this.
protected  String methodIdent()
          Returns the ident of the methods contained in this generic function.
protected  JMethodDeclarationType[] methodsToBeWrapped()
          Returns an array of the methods to be considered for refactoring into dispatchers during the translateMJ pass.
protected  boolean registerSignature()
          Registers the signature of this declaration with the name space manager in CTopLevel.
 void resolveExtMethods(CContextType context)
          Makes sure that all in-scope external generic functions are added to the appropriate augmentation maps before top method searches occur in later passes.
 void resolveSpecializers(CContextType context)
          Computes the values of specializer expressions used to dispatch on compile-time constants.
 void resolveTopMethods()
          Finds the top method of every declared method.
 void typecheck(CContextType context)
          Typechecks this generic function declaration in the context in which it appears.
protected  CWarning uniqueSourceWarning()
          Returns the appropriate warning message when another class has been declared whose signature matches the signature of this.
 
Methods inherited from class org.multijava.mjc.JClassDeclaration
checkInitializers, constructDefaultConstructor, constructInitializers, createContext, hasConstructor, ident, preprocessDependencies, setInterfaces, setSuperClass, superName
 
Methods inherited from class org.multijava.mjc.JTypeDeclaration
accumAllTypeSignatures, addMember, annotateInternalInterfaceMethods, cachePassParameters, checkForDups, checkForSameSignature, checkInitializers, checkInterface, compareTo, dispatcherWrapMethods, fields, fieldsAndInits, generateInterface, getAllMethods, getDefaultConstructor, inners, interfaces, isAtTopLevel, isDeclaredInDifferentSourceFiles, methods, modifiers, owner, preprocessDependencies, preprocessDependencies, resolveSpecializers, setDefaultConstructor, setFields, setFieldsOnly, setIdent, setInners, setMethods, setStatic, syntheticOuterThisInaccessible, translateMJ, translateMJ, typecheck, typevariables, unsetStatic
 
Methods inherited from class org.multijava.mjc.JMemberDeclaration
genComments, getCClass, getField, getMethod, isDeprecated, javadocComment, setInterface
 
Methods inherited from class org.multijava.mjc.JPhylum
check, check, check, check, fail, fail, fail, warn, warn, warn, warn
 
Methods inherited from class org.multijava.util.compiler.Phylum
getTokenReference, setTokenReference
 
Methods inherited from class org.multijava.util.Utils
assertTrue, assertTrue, combineArrays, escapeString, escapeString, fail, fail, getFilePath, hasFlag, hasOtherFlags, parsePathParts, relativePathTo, splitQualifiedName, splitQualifiedName, stripJavaModifiers, stripNonJavaModifiers, stripPrivateModifier, unescapeString, vectorToArray, vectorToIntArray
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface org.multijava.mjc.JTypeDeclarationType
accumAllTypeSignatures, addMember, cachePassParameters, fields, fieldsAndInits, generateInterface, getAllMethods, getDefaultConstructor, inners, interfaces, isAtTopLevel, methods, modifiers, owner, setDefaultConstructor, setIdent, setInners, setStatic, syntheticOuterThisInaccessible, translateMJ, unsetStatic
 
Methods inherited from interface org.multijava.mjc.JMemberDeclarationType
genComments, getCClass, getField, getMethod, isDeprecated
 
Methods inherited from interface org.multijava.util.compiler.PhylumType
getTokenReference, setTokenReference
 
Methods inherited from interface org.multijava.javadoc.Annotatable
javadocComment
 
Methods inherited from interface org.multijava.mjc.CompilerPassEnterable
checkInitializers, checkInterface, getTokenReference, preprocessDependencies, resolveSpecializers, translateMJ, typecheck
 
Methods inherited from interface java.lang.Comparable
compareTo
 

Field Detail

externalMethods

MJTopLevelMethodDeclaration[] externalMethods
Stores the external methods declared within this anchor declaration. These are separate from the methods stored in a regular Java type declaration, since typechecking performed on these is distinct from that for regular method. The generated code will be accessed through the chain of responsibility pattern.

Constructor Detail

MJGenericFunctionDecl

public MJGenericFunctionDecl(TokenReference where,
                             long modifiers,
                             String ident,
                             MJTopLevelMethodDeclaration[] methods)
Constructs a generic function anchor declaration in the parsing tree.

Parameters:
where - the line of this node in the source code
modifiers - the modifiers of this anchor
ident - the short name of thie anchor
methods - the MJTopLevelMethodDeclarations that make up this generic function, must have non-zero length and all non-null members
Method Detail

makeSignature

protected CSourceClass makeSignature(Main compiler,
                                     CClass owner,
                                     CMemberHost host,
                                     String prefix,
                                     boolean isAnon,
                                     boolean isMember)
Generates the signature object for this.

Overrides:
makeSignature in class JTypeDeclaration
Parameters:
compiler - the compiler instance for which this signature is generated
owner - the class signature singleton for the logical outer class of this, or null if this is a top level declaration
host - the signature singleton of the context in which this is declared, a CCompilationUnit for top-level declarations
prefix - the prefix prepended to this declaration's identifier to achieve the fully qualified name, just the package name (using '/' separators) for top-level classes, package name plus $-delimited outer class names plus synthetic index for inner classes
isAnon - true if this is an anonymous class, in which case the fully qualified name is just prefix
isMember - true if this is a member type, i.e., a nested type that is not a local type or an anonymous class

registerSignature

protected boolean registerSignature()
Registers the signature of this declaration with the name space manager in CTopLevel.

also requires sourceClass != null && 
sourceClass instanceof CSourceGFCollection;
 

Overrides:
registerSignature in class JTypeDeclaration
Returns:
true if this is a new signature or false if this is a redeclaration
See Also:
CTopLevel#addGFCollection( CGFCollection )

externalMethods

public MJTopLevelMethodDeclaration[] externalMethods()
Return the top-level methods in this GF


checkInterface

public void checkInterface(CContextType context)
                    throws PositionedError
Checks the basic interfaces to make sure things generally look OK. This pass gathers information about the type signatures of everything (imported class files, classes being compiled, methods, fields, etc...) needed for the later passes. This information is stored in a CCompilationUnit instance and instances of CMember that are bound to the AST. Also adds things like the default constructor and the initializer method to the AST (these are suppressed during pretty-printing).

Specified by:
checkInterface in interface JTypeDeclarationType
Overrides:
checkInterface in class JClassDeclaration
Parameters:
context - the context in which this decl appears
Throws:
PositionedError - an error with reference to the source file

resolveSpecializers

public void resolveSpecializers(CContextType context)
                         throws PositionedError
Computes the values of specializer expressions used to dispatch on compile-time constants.

Specified by:
resolveSpecializers in interface JTypeDeclarationType
Overrides:
resolveSpecializers in class JClassDeclaration
Parameters:
context - the context in which this class declaration appears
Throws:
PositionedError - if the check fails

resolveExtMethods

public void resolveExtMethods(CContextType context)
Makes sure that all in-scope external generic functions are added to the appropriate augmentation maps before top method searches occur in later passes.

Overrides:
resolveExtMethods in class JTypeDeclaration

resolveTopMethods

public void resolveTopMethods()
                       throws PositionedError
Finds the top method of every declared method. Called after the resolveSpecializers pass. This cannot be done before then because the external generic function mappings are not complete until the end of the checkInterface pass and the constant value specializers are not known until after the resolveSpecializers pass. This must be done before the typecheck pass so that all specialized argument positions for generic functions are known for ambiguity checking.

Specified by:
resolveTopMethods in interface JTypeDeclarationType
Overrides:
resolveTopMethods in class JTypeDeclaration
Throws:
PositionedError

uniqueSourceWarning

protected CWarning uniqueSourceWarning()
Returns the appropriate warning message when another class has been declared whose signature matches the signature of this. Overridden in subclass.

Overrides:
uniqueSourceWarning in class JTypeDeclaration

typecheck

public void typecheck(CContextType context)
               throws PositionedError
Typechecks this generic function declaration in the context in which it appears. Mutates the context to record the information learned during checking.

Specified by:
typecheck in interface JTypeDeclarationType
Overrides:
typecheck in class JClassDeclaration
Parameters:
context - the context in which this type declaration appears
Throws:
PositionedError - if any checks fail

clone

public Object clone()
Produces a copy of this declaration, including a deep copy of the external method declarations housed here-in.

Overrides:
clone in class Object
Returns:
a copy of this declaration.

methodIdent

protected String methodIdent()
Returns the ident of the methods contained in this generic function. This is distinct from the value returned by ident() as that value represents the name of the anchor class for the generic function.

See Also:
JTypeDeclaration.ident()

accept

public void accept(MjcVisitor v)
Accepts the specified visitor

Specified by:
accept in interface JMemberDeclarationType
Overrides:
accept in class JClassDeclaration
Parameters:
v - the visitor

methodsToBeWrapped

protected JMethodDeclarationType[] methodsToBeWrapped()
Returns an array of the methods to be considered for refactoring into dispatchers during the translateMJ pass.

Overrides:
methodsToBeWrapped in class JTypeDeclaration
See Also:
JTypeDeclarationType.translateMJ(CContextType)

JML

JML is Copyright (C) 1998-2002 by Iowa State University and is distributed under the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This release depends on code from the MultiJava project and is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.