inline method: do not check for inaccessibility if referenced member would be also inlined (IDEA-78941 )

This commit is contained in:
anna
2011-12-16 10:01:03 +01:00
parent c8c3007e4a
commit d2bab883bd
4 changed files with 59 additions and 4 deletions

View File

@@ -195,7 +195,7 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
final ReferencedElementsCollector collector, final ReferencedElementsCollector collector,
final MultiMap<PsiElement, String> conflicts) { final MultiMap<PsiElement, String> conflicts) {
element.accept(collector); element.accept(collector);
final Map<PsiMember, Set<PsiMember>> containersToReferenced = getInaccessible(collector.myReferencedMembers, usages); final Map<PsiMember, Set<PsiMember>> containersToReferenced = getInaccessible(collector.myReferencedMembers, usages, element);
final Set<PsiMember> containers = containersToReferenced.keySet(); final Set<PsiMember> containers = containersToReferenced.keySet();
for (PsiMember container : containers) { for (PsiMember container : containers) {
@@ -216,12 +216,17 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
* *
* @param referencedElements * @param referencedElements
* @param usages * @param usages
* @param elementToInline
*/ */
private static Map<PsiMember, Set<PsiMember>> getInaccessible(HashSet<PsiMember> referencedElements, UsageInfo[] usages) { private static Map<PsiMember, Set<PsiMember>> getInaccessible(HashSet<PsiMember> referencedElements,
UsageInfo[] usages,
PsiElement elementToInline) {
Map<PsiMember, Set<PsiMember>> result = new HashMap<PsiMember, Set<PsiMember>>(); Map<PsiMember, Set<PsiMember>> result = new HashMap<PsiMember, Set<PsiMember>>();
for (UsageInfo usage : usages) { for (UsageInfo usage : usages) {
final PsiElement container = ConflictsUtil.getContainer(usage.getElement()); final PsiElement usageElement = usage.getElement();
if (usageElement == null) continue;
final PsiElement container = ConflictsUtil.getContainer(usageElement);
if (!(container instanceof PsiMember)) continue; // usage in import statement if (!(container instanceof PsiMember)) continue; // usage in import statement
PsiMember memberContainer = (PsiMember)container; PsiMember memberContainer = (PsiMember)container;
Set<PsiMember> inaccessibleReferenced = result.get(memberContainer); Set<PsiMember> inaccessibleReferenced = result.get(memberContainer);
@@ -229,7 +234,8 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor {
inaccessibleReferenced = new HashSet<PsiMember>(); inaccessibleReferenced = new HashSet<PsiMember>();
result.put(memberContainer, inaccessibleReferenced); result.put(memberContainer, inaccessibleReferenced);
for (PsiMember member : referencedElements) { for (PsiMember member : referencedElements) {
if (!PsiUtil.isAccessible(member, usage.getElement(), null)) { if (PsiTreeUtil.isAncestor(elementToInline, member, false)) continue;
if (!PsiUtil.isAccessible(member, usageElement, null)) {
inaccessibleReferenced.add(member); inaccessibleReferenced.add(member);
} }
} }

View File

@@ -0,0 +1,24 @@
public class Foo {
public static void f<caret>oo() {
bar(new Runnable() {
@Override
public void run() {
doRun();
}
private void doRun() {
// Woo-hoo
}
});
}
public static void bar(final Runnable runnable) {
runnable.run();
}
}
class Bar {
public static void main(String[] args) {
Foo.foo();
}
}

View File

@@ -0,0 +1,21 @@
public class Foo {
public static void bar(final Runnable runnable) {
runnable.run();
}
}
class Bar {
public static void main(String[] args) {
Foo.bar(new Runnable() {
@Override
public void run() {
doRun();
}
private void doRun() {
// Woo-hoo
}
});
}
}

View File

@@ -170,6 +170,10 @@ public class InlineMethodTest extends LightRefactoringTestCase {
public void testSuperMethodInAnonymousClass() throws Exception { public void testSuperMethodInAnonymousClass() throws Exception {
doTest(); doTest();
} }
public void testInlineAnonymousClassWithPrivateMethodInside() throws Exception {
doTest();
}
private void doTest() throws Exception { private void doTest() throws Exception {
String name = getTestName(false); String name = getTestName(false);