generate getters/setters: prefer less visibility corresponding to containing class (IDEA-95697)

This commit is contained in:
anna
2012-12-03 17:06:28 +01:00
parent ee6d7d7226
commit 5112e8dce9
8 changed files with 58 additions and 36 deletions
@@ -16,15 +16,15 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.generation.GenerateConstructorHandler;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.VisibilityUtil;
import org.jetbrains.annotations.NotNull;
public class AddDefaultConstructorFix extends AddMethodFix {
public AddDefaultConstructorFix(PsiClass aClass) {
this(aClass, GenerateConstructorHandler.getConstructorModifier(aClass));
this(aClass, PsiUtil.getMaximumModifierForMember(aClass));
}
public AddDefaultConstructorFix(PsiClass aClass, @NotNull @PsiModifier.ModifierConstant final String modifier) {
@@ -15,21 +15,22 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.intention.LowPriorityAction;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.*;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/**
* @author ven
*/
@@ -113,11 +114,19 @@ public class CreateGetterOrSetterFix implements IntentionAction, LowPriorityActi
public void invoke(@NotNull Project project, Editor editor, PsiFile file) throws IncorrectOperationException {
if (!CodeInsightUtilBase.preparePsiElementForWrite(myField)) return;
PsiClass aClass = myField.getContainingClass();
final List<PsiMethod> methods = new ArrayList<PsiMethod>();
if (myCreateGetter) {
aClass.add(PropertyUtil.generateGetterPrototype(myField));
methods.add(PropertyUtil.generateGetterPrototype(myField));
}
if (myCreateSetter) {
aClass.add(PropertyUtil.generateSetterPrototype(myField));
methods.add(PropertyUtil.generateSetterPrototype(myField));
}
for (PsiMethod method : methods) {
String modifier = PsiUtil.getMaximumModifierForMember(aClass);
if (modifier != null) {
PsiUtil.setModifierProperty(method, modifier, true);
}
aClass.add(method);
}
}
@@ -219,7 +219,7 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(manager.getProject());
PsiMethod constructor = factory.createConstructor(aClass.getName(), aClass);
String modifier = getConstructorModifier(aClass);
String modifier = PsiUtil.getMaximumModifierForMember(aClass);
if (modifier != null) {
PsiUtil.setModifierProperty(constructor, modifier, true);
}
@@ -297,26 +297,6 @@ public class GenerateConstructorHandler extends GenerateMembersHandlerBase {
return constructor;
}
@PsiModifier.ModifierConstant
public static String getConstructorModifier(final PsiClass aClass) {
String modifier = PsiModifier.PUBLIC;
if (aClass.hasModifierProperty(PsiModifier.ABSTRACT) && !aClass.isEnum()) {
modifier = PsiModifier.PROTECTED;
}
else if (aClass.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) {
modifier = PsiModifier.PACKAGE_LOCAL;
}
else if (aClass.hasModifierProperty(PsiModifier.PRIVATE)) {
modifier = PsiModifier.PRIVATE;
}
else if (aClass.isEnum()) {
modifier = PsiModifier.PRIVATE;
}
return modifier;
}
@Override
protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember originalMember) {
LOG.assertTrue(false);
@@ -19,6 +19,7 @@ import com.intellij.psi.*;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.util.PsiFormatUtil;
import com.intellij.psi.util.PsiFormatUtilBase;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.Nullable;
/**
@@ -45,8 +46,20 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements E
@Nullable
private static PsiMethod createMethodIfNotExists(final PsiField field, final PsiMethod template) {
PsiMethod existing = field.getContainingClass().findMethodBySignature(template, false);
return existing == null ? template : null;
final PsiClass aClass = field.getContainingClass();
PsiMethod existing = aClass.findMethodBySignature(template, false);
if (existing == null) {
if (template != null) {
String modifier = PsiUtil.getMaximumModifierForMember(aClass);
if (modifier != null) {
PsiUtil.setModifierProperty(template, modifier, true);
}
}
return template;
}
else {
return null;
}
}
@Override
@@ -702,6 +702,26 @@ public final class PsiUtil extends PsiUtilCore {
return psiClass != null && psiClass.isAnnotationType();
}
@PsiModifier.ModifierConstant
public static String getMaximumModifierForMember(final PsiClass aClass) {
String modifier = PsiModifier.PUBLIC;
if (aClass.hasModifierProperty(PsiModifier.ABSTRACT) && !aClass.isEnum()) {
modifier = PsiModifier.PROTECTED;
}
else if (aClass.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) {
modifier = PsiModifier.PACKAGE_LOCAL;
}
else if (aClass.hasModifierProperty(PsiModifier.PRIVATE)) {
modifier = PsiModifier.PRIVATE;
}
else if (aClass.isEnum()) {
modifier = PsiModifier.PRIVATE;
}
return modifier;
}
private static class TypeParameterIterator implements Iterator<PsiTypeParameter> {
private int myIndex;
private PsiTypeParameterListOwner myCurrentOwner;
@@ -2,7 +2,7 @@
class A {
private String s;
public String getS() {
String getS() {
return s;
}
}
@@ -2,11 +2,11 @@
class A {
private String s;
public String getS() {
String getS() {
return s;
}
public void setS(String s) {
void setS(String s) {
this.s = s;
}
}
@@ -2,7 +2,7 @@
class A {
private String s;
public void setS(String s) {
void setS(String s) {
this.s = s;
}
}