From b326598366470389d5fed59d3914d5ec605ed3e4 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 14 Jan 2010 14:28:23 +0300 Subject: [PATCH] introduce parameter object: downgrade accessibilty for inner classes (IDEADEV-35295) --- .../IntroduceParameterObjectProcessor.java | 12 ++++++++++++ .../ParameterObjectBuilder.java | 8 ++++++-- .../innerClass/after/Test.java | 4 ++-- .../innerClassInInterface/after/Test.java | 6 +++--- .../usedInnerClass/after/Test.java | 19 +++++++++++++++++++ .../usedInnerClass/after/Usage.java | 5 +++++ .../usedInnerClass/before/Test.java | 7 +++++++ .../usedInnerClass/before/Usage.java | 5 +++++ .../IntroduceParameterObjectTest.java | 4 ++++ 9 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Test.java create mode 100644 java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Usage.java create mode 100644 java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Test.java create mode 100644 java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Usage.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java index 4d1f650d1941..80f822f3c763 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/IntroduceParameterObjectProcessor.java @@ -27,6 +27,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.OverridingMethodsSearch; +import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; @@ -41,6 +42,7 @@ import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageViewDescriptor; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -220,6 +222,15 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP final PsiClass psiClass = buildClass(); if (psiClass != null) { super.performRefactoring(usageInfos); + if (!myUseExistingClass) { + for (PsiReference reference : ReferencesSearch.search(method)) { + final PsiElement place = reference.getElement(); + VisibilityUtil.escalateVisibility(psiClass, place); + for (PsiMethod constructor : psiClass.getConstructors()) { + VisibilityUtil.escalateVisibility(constructor, place); + } + } + } } } @@ -228,6 +239,7 @@ public class IntroduceParameterObjectProcessor extends FixableUsagesRefactoringP return existingClass; } final ParameterObjectBuilder beanClassBuilder = new ParameterObjectBuilder(); + beanClassBuilder.setVisibility(myCreateInnerClass ? PsiModifier.PRIVATE : PsiModifier.PUBLIC); beanClassBuilder.setProject(myProject); beanClassBuilder.setTypeArguments(typeParams); beanClassBuilder.setClassName(className); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java index 4b6ef99e64e0..d4e26bdb6a1e 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceparameterobject/ParameterObjectBuilder.java @@ -35,6 +35,7 @@ class ParameterObjectBuilder { private final List typeParams = new ArrayList(); private Project myProject; private JavaCodeStyleManager myJavaCodeStyleManager ; + private String myVisibility; public void setClassName(String className) { this.className = className; @@ -63,7 +64,7 @@ class ParameterObjectBuilder { @NonNls final StringBuffer out = new StringBuffer(1024); if (packageName.length() > 0) out.append("package " + packageName + ';'); out.append('\n'); - out.append("public class " + className); + out.append(myVisibility + " class " + className); if (!typeParams.isEmpty()) { out.append('<'); boolean first = true; @@ -172,7 +173,7 @@ class ParameterObjectBuilder { } private void outputConstructor(@NonNls StringBuffer out) { - out.append("\tpublic " + className + '('); + out.append("\t" + myVisibility + " " + className + '('); for (Iterator iterator = fields.iterator(); iterator.hasNext();) { final ParameterSpec field = iterator.next(); final PsiParameter parameter = field.getParameter(); @@ -257,5 +258,8 @@ class ParameterObjectBuilder { return null; } + public void setVisibility(String visibility) { + myVisibility = visibility; + } } diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/innerClass/after/Test.java b/java/java-tests/testData/refactoring/introduceParameterObject/innerClass/after/Test.java index 5c75afc6be3d..c8199372a2c3 100644 --- a/java/java-tests/testData/refactoring/introduceParameterObject/innerClass/after/Test.java +++ b/java/java-tests/testData/refactoring/introduceParameterObject/innerClass/after/Test.java @@ -5,10 +5,10 @@ class Test { void bar(String s){} - public static class Param { + private static class Param { private final String s; - public Param(String s) { + private Param(String s) { this.s = s; } diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/innerClassInInterface/after/Test.java b/java/java-tests/testData/refactoring/introduceParameterObject/innerClassInInterface/after/Test.java index a3e7d0ecd88a..dd973a660124 100644 --- a/java/java-tests/testData/refactoring/introduceParameterObject/innerClassInInterface/after/Test.java +++ b/java/java-tests/testData/refactoring/introduceParameterObject/innerClassInInterface/after/Test.java @@ -1,10 +1,10 @@ public interface Test { void foo(Param param); - public static class Param { + private static class Param { private final String s; - public Param(String s) { + private Param(String s) { this.s = s; } @@ -15,6 +15,6 @@ public interface Test { } class TestImpl implements Test { - void foo(Param param){} + void foo(Test.Param param){} } diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Test.java b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Test.java new file mode 100644 index 000000000000..4c8d318f4edf --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Test.java @@ -0,0 +1,19 @@ +class Test { + void foo(Param param) { + bar(param.getS()); + } + + void bar(String s){} + + static class Param { + private final String s; + + Param(String s) { + this.s = s; + } + + public String getS() { + return s; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Usage.java b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Usage.java new file mode 100644 index 000000000000..940289bb9f58 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/after/Usage.java @@ -0,0 +1,5 @@ +class Usage { + void barr(Test t) { + t.foo(new Test.Param("")); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Test.java b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Test.java new file mode 100644 index 000000000000..9a20bc404d04 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Test.java @@ -0,0 +1,7 @@ +class Test { + void foo(String s) { + bar(s); + } + + void bar(String s){} +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Usage.java b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Usage.java new file mode 100644 index 000000000000..18f62accd7d8 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceParameterObject/usedInnerClass/before/Usage.java @@ -0,0 +1,5 @@ +class Usage { + void barr(Test t) { + t.foo(""); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java index f45e65841619..3f16f2d70849 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceParameterObjectTest.java @@ -68,6 +68,10 @@ public class IntroduceParameterObjectTest extends MultiFileTestCase{ doTest(false, true); } + public void testUsedInnerClass() throws Exception { + doTest(false, true); + } + public void testPrimitive() throws Exception { doTest(); }