JML

org.multijava.mjc
Class JFormalParameter

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.util.compiler.Phylum
          extended byorg.multijava.mjc.JPhylum
              extended byorg.multijava.mjc.JLocalVariable
                  extended byorg.multijava.mjc.JFormalParameter
All Implemented Interfaces:
Cloneable, Constants, Constants, PhylumType, VariableDescriptor
Direct Known Subclasses:
JmlFormalParameter

public class JFormalParameter
extends JLocalVariable

This class represents a parameter declaration in the syntax tree


Field Summary
static JFormalParameter[] EMPTY
           
private  boolean interfaceChecked
           
private  String metaDebugKey
          A string to be used as a key for meta-debugging the Debug operations.
private  CType overriddenType
           
private  CSpecializedType specializedType
           
 
Fields inherited from class org.multijava.mjc.JLocalVariable
DES_CATCH_PARAMETER, DES_GENERATED, DES_LOCAL_VAR, DES_PARAMETER, expr, modifiers, name, type
 
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
JFormalParameter(TokenReference where, int desc, CSpecializedType type, String ident, boolean isFinal)
          Constructs a formal parameter node in the parsing tree.
JFormalParameter(TokenReference where, long modifiers, int desc, CSpecializedType type, String ident)
          Constructs a formal parameter node in the parsing tree.
 
Method Summary
 void accept(MjcVisitor p)
          Accepts the specified visitor
 CSpecializedType checkInterface(CContextType context)
          Checks the basic interfaces to make sure things generally look OK.
 CType dynamicType()
          Returns the dynamic type part of this formal parameter type.
 CType getType()
           
 boolean isSpecialized()
           
private static boolean isValidSpecializerClassType(CType type)
          Indicates whether the given type can ever appear as an explicit class specializer.
private static boolean isValidSpecializerValueType(CType type)
          Indicates whether the given type can ever appear as an explicit value specializer.
 String modifiersAsString()
          Returns any parameter modifiers as a String; if the String is not empty, it will have a trailing space.
 String modToString()
           
 String paramToString()
           
 void resolveSpecializer(CFlowControlContextType context)
          Compute the value of a specializer expression used to dispatch on a compile-time constant.
 CSpecializedType specializedType()
          Returns the overridden and dynamic types for this formal.
static String specializerString(JFormalParameter[] parms)
          Creates from an array of formal parameters a String of the dynamic types of the parameters.
 CType staticType()
          Returns the static type part of this formal parameter type.
 String toString()
           
 void typecheck(CFlowControlContextType context)
          Typechecks the parameter and mutates the context to record information gathered during typechecking.
 String typeToString()
           
 
Methods inherited from class org.multijava.mjc.JLocalVariable
equals, expr, genLoad, genStore, getDescription, getPosition, getValue, hashCode, ident, index, isAssigned, isConstant, isDeclaredNonNull, isFinal, isGenerated, isLoopVariable, isNonNull, isStatic, isUsed, modifiers, setAssigned, setIdent, setIndex, setIsLoopVariable, setModifiers, setNonNull, setPosition, setUsed, setValue, unsetIsLoopVariable
 
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
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
 

Field Detail

EMPTY

public static final JFormalParameter[] EMPTY

overriddenType

private CType overriddenType

interfaceChecked

private boolean interfaceChecked

specializedType

private CSpecializedType specializedType

metaDebugKey

private String metaDebugKey
A string to be used as a key for meta-debugging the Debug operations. Because the equals method inherited from JLocalVariable is screwy, we need a key that is reasonable to use in HashMaps.

Constructor Detail

JFormalParameter

public JFormalParameter(TokenReference where,
                        long modifiers,
                        int desc,
                        CSpecializedType type,
                        String ident)
Constructs a formal parameter node in the parsing tree.

Parameters:
where - the line of this node in the source code
modifiers - the modifiers on this parameter
desc - the sort of variable that this is, see constants in JLocalVariable
type - the static and dynamic types of this formal
ident - the name of this variable

JFormalParameter

public JFormalParameter(TokenReference where,
                        int desc,
                        CSpecializedType type,
                        String ident,
                        boolean isFinal)
Constructs a formal parameter node in the parsing tree.

Parameters:
where - the line of this node in the source code
desc - the sort of variable that this is, see constants in JLocalVariable
type - the static and dynamic types of this formal
ident - the name of this variable
isFinal - a flag indicating whether this is declared final
Method Detail

getType

public CType getType()
Overrides:
getType in class JLocalVariable
Returns:
the type of this variable

staticType

public CType staticType()
Returns the static type part of this formal parameter type.

Returns:
the static type part of this formal parameter type

dynamicType

public CType dynamicType()
Returns the dynamic type part of this formal parameter type.

Returns:
the dynamic type part of this formal parameter type

specializedType

public CSpecializedType specializedType()
Returns the overridden and dynamic types for this formal.

Returns:
the overridden and dynamic types for this formal

isSpecialized

public boolean isSpecialized()

toString

public String toString()
Overrides:
toString in class JLocalVariable

modToString

public String modToString()

typeToString

public String typeToString()

paramToString

public String paramToString()

modifiersAsString

public String modifiersAsString()
Returns any parameter modifiers as a String; if the String is not empty, it will have a trailing space.


checkInterface

public CSpecializedType 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 context hierarchy that is bound to the AST.

Parameters:
context - the context in which this appears
Returns:
the overridden and dynamic types for this formal
Throws:
PositionedError - if the check fails

resolveSpecializer

public void resolveSpecializer(CFlowControlContextType context)
                        throws PositionedError
Compute the value of a specializer expression used to dispatch on a compile-time constant.

Parameters:
context - the context in which this class declaration appears
Throws:
PositionedError - if the check fails

typecheck

public void typecheck(CFlowControlContextType context)
               throws PositionedError
Typechecks the parameter and mutates the context to record information gathered during typechecking.

Overrides:
typecheck in class JLocalVariable
Parameters:
context - the context in which this expression appears
Throws:
PositionedError - if the check fails

accept

public void accept(MjcVisitor p)
Accepts the specified visitor

Parameters:
p - the visitor

specializerString

public static String specializerString(JFormalParameter[] parms)
Creates from an array of formal parameters a String of the dynamic types of the parameters. This string can be used as a key into a hashtable for verifying unique method signatures. ` * @param parms an array of the formal parameters

Returns:
a string that is the concatenation of the dynamic parm types

isValidSpecializerClassType

private static boolean isValidSpecializerClassType(CType type)
Indicates whether the given type can ever appear as an explicit class specializer. Does not check whether the given type is a proper subtype of the static type. Only checks the type is a non-interface, non-array reference type or is an array (of any dimension) of non-interface, non-array reference types.


isValidSpecializerValueType

private static boolean isValidSpecializerValueType(CType type)
Indicates whether the given type can ever appear as an explicit value specializer. It can be, as long as the value is a compile-time constant.


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.