mjc

org.multijava.mjc
Class MemberAccess

java.lang.Object
  extended byorg.multijava.util.Utils
      extended byorg.multijava.mjc.MemberAccess
All Implemented Interfaces:
Cloneable, Constants, Constants

public class MemberAccess
extends Utils
implements Constants

This class represents and contains the information needed to determine whether a member of a class or compilation unit can be accessed from some other member. It was factored out of CMember so it could more easily be extended by JML classes without having to repeat code over several subclasses. It has the interface checking code for ensuring that modifiers are valid for the member containing it, e.g., class, field, and method signature classes. The modifier checking code was factored out of JTypeDeclaration, JFieldDeclaration, and JMethodDeclaration rather than using callbacks so the modifier checking could all be done in one class. Callbacks are used in some of the accessibility computations.

See Also:
CMember

Field Summary
protected  CMemberHost host
          Denotes the context in which this member is declared.
protected  CCompilationUnit hostCompilationUnit
          Stores a cached copy of the result of getCCompilationUnit.
protected static long interfaceFieldModifiers
           
protected static long interfaceMethodModifiers
           
protected static long invalidAbstractMethodModifiers
           
protected static long invalidClassModifiers
           
protected static long invalidFieldModifiers
           
protected static long invalidMethodModifiers
           
protected  long modifiers
          Subclasses may need to modify this field to hack around the problem of privileged access to private methods/fields from an enclosing/inner class.
protected  CClass owner
          Denotes the class in which this member appears logically.
 
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
MemberAccess(CClass owner, long modifiers)
          Constructs a member export
MemberAccess(CClass owner, CMemberHost host, long modifiers)
          Constructs a top-level member export
 
Method Summary
 void addModifiers(long modifiers)
          Add (bit or) to the modifiers of this member.
 void checkAccessModifiers(CContextType context, JMemberDeclaration member)
          Check illegal combinations of modifiers common to classes, interfaces, fields, and methods.
 void checkClassModifiers(CContextType context, JTypeDeclaration member)
          Check for illegal combinations of modifiers disallowed in classes and interfaces.
 void checkExternalMethodModifiers(CContextType context, JMethodDeclaration member)
          Check for illegal combinations of modifiers disallowed in external method declarations.
 void checkFieldModifiers(CContextType context, JFieldDeclaration member)
          Check for illegal combinations of modifiers disallowed in field declarations.
 long checkInterfaceFieldModifiers(CContextType context, JFieldDeclaration member)
          Check for illegal combinations of modifiers disallowed in interface field declarations.
 long checkInterfaceMethodModifiers(CContextType context, JMethodDeclaration member)
          Check for illegal combinations of modifiers disallowed in interface method declarations.
 void checkMethodModifiers(CContextType context, JMethodDeclaration member)
          Check for illegal combinations of modifiers disallowed in method declarations.
 CCompilationUnit getCCompilationUnit()
          Returns the compilation unit that hosts this member.
 String getOwnerName()
           
 boolean hasDefaultAccess()
           
 CMemberHost host()
          Returns the host of this member's declaration, which is the same value returned by owner() unless this is a top-level declaration.
 boolean isAbstract()
          A member is abstract if it is annotated with the abstract modifier.
 boolean isExternalMethod()
          Used to determine whether a method is external, i.e., whether its host is different than its logical owner.
 boolean isFinal()
          A member is final if it is annotated with the final modifier.
 boolean isInterface()
          Returns true iff this member is an interface.
 boolean isMemberVisibleIn(CMember member, CMemberHost from)
          Indicates whether this is accessible from the given host.
 boolean isNative()
          A member is native if it is annotated with the native modifier.
 boolean isPrivate()
          A member is private if it is annotated with the private modifier.
 boolean isProtected()
          A member is protected if it is annotated with the protected modifier.
 boolean isPublic()
          A member is public if it is annotated with the public modifier.
 boolean isPure()
          A member is pure if it is annotated with the pure modifier.
 boolean isStatic()
          A member is static if it is annotated with the static modifier.
 boolean isStrictFP()
          A member is strictfp if it is annotated with the strictfp modifier.
 boolean isSynchronized()
          A member is synchronized if it is annotated with the synchronized modifier.
 boolean isTransient()
          A member is transient if it is annotated with the transient modifier.
 boolean isVolatile()
          A member is volatile if it is annotated with the volatile modifier.
 long modifiers()
           
 CClass owner()
          Returns the owner of this member or null if this is a top-level class declaration.
 void removeAbstractModifier()
          Removes the 'abstract' modifier when necessary.
 void removeFinalModifier()
          Removes the 'final' modifier when necessary.
 void removePrivateModifier()
          Removes the 'private' modifier when necessary.
 void removeStaticModifier()
          Removes the 'static' modifier when necessary.
 void setModifiers(long modifiers)
          Sets the modifiers of this member
