mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
inline method: do not check for inaccessibility if referenced member would be also inlined (IDEA-78941 )
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user