access for private members through type parameter bound is forbidden in jdk7 (IDEA-88895)

This commit is contained in:
anna
2012-08-01 16:54:10 +02:00
parent 01728529dd
commit 03da4cdaa0
3 changed files with 48 additions and 0 deletions
@@ -15,6 +15,8 @@
*/
package com.intellij.psi.infos;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.JavaVersionService;
import com.intellij.psi.*;
/**
@@ -99,12 +101,31 @@ public class CandidateInfo implements JavaResolveResult {
final PsiMember member = (PsiMember)myCandidate;
accessProblem = !JavaPsiFacade.getInstance(myPlace.getProject()).getResolveHelper()
.isAccessible(member, member.getModifierList(), myPlace, myAccessClass, myCurrentFileResolveContext);
if (!accessProblem && member.hasModifierProperty(PsiModifier.PRIVATE) && myPlace instanceof PsiReferenceExpression && JavaVersionService.getInstance().isAtLeast(myPlace, JavaSdkVersion.JDK_1_7)) {
accessProblem = isAccessedThroughTypeParameterBound();
}
}
myAccessProblem = accessProblem ? Boolean.TRUE : Boolean.FALSE;
}
return !myAccessProblem.booleanValue();
}
private boolean isAccessedThroughTypeParameterBound() {
final PsiExpression qualifierExpression = ((PsiReferenceExpression)myPlace).getQualifierExpression();
if (qualifierExpression instanceof PsiMethodCallExpression) {
final JavaResolveResult resolveResult = ((PsiMethodCallExpression)qualifierExpression).resolveMethodGenerics();
final PsiElement element = resolveResult.getElement();
if (element instanceof PsiMethod) {
final PsiType returnType = ((PsiMethod)element).getReturnType();
final PsiType substitutedReturnType = resolveResult.getSubstitutor().substitute(returnType);
if (substitutedReturnType instanceof PsiCapturedWildcardType) {
return true;
}
}
}
return false;
}
@Override
public boolean isStaticsScopeCorrect(){
return !myStaticsProblem;