From 199e9d81192da7bbb5e16a237df7c87a130dcbac Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 16 Apr 2014 16:38:15 +0200 Subject: [PATCH] generate visibility setting for create from usage, generate getter/setter/constructor (IDEA-120662, IDEA-64613, IDEA-122025) --- .../CodeStyleGenerationConfigurable.form | 17 +++++++++++++- .../CodeStyleGenerationConfigurable.java | 9 ++++++++ .../CreateAbstractMethodFromUsageFix.java | 2 +- .../impl/quickfix/CreateFromUsageBaseFix.java | 15 +++++++++---- .../GenerateConstructorHandler.java | 6 +---- .../generation/GenerateMembersUtil.java | 22 ++++++++++++++++--- .../GetterSetterPrototypeProvider.java | 2 +- .../src/com/intellij/util/VisibilityUtil.java | 6 +++++ .../afterAbstractClass.java | 2 +- .../afterFieldPrefixCoincidence.java | 2 +- .../afterFieldPrefixCoincidence1.java | 2 +- .../afterFinalFieldPreselection.java | 2 +- .../afterImmediatelyAfterRBrace.java | 2 +- .../afterPackageLocalClass.java | 2 +- .../afterPrivateClass.java | 2 +- .../afterSubstitution.java | 2 +- .../psi/codeStyle/CodeStyleSettings.java | 3 +++ 17 files changed, 75 insertions(+), 23 deletions(-) diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.form b/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.form index f3656e9f1a7a..6c8a5e4d3489 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.form +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.form @@ -168,7 +168,7 @@ - + @@ -283,6 +283,21 @@ + + + + + + + + + + + + + + + diff --git a/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java b/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java index 7d09903487b2..91b40d12a837 100644 --- a/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java +++ b/java/java-impl/src/com/intellij/application/options/CodeStyleGenerationConfigurable.java @@ -25,6 +25,7 @@ import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; +import com.intellij.refactoring.ui.JavaVisibilityPanel; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.ToolbarDecorator; import com.intellij.ui.components.JBList; @@ -35,6 +36,7 @@ import java.util.*; import java.util.List; public class CodeStyleGenerationConfigurable implements Configurable { + private final JavaVisibilityPanel myJavaVisibilityPanel; JPanel myPanel; private JTextField myFieldPrefixField; private JTextField myStaticFieldPrefixField; @@ -59,17 +61,20 @@ public class CodeStyleGenerationConfigurable implements Configurable { private JCheckBox myInsertOverrideAnnotationCheckBox; private JPanel myMembersPanel; private JCheckBox myRepeatSynchronizedCheckBox; + private JPanel myVisibilityPanel; public CodeStyleGenerationConfigurable(CodeStyleSettings settings) { mySettings = settings; myMembersOrderList = new MembersOrderList(); myPanel.setBorder(IdeBorderFactory.createEmptyBorder(2, 2, 2, 2)); + myJavaVisibilityPanel = new JavaVisibilityPanel(false, true); } public JComponent createComponent() { final JPanel panel = ToolbarDecorator.createDecorator(myMembersOrderList) .disableAddAction().disableRemoveAction().createPanel(); myMembersPanel.add(panel, BorderLayout.CENTER); + myVisibilityPanel.add(myJavaVisibilityPanel, BorderLayout.CENTER); return myPanel; } @@ -229,6 +234,7 @@ public class CodeStyleGenerationConfigurable implements Configurable { myCbUseExternalAnnotations.setSelected(settings.USE_EXTERNAL_ANNOTATIONS); myInsertOverrideAnnotationCheckBox.setSelected(settings.INSERT_OVERRIDE_ANNOTATION); myRepeatSynchronizedCheckBox.setSelected(settings.REPEAT_SYNCHRONIZED); + myJavaVisibilityPanel.setVisibility(settings.VISIBILITY); } public void reset() { @@ -258,6 +264,8 @@ public class CodeStyleGenerationConfigurable implements Configurable { settings.USE_EXTERNAL_ANNOTATIONS = myCbUseExternalAnnotations.isSelected(); settings.INSERT_OVERRIDE_ANNOTATION = myInsertOverrideAnnotationCheckBox.isSelected(); settings.REPEAT_SYNCHRONIZED = myRepeatSynchronizedCheckBox.isSelected(); + + settings.VISIBILITY = myJavaVisibilityPanel.getVisibility(); myMembersOrderList.apply(settings); @@ -306,6 +314,7 @@ public class CodeStyleGenerationConfigurable implements Configurable { isModified |= isModified(myRepeatSynchronizedCheckBox, settings.REPEAT_SYNCHRONIZED); isModified |= myMembersOrderList.isModified(settings); + isModified |= !settings.VISIBILITY.equals(myJavaVisibilityPanel.getVisibility()); return isModified; } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java index c20848cc26a6..abcff2238c68 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateAbstractMethodFromUsageFix.java @@ -45,7 +45,7 @@ public class CreateAbstractMethodFromUsageFix extends CreateMethodFromUsageFix { } @Override - protected String getVisibility(PsiClass parentClass, PsiClass targetClass) { + protected String getVisibility(PsiClass parentClass, @NotNull PsiClass targetClass) { String result = super.getVisibility(parentClass, targetClass); return PsiModifier.PUBLIC.equals(result) ? result : PsiModifier.PROTECTED; } diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java index 16eb888c1ed6..062b8a170d49 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateFromUsageBaseFix.java @@ -35,6 +35,7 @@ import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.PsiUtilCore; @@ -162,20 +163,26 @@ public abstract class CreateFromUsageBaseFix extends BaseIntentionAction { return FileEditorManager.getInstance(project).openTextEditor(descriptor, true); } - protected void setupVisibility(PsiClass parentClass, PsiClass targetClass, PsiModifierList list) throws IncorrectOperationException { + protected void setupVisibility(PsiClass parentClass, @NotNull PsiClass targetClass, PsiModifierList list) throws IncorrectOperationException { if (targetClass.isInterface() && list.getFirstChild() != null) { list.deleteChildRange(list.getFirstChild(), list.getLastChild()); return; } - VisibilityUtil.setVisibility(list, getVisibility(parentClass, targetClass)); + final String visibility = getVisibility(parentClass, targetClass); + if (VisibilityUtil.ESCALATE_VISIBILITY.equals(visibility)) { + list.setModifierProperty(PsiModifier.PRIVATE, true); + VisibilityUtil.escalateVisibility(list, parentClass); + } else { + VisibilityUtil.setVisibility(list, visibility); + } } @PsiModifier.ModifierConstant - protected String getVisibility(PsiClass parentClass, PsiClass targetClass) { + protected String getVisibility(PsiClass parentClass, @NotNull PsiClass targetClass) { if (parentClass != null && (parentClass.equals(targetClass) || PsiTreeUtil.isAncestor(targetClass, parentClass, true))) { return PsiModifier.PRIVATE; } else { - return PsiModifier.PUBLIC; + return CodeStyleSettingsManager.getSettings(targetClass.getProject()).VISIBILITY; } } diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java index 736b9eda280a..7b36bdc33c9d 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateConstructorHandler.java @@ -29,7 +29,6 @@ import com.intellij.psi.codeStyle.CodeStyleManager; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.javadoc.PsiDocComment; -import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; @@ -217,11 +216,8 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase { CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject()); PsiMethod constructor = factory.createConstructor(aClass.getName(), aClass); - String modifier = PsiUtil.getMaximumModifierForMember(aClass, false); - if (modifier != null) { - PsiUtil.setModifierProperty(constructor, modifier, true); - } + GenerateMembersUtil.setVisibility(aClass, constructor); if (baseConstructor != null){ PsiJavaCodeReferenceElement[] throwRefs = baseConstructor.getThrowsList().getReferenceElements(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java index 1288318e4d52..f7972b82c12b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateMembersUtil.java @@ -30,7 +30,10 @@ import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.codeStyle.*; +import com.intellij.psi.codeStyle.CodeStyleManager; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.psi.codeStyle.JavaCodeStyleManager; +import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.impl.light.LightTypeElement; import com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl; import com.intellij.psi.javadoc.PsiDocComment; @@ -44,6 +47,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.VisibilityUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.text.UniqueNameGenerator; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -582,12 +586,24 @@ public class GenerateMembersUtil { @Nullable public static PsiMethod generateGetterPrototype(@NotNull PsiField field) { - return annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateGetterPrototype(field)); + return setVisibility(field, annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateGetterPrototype(field))); } @Nullable public static PsiMethod generateSetterPrototype(@NotNull PsiField field) { - return annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateSetterPrototype(field)); + return setVisibility(field, annotateOnOverrideImplement(field.getContainingClass(), PropertyUtil.generateSetterPrototype(field))); + } + + @Contract("_, null -> null") + public static PsiMethod setVisibility(PsiMember member, PsiMethod prototype) { + if (prototype == null) return null; + final String visibility = CodeStyleSettingsManager.getSettings(member.getProject()).VISIBILITY; + final PsiModifierList modifierList = prototype.getModifierList(); + final String newVisibility = VisibilityUtil.ESCALATE_VISIBILITY.equals(visibility) + ? PsiUtil.getMaximumModifierForMember(member instanceof PsiClass ? (PsiClass)member : member.getContainingClass(), false) + : visibility; + VisibilityUtil.setVisibility(modifierList, newVisibility); + return prototype; } @Nullable diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GetterSetterPrototypeProvider.java b/java/java-impl/src/com/intellij/codeInsight/generation/GetterSetterPrototypeProvider.java index 521445725ef0..782843cc8be3 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GetterSetterPrototypeProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GetterSetterPrototypeProvider.java @@ -52,7 +52,7 @@ public abstract class GetterSetterPrototypeProvider { return generateGetter ? provider.generateGetters(field) : provider.generateSetters(field); } } - return new PsiMethod[] {generateGetter ? PropertyUtil.generateGetterPrototype(field) : PropertyUtil.generateSetterPrototype(field)}; + return new PsiMethod[]{generateGetter ? GenerateMembersUtil.generateGetterPrototype(field) : GenerateMembersUtil.generateSetterPrototype(field)}; } public static boolean isReadOnlyProperty(PsiField field) { diff --git a/java/java-psi-api/src/com/intellij/util/VisibilityUtil.java b/java/java-psi-api/src/com/intellij/util/VisibilityUtil.java index e1f30930c75b..04aa459203ec 100644 --- a/java/java-psi-api/src/com/intellij/util/VisibilityUtil.java +++ b/java/java-psi-api/src/com/intellij/util/VisibilityUtil.java @@ -67,6 +67,12 @@ public class VisibilityUtil { } } + public static void escalateVisibility(PsiModifierList modifierList, PsiElement place) throws IncorrectOperationException { + final PsiElement parent = modifierList.getParent(); + if (parent instanceof PsiMember) { + escalateVisibility((PsiMember)parent, place); + } + } @PsiModifier.ModifierConstant public static String getPossibleVisibility(final PsiMember psiMethod, final PsiElement place) { diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java b/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java index 6e850b123246..bbf363cedb34 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java @@ -1,4 +1,4 @@ public abstract class Test { - protected Test() { + public Test() { } } diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java index 9ae5a0b2ec4d..d783ba3af819 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java @@ -1,7 +1,7 @@ class Parent { Object menu; - Parent(Object menu) { + public Parent(Object menu) { this.menu = menu; } } diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java index 29be0de779ed..3b3c4ac48e04 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java @@ -1,7 +1,7 @@ class Test { private int _foo; - Test(int foo) { + public Test(int foo) { _foo = foo; } } \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java index bd402a9b28b7..afac816dc6ab 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java @@ -4,7 +4,7 @@ class Test { private int c; private final int d; - Test(int b, int d) { + public Test(int b, int d) { this.b = b; this.d = d; } diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java b/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java index f5b985840745..84e94c50e08f 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java @@ -1,5 +1,5 @@ class A { - A() { + public A() { } } diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java b/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java index 0d9b0ade18c9..8a885805af98 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java @@ -1,4 +1,4 @@ class Test { - Test() { + public Test() { } } diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java b/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java index 19906167ba60..e0f41778cdb7 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java @@ -1,6 +1,6 @@ class Test { private class Foo { - private Foo() { + public Foo() { } } } diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java b/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java index f457956a2f25..696adcccddd5 100644 --- a/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java +++ b/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java @@ -7,7 +7,7 @@ class Parent { } class Child extends Parent { - Child(Integer field) { + public Child(Integer field) { super(field); } } diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java index 10de34286fb1..f3ed4620c3fa 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java @@ -207,6 +207,9 @@ public class CodeStyleSettings extends CommonCodeStyleSettings implements Clonea public boolean GENERATE_FINAL_LOCALS = false; public boolean GENERATE_FINAL_PARAMETERS = false; +//----------------- visibility ----------------------------- + public String VISIBILITY = "public"; + //----------------- generate parentheses around method arguments ---------- public boolean PARENTHESES_AROUND_METHOD_ARGUMENTS = true;