mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-06 11:50:54 +07:00
inline: check accessibility according to the file scope (IDEA-152181)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
class A {
|
||||
private Integer i = 0;
|
||||
|
||||
void foo() {
|
||||
i.toString();
|
||||
}
|
||||
}
|
||||
|
||||
class B extends A {
|
||||
void bar() {
|
||||
f<caret>oo();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
class Test {
|
||||
class A {
|
||||
private Integer i = 0;
|
||||
|
||||
}
|
||||
|
||||
class B extends A {
|
||||
void bar(A a) {
|
||||
a.i.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user