inline: check accessibility according to the file scope (IDEA-152181)

This commit is contained in:
Anna.Kozlova
2016-04-27 14:02:31 +02:00
parent d07a62dfb8
commit 4f649256bc
6 changed files with 55 additions and 3 deletions

View File

@@ -363,8 +363,8 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
private static Map<PsiMember, Set<PsiMember>> getInaccessible(HashSet<PsiMember> referencedElements,
UsageInfo[] usages,
PsiElement elementToInline) {
Map<PsiMember, Set<PsiMember>> result = new HashMap<PsiMember, Set<PsiMember>>();
final Map<PsiMember, Set<PsiMember>> result = new HashMap<PsiMember, Set<PsiMember>>();
final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(elementToInline.getProject()).getResolveHelper();
for (UsageInfo usage : usages) {
final PsiElement usageElement = usage.getElement();
if (usageElement == null) continue;
@@ -379,7 +379,10 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
if (PsiTreeUtil.isAncestor(elementToInline, member, false)) continue;
if (elementToInline instanceof PsiClass &&
InheritanceUtil.isInheritorOrSelf((PsiClass)elementToInline, member.getContainingClass(), true)) continue;
if (!PsiUtil.isAccessible(usage.getProject(), member, usageElement, null)) {
PsiElement resolveScope = usageElement instanceof PsiReferenceExpression
? ((PsiReferenceExpression)usageElement).advancedResolve(false).getCurrentFileResolveScope()
: null;
if (!resolveHelper.isAccessible(member, member.getModifierList(), usageElement, null, resolveScope)) {
inaccessibleReferenced.add(member);
}
}

View File

@@ -35,6 +35,7 @@ public class ReferencedElementsCollector extends JavaRecursiveElementVisitor {
if (psiElement instanceof PsiMember) {
checkAddMember((PsiMember)psiElement);
}
super.visitReferenceElement(reference);
}
protected void checkAddMember(@NotNull final PsiMember member) {

View File

@@ -0,0 +1,13 @@
class A {
private Integer i = 0;
void foo() {
i.toString();
}
}
class B extends A {
void bar() {
f<caret>oo();
}
}

View File

@@ -0,0 +1,15 @@
class Test {
class A {
private Integer i = 0;
void foo() {
i.toString();
}
}
class B extends A {
void bar(A a) {
a.fo<caret>o();
}
}
}

View File

@@ -0,0 +1,12 @@
class Test {
class A {
private Integer i = 0;
}
class B extends A {
void bar(A a) {
a.i.toString();
}
}
}

View File

@@ -316,6 +316,14 @@ public class InlineMethodTest extends LightRefactoringTestCase {
doTest();
}
public void testInaccessibleFieldInSuperClass() throws Exception {
doTestConflict("Field <b><code>A.i</code></b> that is used in inlined method is not accessible from call site(s) in method <b><code>B.bar()</code></b>");
}
public void testPrivateFieldInSuperClassInSameFile() throws Exception {
doTest();
}
private void doTestInlineThisOnly() {
@NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java";
configureByFile(fileName);