generate visibility setting for create from usage, generate getter/setter/constructor (IDEA-120662, IDEA-64613, IDEA-122025)

This commit is contained in:
Anna Kozlova
2014-04-16 16:42:09 +02:00
parent a850470ed2
commit 199e9d8119
17 changed files with 75 additions and 23 deletions
@@ -168,7 +168,7 @@
</grid>
<grid id="81c32" binding="myMembersPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="0" column="1" row-span="5" col-span="1" vsize-policy="3" hsize-policy="3" anchor="1" fill="3" indent="0" use-parent-layout="false"/>
<grid row="0" column="1" row-span="2" col-span="1" vsize-policy="3" hsize-policy="3" anchor="1" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<clientProperties>
@@ -283,6 +283,21 @@
</component>
</children>
</grid>
<grid id="edade" binding="myVisibilityPanel" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints>
<grid row="2" column="1" row-span="3" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
</constraints>
<properties/>
<clientProperties>
<BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndent"/>
</clientProperties>
<border type="none"/>
<children>
<vspacer id="69bbc">
<constraints border-constraint="Center"/>
</vspacer>
</children>
</grid>
</children>
</grid>
</children>
@@ -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;
}
@@ -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;
}
@@ -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;
}
}
@@ -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();
@@ -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
@@ -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) {
@@ -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) {
@@ -1,4 +1,4 @@
public abstract class Test {
protected Test() {<caret>
public Test() {<caret>
}
}
@@ -1,7 +1,7 @@
class Parent {
Object menu;
Parent(Object menu) {
public Parent(Object menu) {
this.menu = menu;
}
}
@@ -1,7 +1,7 @@
class Test {
private int _foo;
Test(int foo) {
public Test(int foo) {
_foo = foo;
}
}
@@ -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;
}
@@ -1,5 +1,5 @@
class A
{
A() {
public A() {<caret>
}
}
@@ -1,4 +1,4 @@
class Test {
Test() {<caret>
public Test() {<caret>
}
}
@@ -1,6 +1,6 @@
class Test {
private class Foo {
private Foo() {<caret>
public Foo() {<caret>
}
}
}
@@ -7,7 +7,7 @@ class Parent<T> {
}
class Child<Integer> extends Parent<Integer> {
Child(Integer field) {
public Child(Integer field) {
super(field);
}
}
@@ -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;