protected  void setOwner(CClass owner)
          Sets the owner of this member.
 
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, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

owner

protected CClass owner
Denotes the class in which this member appears logically. This is set to null for top-level classes. It is set to the class of the receiver for top-level method declarations. It is set to the outer class for inner classes. It is set to the containing class for fields.


host

protected final CMemberHost host
Denotes the context in which this member is declared. In most cases it is the same as owner. For top-level declarations it is the compilation unit in which the member is declared.


modifiers

protected long modifiers
Subclasses may need to modify this field to hack around the problem of privileged access to private methods/fields from an enclosing/inner class.


hostCompilationUnit

protected CCompilationUnit hostCompilationUnit
Stores a cached copy of the result of getCCompilationUnit.

See Also:
getCCompilationUnit()

invalidClassModifiers

protected static final long invalidClassModifiers

invalidFieldModifiers

protected static final long invalidFieldModifiers

invalidMethodModifiers

protected static final long invalidMethodModifiers

invalidAbstractMethodModifiers

protected static final long invalidAbstractMethodModifiers

interfaceFieldModifiers

protected static final long interfaceFieldModifiers

interfaceMethodModifiers

protected static final long interfaceMethodModifiers
Constructor Detail

MemberAccess

public MemberAccess(CClass owner,
                    long modifiers)
Constructs a member export

Parameters:
owner - the owner of this member
modifiers - the modifiers on this member

MemberAccess

public MemberAccess(CClass owner,
                    CMemberHost host,
                    long modifiers)
Constructs a top-level member export

Parameters:
owner - the owner of this member
host - the host of this member's declaration
modifiers - the modifiers on this member
Method Detail

owner

public CClass owner()
Returns the owner of this member or null if this is a top-level class declaration.

Returns:
the class that owns this member

setOwner

protected void setOwner(CClass owner)
Sets the owner of this member.

See Also:
owner

host

public CMemberHost host()
Returns the host of this member's declaration, which is the same value returned by owner() unless this is a top-level declaration.

Returns:
the host of this member's declaration

getOwnerName

public String getOwnerName()
Returns:
the fully qualified name of this member's owner

modifiers

public long modifiers()
Returns:
the modifiers of this member

addModifiers

public void addModifiers(long modifiers)
Add (bit or) to the modifiers of this member.


setModifiers

public void setModifiers(long modifiers)
Sets the modifiers of this member


isStatic

public boolean isStatic()
A member is static if it is annotated with the static modifier.

Returns:
true if this member is static

isPure

public boolean isPure()
A member is pure if it is annotated with the pure modifier. By WMD.

Returns:
true if this member is pure

isAbstract

public boolean isAbstract()
A member is abstract if it is annotated with the abstract modifier.

Returns:
true if this member is abstract

isPublic

public boolean isPublic()
A member is public if it is annotated with the public modifier.

Returns:
true if this member is public

isProtected

public boolean isProtected()
A member is protected if it is annotated with the protected modifier.

Returns:
true if this member is protected

isPrivate

public boolean isPrivate()
A member is private if it is annotated with the private modifier.

Returns:
true if this member is private

