From 69ff6e7b27ebe78e047b3d053de4cf6731bc7a00 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 16 Jul 2010 21:36:48 +0400 Subject: [PATCH] pull up conflicts: forbid to make package local method abstract (IDEA-56130) --- .../refactoring/memberPullUp/PullUpConflictsUtil.java | 10 +++++++++- .../after/a/Test.java | 5 +++++ .../conflictAbstractPackageLocalMethod/after/b/E.java | 2 ++ .../after/b/TestSubclass.java | 8 ++++++++ .../before/a/Test.java | 5 +++++ .../conflictAbstractPackageLocalMethod/before/b/E.java | 2 ++ .../intellij/refactoring/ExtractSuperClassTest.java | 7 +++++++ 7 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/a/Test.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/E.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/TestSubclass.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/a/Test.java create mode 100644 java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/b/E.java diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java index d63f2e25d988..fd26092d74cb 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpConflictsUtil.java @@ -144,6 +144,8 @@ public class PullUpConflictsUtil { RefactoringConflictsUtil.analyzeModuleConflicts(subclass.getProject(), checkModuleConflictsList, new UsageInfo[0], targetRepresentativeElement, conflicts); for (final PsiMethod abstractMethod : abstractMethods) { + final boolean toDifferentPackage = + !Comparing.strEqual(targetPackage.getQualifiedName(), StringUtil.getPackageName(subclass.getQualifiedName())); abstractMethod.accept(new ClassMemberReferencesVisitor(subclass) { @Override protected void visitClassMemberReferenceElement(PsiMember classMember, PsiJavaCodeReferenceElement classMemberReference) { @@ -153,7 +155,7 @@ public class PullUpConflictsUtil { isAccessible = true; } else if (classMember.hasModifierProperty(PsiModifier.PACKAGE_LOCAL) && - !Comparing.strEqual(targetPackage.getQualifiedName(), StringUtil.getPackageName(subclass.getQualifiedName()))) { + toDifferentPackage) { isAccessible = true; } if (isAccessible) { @@ -167,6 +169,12 @@ public class PullUpConflictsUtil { } } }); + if (abstractMethod.hasModifierProperty(PsiModifier.PACKAGE_LOCAL) && toDifferentPackage) { + String message = "Can't make " + RefactoringUIUtil.getDescription(abstractMethod, false) + + " abstract as it won't be accessible from the subclass."; + message = CommonRefactoringUtil.capitalize(message); + conflicts.putValue(abstractMethod, message); + } } return conflicts; } diff --git a/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/a/Test.java b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/a/Test.java new file mode 100644 index 000000000000..1de09028ad92 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/a/Test.java @@ -0,0 +1,5 @@ +package a; + +public abstract class Test { + abstract void x(); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/E.java b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/E.java new file mode 100644 index 000000000000..e6e4b670d00a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/E.java @@ -0,0 +1,2 @@ +package b; +class E{} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/TestSubclass.java b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/TestSubclass.java new file mode 100644 index 000000000000..ac7700e1dfa2 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/after/b/TestSubclass.java @@ -0,0 +1,8 @@ +package b; + +import a.Test; + +public class TestSubclass extends Test { + @java.lang.Override void x() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/a/Test.java b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/a/Test.java new file mode 100644 index 000000000000..5fe720246445 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/a/Test.java @@ -0,0 +1,5 @@ +package a; +public class Test { + void x() { + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/b/E.java b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/b/E.java new file mode 100644 index 000000000000..e6e4b670d00a --- /dev/null +++ b/java/java-tests/testData/refactoring/extractSuperClass/conflictAbstractPackageLocalMethod/before/b/E.java @@ -0,0 +1,2 @@ +package b; +class E{} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java index c780618504d5..e55123aa576a 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractSuperClassTest.java @@ -54,6 +54,13 @@ public class ExtractSuperClassTest extends CodeInsightTestCase { new RefactoringTestUtil.MemberDescriptor("xx", PsiMethod.class)); } + public void testConflictAbstractPackageLocalMethod() throws Exception { + doTest("a.Test", "TestSubclass", + new String[] {"Can't make method x() abstract as it won't be accessible from the subclass."}, + "b", + new RefactoringTestUtil.MemberDescriptor("x", PsiMethod.class, true)); + } + public void testConflictUsingPackageLocalMethod() throws Exception { doTest("a.Test", "TestSubclass", new String[] {"method Sup.foo() won't be accessible"},