move inner: check protected accessibility in respect with class hierarchy (IDEA-154628)

This commit is contained in:
Anna.Kozlova
2016-04-14 20:59:13 +02:00
parent 38a5560bb2
commit 4c47e35b31
5 changed files with 37 additions and 0 deletions
@@ -29,6 +29,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.BaseRefactoringProcessor;
import com.intellij.refactoring.RefactoringBundle;
@@ -390,6 +391,10 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor {
final String visibilityModifier = VisibilityUtil.getVisibilityModifier(element.getModifierList());
if (PsiModifier.PRIVATE.equals(visibilityModifier)) return true;
if (PsiModifier.PUBLIC.equals(visibilityModifier)) return false;
if (PsiModifier.PROTECTED.equals(visibilityModifier) &&
InheritanceUtil.isInheritorOrSelf(myInnerClass, myOuterClass, true)) {
return false;
}
final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(myProject);
if (myTargetContainer instanceof PsiDirectory) {
final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory)myTargetContainer);
@@ -0,0 +1,9 @@
package p;
import p.b.A;
public class B extends A {
private B() {
System.out.println("Constructor");
}
}
@@ -0,0 +1,7 @@
package p.b;
class A {
protected A() {
}
}
@@ -0,0 +1,12 @@
package p.b;
class A {
protected A() {
}
private class B extends A {
private B() {
System.out.println("Constructor");
}
}
}
@@ -85,6 +85,10 @@ public class MoveInnerTest extends MultiFileTestCase {
doTest(createAction("p.A.B", "B", false, null, false, false, null));
}
public void testConstructorProtectedVisibility() throws Exception { // IDEADEV-19561
doTest(createAction("p.b.A.B", "B", false, null, false, false, "p"));
}
public void testConstructorUtilClassVisibility() throws Exception {
doTest(createAction("p.A.B", "B", false, null, false, false, null));
}