hasDefaultAccess

public boolean hasDefaultAccess()

isFinal

public boolean isFinal()
A member is final if it is annotated with the final modifier.

Returns:
true if this member is final.

isSynchronized

public boolean isSynchronized()
A member is synchronized if it is annotated with the synchronized modifier.

Returns:
true if this member is synchronized.

isTransient

public boolean isTransient()
A member is transient if it is annotated with the transient modifier.

Returns:
true if this member is transient.

isVolatile

public boolean isVolatile()
A member is volatile if it is annotated with the volatile modifier.

Returns:
true if this member is volatile.

isNative

public boolean isNative()
A member is native if it is annotated with the native modifier.

Returns:
true if this member is native.

isStrictFP

public boolean isStrictFP()
A member is strictfp if it is annotated with the strictfp modifier.

Returns:
true if this member is strictfp.

isInterface

public boolean isInterface()
Returns true iff this member is an interface.


isMemberVisibleIn

public boolean isMemberVisibleIn(CMember member,
                                 CMemberHost from)
Indicates whether this is accessible from the given host.

Parameters:
member - the member that needs to be accessed
from - the host that wants to access member
Returns:
true iff the given host is allowed access to this member

getCCompilationUnit

public CCompilationUnit getCCompilationUnit()
Returns the compilation unit that hosts this member.


isExternalMethod

public boolean isExternalMethod()
Used to determine whether a method is external, i.e., whether its host is different than its logical owner.

Returns:
true iff the method is external

removePrivateModifier

public void removePrivateModifier()
Removes the 'private' modifier when necessary.


removeStaticModifier

public void removeStaticModifier()
Removes the 'static' modifier when necessary.


removeFinalModifier

public void removeFinalModifier()
Removes the 'final' modifier when necessary.


removeAbstractModifier

public void removeAbstractModifier()
Removes the 'abstract' modifier when necessary.


checkAccessModifiers

public void checkAccessModifiers(CContextType context,
                                 JMemberDeclaration member)
                          throws PositionedError
Check illegal combinations of modifiers common to classes, interfaces, fields, and methods.

Throws:
PositionedError

checkClassModifiers

public void checkClassModifiers(CContextType context,
                                JTypeDeclaration member)
                         throws PositionedError
Check for illegal combinations of modifiers disallowed in classes and interfaces.

Throws:
PositionedError

checkFieldModifiers

public void checkFieldModifiers(CContextType context,
                                JFieldDeclaration member)
                         throws PositionedError
Check for illegal combinations of modifiers disallowed in field declarations.

Throws:
PositionedError

checkInterfaceFieldModifiers

public long checkInterfaceFieldModifiers(CContextType context,
                                         JFieldDeclaration member)
                                  throws PositionedError
Check for illegal combinations of modifiers disallowed in interface field declarations. Adds the default public, static, and final modifiers (the only ones allowed) for fields declared in interfaces.

Returns:
the new set of modifiers
Throws:
PositionedError

checkMethodModifiers

public void checkMethodModifiers(CContextType context,
                                 JMethodDeclaration member)
                          throws PositionedError
Check for illegal combinations of modifiers disallowed in method declarations.

Throws:
PositionedError

checkExternalMethodModifiers

public void checkExternalMethodModifiers(CContextType context,
                                         JMethodDeclaration member)
                                  throws PositionedError
Check for illegal combinations of modifiers disallowed in external method declarations.

Throws:
PositionedError

checkInterfaceMethodModifiers

public long checkInterfaceMethodModifiers(CContextType context,
                                          JMethodDeclaration member)
                                   throws PositionedError
Check for illegal combinations of modifiers disallowed in interface method declarations. Adds the default public and abstract modifiers (the only ones allowed) for methods declared in interfaces.

Returns:
the new set of modifiers
Throws:
PositionedError

mjc

mjc is Copyright (C) 2000-2004 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. mjc is based in part on the Kopi project Copyright (C) 1990-99 DMS Decision Management Systems Ges.m.b.H.