IDEA-156280 Incorrect evaluation inside anonymous class

This commit is contained in:
Egor.Ushakov
2016-05-19 15:01:30 +03:00
parent a12df12875
commit 6297690daf
3 changed files with 37 additions and 2 deletions
@@ -55,8 +55,10 @@ public class ConflictFilterProcessor extends FilterScopeProcessor<CandidateInfo>
@Override
public boolean execute(@NotNull PsiElement element, @NotNull ResolveState state) {
JavaResolveResult[] cachedResult = myCachedResult;
if (cachedResult != null && cachedResult.length == 1 && cachedResult[0].isAccessible()) {
return false;
if (!(myPlaceFile instanceof JavaCodeFragment) || ((JavaCodeFragment)myPlaceFile).getVisibilityChecker() == null) {
if (cachedResult != null && cachedResult.length == 1 && cachedResult[0].isAccessible()) {
return false;
}
}
if (myName == null || PsiUtil.checkName(element, myName, myPlace)) {
return super.execute(element, state);
@@ -0,0 +1,16 @@
public class AnonField {
private String xxx;
public static void main(String[] args) {
new AnonField().foo();
}
void foo() {
String xxx = "local";
new AnonField() {
@Override
public void foo() {
System.out.println(<ref>xxx);
}
}.foo();
}
}
@@ -3,6 +3,7 @@ package com.intellij.psi.resolve;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.psi.*;
import com.intellij.psi.impl.search.JavaSourceFilterScope;
import com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.ResolveTestCase;
@@ -44,6 +45,22 @@ public class ResolveInCodeFragmentTest extends ResolveTestCase {
assertEquals("boolean", expr.getType().getCanonicalText());
}
public void testResolveFieldVsLocalWithVisiblityChecker() throws Exception {
PsiReference iRef = configure();
JavaCodeFragment codeFragment = JavaCodeFragmentFactory.getInstance(myProject).createExpressionCodeFragment(
"xxx", iRef.getElement(), null, true);
codeFragment.setVisibilityChecker(JavaCodeFragment.VisibilityChecker.EVERYTHING_VISIBLE);
PsiElement[] fileContent = codeFragment.getChildren();
assertEquals(1, fileContent.length);
assertTrue(fileContent[0] instanceof PsiExpression);
PsiExpression expr = (PsiExpression) fileContent[0];
PsiElement resolve = ((PsiReferenceExpressionImpl)expr).resolve();
assertTrue("Must be local variable, not a field", resolve instanceof PsiLocalVariable);
}
private PsiReference configure() throws Exception {
return configureByFile("codeFragment/" + getTestName(false) + ".java");
}