From 1977e48c1a8d7b62547e7c39ba8faf5e58cd15ce Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 11 Apr 2014 21:58:23 +0200 Subject: [PATCH] escalate visibility for moved class (IDEA-119683) --- .../move/moveInner/MoveInnerProcessor.java | 17 +++++++++++++++++ .../move/moveInner/MoveJavaInnerHandler.java | 10 ---------- .../after/p/A.java | 8 ++++++++ .../after/p/B.java | 9 +++++++++ .../before/p/A.java | 15 +++++++++++++++ .../com/intellij/refactoring/MoveInnerTest.java | 4 ++++ 6 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java create mode 100644 java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java create mode 100644 java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java index ddff1f089669..d4239e578016 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveInnerProcessor.java @@ -250,6 +250,23 @@ public class MoveInnerProcessor extends BaseRefactoringProcessor { reference.bindToElement(newClass); } + for (UsageInfo usage : usages) { + final PsiElement element = usage.getElement(); + final PsiElement parent = element != null ? element.getParent() : null; + if (parent instanceof PsiNewExpression) { + final PsiMethod resolveConstructor = ((PsiNewExpression)parent).resolveConstructor(); + for (PsiMethod method : newClass.getConstructors()) { + if (resolveConstructor == method) { + final PsiElement place = usage.getElement(); + if (place != null) { + VisibilityUtil.escalateVisibility(method, place); + } + break; + } + } + } + } + if (field != null) { final PsiExpression paramAccessExpression = factory.createExpressionFromText(myParameterNameOuterClass, null); for (final PsiMethod constructor : newClass.getConstructors()) { diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveJavaInnerHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveJavaInnerHandler.java index 11addce0e13e..68fe36f6b048 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveJavaInnerHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveInner/MoveJavaInnerHandler.java @@ -42,16 +42,6 @@ public class MoveJavaInnerHandler implements MoveInnerHandler { if (makePublic) { PsiUtil.setModifierProperty(newClass, PsiModifier.PUBLIC, true); } - - final PsiMethod[] constructors = newClass.getConstructors(); - for (PsiMethod constructor : constructors) { - final PsiModifierList modifierList = constructor.getModifierList(); - modifierList.setModifierProperty(PsiModifier.PRIVATE, false); - modifierList.setModifierProperty(PsiModifier.PROTECTED, false); - if (makePublic && !newClass.isEnum()) { - modifierList.setModifierProperty(PsiModifier.PUBLIC, true); - } - } } else { newClass = (PsiClass)options.getTargetContainer().add(innerClass); diff --git a/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java new file mode 100644 index 000000000000..077abf465534 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java @@ -0,0 +1,8 @@ +package p; + +class A { + public void test() { + B.foo(); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java new file mode 100644 index 000000000000..218cf833b376 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java @@ -0,0 +1,9 @@ +package p; + +class B { + private B() { + System.out.println("Constructor"); + } + + static void foo(){} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java new file mode 100644 index 000000000000..8597534df69a --- /dev/null +++ b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java @@ -0,0 +1,15 @@ +package p; + +class A { + public void test() { + B.foo(); + } + + private class B { + private B() { + System.out.println("Constructor"); + } + + static void foo(){} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java index 2e6865bfc5f8..c56ff8219d1f 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java @@ -85,6 +85,10 @@ public class MoveInnerTest extends MultiFileTestCase { doTest(createAction("p.A.B", "B", false, null, false, false, null)); } + public void testConstructorUtilClassVisibility() throws Exception { + doTest(createAction("p.A.B", "B", false, null, false, false, null)); + } + public void testFieldAccessInSuper() throws Exception { doTest(createAction("p.A.B", "B", true, "a", false, false, null)); }