@@ -333,8 +333,8 @@ public class FieldReference extends Reference implements InvocationSite { | |||
SourceTypeBinding typeBinding = (SourceTypeBinding) binding.declaringClass; | |||
TypeDeclaration typeDecl = typeBinding.scope.referenceContext; | |||
FieldDeclaration fieldDecl = typeDecl.declarationOf(binding); | |||
FieldDeclaration fieldDecl = typeDecl.declarationOf(binding.getFieldBindingForLookup()); | |||
//System.err.println(typeDecl + " and " + fieldDecl + ", " + binding); | |||
//what scope to use (depend on the staticness of the field binding) | |||
MethodScope fieldScope = | |||
binding.isStatic() |
@@ -922,13 +922,19 @@ public class BlockScope extends Scope { | |||
ReferenceBinding receiverType, | |||
TypeBinding[] argumentTypes, | |||
InvocationSite invocationSite) { | |||
IPrivilegedHandler handler = findPrivilegedHandler(invocationType()); | |||
compilationUnitScope().recordTypeReference(receiverType); | |||
compilationUnitScope().recordTypeReferences(argumentTypes); | |||
MethodBinding methodBinding = receiverType.getExactConstructor(argumentTypes); | |||
if (methodBinding != null) | |||
if (methodBinding.canBeSeenBy(invocationSite, this)) | |||
if (methodBinding != null) { | |||
if (methodBinding.canBeSeenBy(invocationSite, this)) { | |||
return methodBinding; | |||
} else if (handler != null) { | |||
return handler.getPrivilegedAccessMethod(methodBinding); | |||
} | |||
} | |||
MethodBinding[] methods = | |||
receiverType.getMethods(ConstructorDeclaration.ConstantPoolName); |
@@ -215,4 +215,6 @@ public boolean alwaysNeedsAccessMethod(boolean isReadAccess) { return false; } | |||
public SyntheticAccessMethodBinding getAccessMethod(boolean isReadAccess) { | |||
throw new RuntimeException("unimplemented"); | |||
} | |||
public FieldBinding getFieldBindingForLookup() { return this; } | |||
} |
@@ -96,7 +96,7 @@ public final int bindingType() { | |||
public boolean canBeSeenBy(InvocationSite invocationSite, Scope scope) { | |||
if (isPublic()) return true; | |||
SourceTypeBinding invocationType = scope.enclosingSourceType(); | |||
SourceTypeBinding invocationType = scope.invocationType(); | |||
if (invocationType == declaringClass) return true; | |||
if (isProtected()) { | |||
@@ -135,8 +135,8 @@ public boolean canBeSeenBy(InvocationSite invocationSite, Scope scope) { | |||
*/ | |||
public boolean canBeSeenBy(TypeBinding receiverType, InvocationSite invocationSite, Scope scope) { | |||
if (isPublic()) return true; | |||
SourceTypeBinding invocationType = scope.invocationType(); //enclosingSourceType(); | |||
//XXX invocation vs. source | |||
SourceTypeBinding invocationType = scope.invocationType(); | |||
if (invocationType == declaringClass && invocationType == receiverType) return true; | |||
if (isProtected()) { | |||
@@ -148,7 +148,8 @@ public boolean canBeSeenBy(TypeBinding receiverType, InvocationSite invocationSi | |||
if (invocationType == declaringClass) return true; | |||
if (invocationType.fPackage == declaringClass.fPackage) return true; | |||
ReferenceBinding currentType = invocationType; | |||
// for protected we need to check based on the type of this | |||
ReferenceBinding currentType = scope.enclosingSourceType();; | |||
int depth = 0; | |||
do { | |||
if (declaringClass.isSuperclassOf(currentType)) { |
@@ -65,16 +65,15 @@ public final boolean canBeSeenBy(PackageBinding invocationPackage) { | |||
public final boolean canBeSeenBy(ReferenceBinding receiverType, SourceTypeBinding invocationType) { | |||
boolean ret = innerCanBeSeenBy(receiverType, invocationType); | |||
return ret; | |||
// if (ret) return true; | |||
// | |||
// System.err.println("trying to see: " + new String(sourceName)); | |||
// | |||
// if (invocationType.privilegedHandler != null) { | |||
// invocationType.privilegedHandler.notePrivilegedTypeAccess(this); | |||
// return true; | |||
// } | |||
// return false; | |||
if (ret) return true; | |||
//System.err.println("trying to see: " + new String(sourceName)); | |||
if (invocationType.privilegedHandler != null) { | |||
invocationType.privilegedHandler.notePrivilegedTypeAccess(this); | |||
return true; | |||
} | |||
return false; | |||
} | |||
private final boolean innerCanBeSeenBy(ReferenceBinding receiverType, SourceTypeBinding invocationType) { |