diff --git a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java index d4581d0cbdb0..803ddbb2f13a 100644 --- a/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inheritanceToDelegation/InheritanceToDelegationProcessor.java @@ -251,7 +251,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { reportedNonDelegatedUsages.put(nonDelegatedMember, reportedContainers); } final PsiElement container = ConflictsUtil.getContainer(element); - if (container != null && !reportedContainers.contains(container)) { + if (!reportedContainers.contains(container)) { String message = RefactoringBundle.message("0.uses.1.of.an.instance.of.a.2", RefactoringUIUtil.getDescription(container, true), RefactoringUIUtil.getDescription(nonDelegatedMember, true), classDescription); conflicts.putValue(container, CommonRefactoringUtil.capitalize(message)); @@ -266,7 +266,7 @@ public class InheritanceToDelegationProcessor extends BaseRefactoringProcessor { reportedUpcasts.put(upcastedTo, reportedContainers); } final PsiElement container = ConflictsUtil.getContainer(element); - if (container != null && !reportedContainers.contains(container)) { + if (!reportedContainers.contains(container)) { String message = RefactoringBundle.message("0.upcasts.an.instance.of.1.to.2", RefactoringUIUtil.getDescription(container, true), classDescription, RefactoringUIUtil.getDescription(upcastedTo, false)); diff --git a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java index 00e63c9bf772..53feada2a7b8 100644 --- a/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/inline/InlineMethodProcessor.java @@ -208,12 +208,13 @@ public class InlineMethodProcessor extends BaseRefactoringProcessor { Map> result = new HashMap>(); for (UsageInfo usage : usages) { - final PsiMember container = ConflictsUtil.getContainer(usage.getElement()); - if (container == null) continue; // usage in import statement - Set inaccessibleReferenced = result.get(container); + final PsiElement container = ConflictsUtil.getContainer(usage.getElement()); + if (!(container instanceof PsiMember)) continue; // usage in import statement + PsiMember memberContainer = (PsiMember)container; + Set inaccessibleReferenced = result.get(memberContainer); if (inaccessibleReferenced == null) { inaccessibleReferenced = new HashSet(); - result.put(container, inaccessibleReferenced); + result.put(memberContainer, inaccessibleReferenced); for (PsiMember member : referencedElements) { if (!PsiUtil.isAccessible(member, usage.getElement(), null)) { inaccessibleReferenced.add(member); diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java index 2ed7bb68b76d..e2a6f8c20ad4 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassToInnerProcessor.java @@ -369,7 +369,6 @@ public class MoveClassToInnerProcessor extends BaseRefactoringProcessor { public void addConflict(final PsiElement targetElement, final PsiElement sourceElement) { PsiElement container = ConflictsUtil.getContainer(sourceElement); - if (container == null) return; if (!myReportedContainers.contains(container)) { myReportedContainers.add(container); String targetDescription = (targetElement == myClassToMove) diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java index 30bb4b4159c4..3555beafb89e 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/MoveClassesOrPackagesProcessor.java @@ -245,7 +245,6 @@ public class MoveClassesOrPackagesProcessor extends BaseRefactoringProcessor { if (PsiModifier.PACKAGE_LOCAL.equals(visibility)) { if (PsiTreeUtil.getParentOfType(element, PsiImportStatement.class) != null) continue; PsiElement container = ConflictsUtil.getContainer(element); - if (container == null) continue; HashSet reported = reportedClassToContainers.get(aClass); if (reported == null) { reported = new HashSet(); diff --git a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java index a200b2d0e4d0..977840429415 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java @@ -26,6 +26,7 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; import com.intellij.usageView.UsageViewUtil; import com.intellij.util.containers.MultiMap; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Map; @@ -34,13 +35,13 @@ public class ConflictsUtil { private ConflictsUtil() { } - @Nullable - public static PsiMember getContainer(PsiElement place) { + @NotNull + public static PsiElement getContainer(PsiElement place) { PsiElement parent = place; while (true) { if (parent instanceof PsiMember && !(parent instanceof PsiTypeParameter)) - return (PsiMember)parent; - if (parent instanceof PsiFile) return null; + return parent; + if (parent instanceof PsiFile) return parent; parent = parent.getParent(); } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java index 4a2bfd0e119e..9cca54530051 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringConflictsUtil.java @@ -242,7 +242,6 @@ public class RefactoringConflictsUtil { PsiElement container; if (usageFile instanceof PsiJavaFile) { container = ConflictsUtil.getContainer(element); - if (container == null) container = usageFile; } else { container = usageFile; diff --git a/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/a/A.form b/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/a/A.form new file mode 100644 index 000000000000..e49f0fe7f3a6 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/a/A.form @@ -0,0 +1,31 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/a/A.java b/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/a/A.java new file mode 100644 index 000000000000..c76212720c79 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/a/A.java @@ -0,0 +1,4 @@ +package a; +public class A { + private JTextField textField1; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/b/B.java b/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/b/B.java new file mode 100644 index 000000000000..399835a59ea1 --- /dev/null +++ b/java/java-tests/testData/refactoring/pushDown/usagesInXml/before/b/B.java @@ -0,0 +1,4 @@ +package b; + +import a.*; +class B extends A {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownImportsTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownMultifileTest.java similarity index 62% rename from java/java-tests/testSrc/com/intellij/refactoring/PushDownImportsTest.java rename to java/java-tests/testSrc/com/intellij/refactoring/PushDownMultifileTest.java index 62dd14af370a..4f6777090767 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownImportsTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownMultifileTest.java @@ -9,13 +9,14 @@ import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.refactoring.memberPushDown.PushDownProcessor; import com.intellij.refactoring.util.DocCommentPolicy; import com.intellij.refactoring.util.classMembers.MemberInfo; //push first method from class a.A to class b.B -public class PushDownImportsTest extends MultiFileTestCase { +public class PushDownMultifileTest extends MultiFileTestCase { protected String getTestRoot() { return "/refactoring/pushDown/"; } @@ -79,4 +80,36 @@ public class PushDownImportsTest extends MultiFileTestCase { public void testStaticImportOfPushedMethod() throws Exception { doTest(); } + + public void testUsagesInXml() throws Exception { + try { + doTest(new PerformAction() { + public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception { + final PsiClass srcClass = myJavaFacade.findClass("a.A"); + assertTrue("Source class not found", srcClass != null); + + final PsiClass targetClass = myJavaFacade.findClass("b.B"); + assertTrue("Target class not found", targetClass != null); + + final PsiField[] fields = srcClass.getFields(); + assertTrue("No methods found", fields.length > 0); + final MemberInfo[] membersToMove = new MemberInfo[1]; + final MemberInfo memberInfo = new MemberInfo(fields[0]); + memberInfo.setChecked(true); + membersToMove[0] = memberInfo; + + new PushDownProcessor(getProject(), membersToMove, srcClass, new DocCommentPolicy(DocCommentPolicy.ASIS)).run(); + + + //LocalFileSystem.getInstance().refresh(false); + //FileDocumentManager.getInstance().saveAllDocuments(); + } + }); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals(e.getMessage(), "Class b.B is package local and will not be accessible from file A.form."); + return; + } + fail("Conflict was not detected"); + } } \ No newline at end of file