diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java index 69ca8fb6af0c..83d61fea1827 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java @@ -26,7 +26,6 @@ import com.intellij.psi.scope.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.SmartList; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -153,7 +152,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi } } - boolean infoAccessible = info.isAccessible() && !otherClass.hasModifierProperty(PsiModifier.PRIVATE); + boolean infoAccessible = info.isAccessible() && isAccessible(otherClass); if (infoAccessible && !accessible) { return Domination.DOMINATED_BY; } @@ -184,6 +183,21 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi return Domination.EQUAL; } + private boolean isAccessible(PsiClass otherClass) { + if (otherClass.hasModifierProperty(PsiModifier.PRIVATE)) { + final PsiClass containingClass = otherClass.getContainingClass(); + PsiClass containingPlaceClass = PsiTreeUtil.getParentOfType(myPlace, PsiClass.class, false); + while (containingPlaceClass != null) { + if (containingClass == containingPlaceClass) { + return true; + } + containingPlaceClass = PsiTreeUtil.getParentOfType(containingPlaceClass, PsiClass.class); + } + return false; + } + return true; + } + private boolean isAmbiguousInherited(PsiClass containingClass1) { PsiClass psiClass = PsiTreeUtil.getParentOfType(myPlace, PsiClass.class); while (psiClass != null) { @@ -213,7 +227,7 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi for (int i = myCandidates.size()-1; i>=0; i--) { ClassCandidateInfo info = myCandidates.get(i); - Domination domination = dominates(aClass, accessible && !aClass.hasModifierProperty(PsiModifier.PRIVATE), fqName, info); + Domination domination = dominates(aClass, accessible && isAccessible(aClass), fqName, info); if (domination == Domination.DOMINATED_BY) { return true; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InnerClassesShadowing.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InnerClassesShadowing.java index 2922998974cd..e87c5db28998 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InnerClassesShadowing.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/InnerClassesShadowing.java @@ -1,3 +1,5 @@ +import java.io.*; + public class Main { static interface A { @@ -80,4 +82,17 @@ class BAO { void foo(){} } +} + +class WithFileInputStream { + private static final Runnable runn = new Runnable() { + public void run() { + new FileInputStream("path"); + } + }; + + private static class FileInputStream { + private FileInputStream(String str) { + } + } } \ No newline at end of file