IJ-CR-144148 [java] IDEA-358751 Java Annotations copied to generated getter / setter

- rework settings

GitOrigin-RevId: fc914bfed1b8046eccf2e76054c39f4c2ad7359c
This commit is contained in:
Mikhail Pyltsin
2024-09-12 19:41:09 +02:00
committed by intellij-monorepo-bot
parent 379719b7ea
commit 1f476ec640
14 changed files with 93 additions and 53 deletions

View File

@@ -19,14 +19,11 @@ import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
public interface EncapsulatableClassMember extends ClassMember { public interface EncapsulatableClassMember extends ClassMember {
/** /**
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
* @deprecated please, use {@link EncapsulatableClassMember#generateGetter(EnumSet)} * @deprecated please, use {@link EncapsulatableClassMember#generateGetter(SetterGetterGenerationOptions)}
*/ */
@Deprecated @Deprecated
@Nullable @Nullable
@@ -34,7 +31,7 @@ public interface EncapsulatableClassMember extends ClassMember {
/** /**
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
* @deprecated please, use {@link EncapsulatableClassMember#generateSetter(EnumSet)} * @deprecated please, use {@link EncapsulatableClassMember#generateSetter(SetterGetterGenerationOptions)}
*/ */
@Deprecated @Deprecated
@Nullable @Nullable
@@ -44,7 +41,7 @@ public interface EncapsulatableClassMember extends ClassMember {
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
*/ */
@Nullable @Nullable
default GenerationInfo generateGetter(@NotNull EnumSet<Option> options) throws IncorrectOperationException { default GenerationInfo generateGetter(@NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException {
return generateGetter(); return generateGetter();
} }
@@ -52,7 +49,7 @@ public interface EncapsulatableClassMember extends ClassMember {
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
*/ */
@Nullable @Nullable
default GenerationInfo generateSetter(@NotNull EnumSet<Option> options) throws IncorrectOperationException { default GenerationInfo generateSetter(@NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException {
return generateSetter(); return generateSetter();
} }
@@ -63,7 +60,4 @@ public interface EncapsulatableClassMember extends ClassMember {
return false; return false;
} }
enum Option {
COPY_ALL_ANNOTATIONS
}
} }

View File

@@ -40,6 +40,7 @@ public class GenerateGetterAndSetterHandler extends GenerateGetterSetterHandlerB
@Override @Override
public GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException { public GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException {
if (aClass == null) return GenerationInfo.EMPTY_ARRAY;
myGenerateGetterHandler.myGenerateAnnotations = myGenerateAnnotations; myGenerateGetterHandler.myGenerateAnnotations = myGenerateAnnotations;
myGenerateSetterHandler.myGenerateAnnotations = myGenerateAnnotations; myGenerateSetterHandler.myGenerateAnnotations = myGenerateAnnotations;
ArrayList<GenerationInfo> array = new ArrayList<>(); ArrayList<GenerationInfo> array = new ArrayList<>();

View File

@@ -34,12 +34,14 @@ public class GenerateGetterHandler extends GenerateGetterSetterHandlerBase {
@Override @Override
protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException { protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException {
if (aClass == null) return GenerationInfo.EMPTY_ARRAY;
if (original instanceof PropertyClassMember propertyClassMember) { if (original instanceof PropertyClassMember propertyClassMember) {
final GenerationInfo[] getters = propertyClassMember.generateGetters(aClass, getOptions()); final GenerationInfo[] getters = propertyClassMember.generateGetters(aClass, getOptions());
if (getters != null) { if (getters != null) {
return getters; return getters;
} }
} else if (original instanceof EncapsulatableClassMember encapsulatableClassMember) { }
else if (original instanceof EncapsulatableClassMember encapsulatableClassMember) {
final GenerationInfo getter = encapsulatableClassMember.generateGetter(getOptions()); final GenerationInfo getter = encapsulatableClassMember.generateGetter(getOptions());
if (getter != null) { if (getter != null) {
return new GenerationInfo[]{getter}; return new GenerationInfo[]{getter};

View File

@@ -3,6 +3,7 @@ package com.intellij.codeInsight.generation;
import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.hint.HintManager;
import com.intellij.java.JavaBundle; import com.intellij.java.JavaBundle;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.options.ShowSettingsUtil;
@@ -31,7 +32,6 @@ import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.Collection; import java.util.Collection;
import java.util.EnumSet;
import java.util.List; import java.util.List;
public abstract class GenerateGetterSetterHandlerBase extends GenerateMembersHandlerBase { public abstract class GenerateGetterSetterHandlerBase extends GenerateMembersHandlerBase {
@@ -40,7 +40,7 @@ public abstract class GenerateGetterSetterHandlerBase extends GenerateMembersHan
protected boolean myGenerateAnnotations; protected boolean myGenerateAnnotations;
@Nullable @Nullable
private JBCheckBox myGenerateAnnotationsCheckBox; private JBCheckBox myGenerateAnnotationsCheckBox;
private boolean supportsAnnotations;
public GenerateGetterSetterHandlerBase(@NlsContexts.DialogTitle String chooserTitle) { public GenerateGetterSetterHandlerBase(@NlsContexts.DialogTitle String chooserTitle) {
super(chooserTitle); super(chooserTitle);
} }
@@ -57,6 +57,9 @@ public abstract class GenerateGetterSetterHandlerBase extends GenerateMembersHan
@Override @Override
protected ClassMember[] chooseOriginalMembers(PsiClass aClass, Project project, Editor editor) { protected ClassMember[] chooseOriginalMembers(PsiClass aClass, Project project, Editor editor) {
if (aClass.getLanguage() == JavaLanguage.INSTANCE) {
supportsAnnotations = true;
}
final ClassMember[] allMembers = getAllOriginalMembers(aClass); final ClassMember[] allMembers = getAllOriginalMembers(aClass);
if (allMembers == null) { if (allMembers == null) {
HintManager.getInstance().showErrorHint(editor, getNothingFoundMessage()); HintManager.getInstance().showErrorHint(editor, getNothingFoundMessage());
@@ -77,23 +80,27 @@ public abstract class GenerateGetterSetterHandlerBase extends GenerateMembersHan
@Nullable Editor editor) { @Nullable Editor editor) {
ClassMember[] chosenMembers = super.chooseMembers(members, allowEmptySelection, copyJavadocCheckbox, project, editor); ClassMember[] chosenMembers = super.chooseMembers(members, allowEmptySelection, copyJavadocCheckbox, project, editor);
myGenerateAnnotations = myGenerateAnnotationsCheckBox != null && myGenerateAnnotationsCheckBox.isSelected(); myGenerateAnnotations = myGenerateAnnotationsCheckBox != null && myGenerateAnnotationsCheckBox.isSelected();
project.getService(JavaGeneratorSettingsStorage.class).getState().setGenerateAllAnnotations(myGenerateAnnotations);
myGenerateAnnotationsCheckBox = null; myGenerateAnnotationsCheckBox = null;
return chosenMembers; return chosenMembers;
} }
@Override @Override
protected JComponent @Nullable [] getOptionControls() { protected JComponent @Nullable [] getOptionControls(@Nullable Project project) {
if (project == null) return null;
if (!supportsAnnotations) return null;
if (myGenerateAnnotationsCheckBox == null) { if (myGenerateAnnotationsCheckBox == null) {
myGenerateAnnotationsCheckBox = new JBCheckBox(JavaBundle.message("generate.getter.setter.generate.all.annotations"), false); boolean annotations = project.getService(JavaGeneratorSettingsStorage.class).getState().getGenerateAllAnnotations();
myGenerateAnnotationsCheckBox = new JBCheckBox(JavaBundle.message("generate.getter.setter.generate.all.annotations"), annotations);
myGenerateAnnotationsCheckBox.setToolTipText(JavaBundle.message("generate.getter.setter.generate.all.annotations.tooltip")); myGenerateAnnotationsCheckBox.setToolTipText(JavaBundle.message("generate.getter.setter.generate.all.annotations.tooltip"));
} }
return new JComponent[] {myGenerateAnnotationsCheckBox}; return new JComponent[]{myGenerateAnnotationsCheckBox};
} }
protected @NotNull EnumSet<EncapsulatableClassMember.Option> getOptions() { protected @NotNull SetterGetterGenerationOptions getOptions() {
return myGenerateAnnotations return myGenerateAnnotations
? EnumSet.of(EncapsulatableClassMember.Option.COPY_ALL_ANNOTATIONS) ? new SetterGetterGenerationOptions(true)
: EnumSet.noneOf(EncapsulatableClassMember.Option.class); : new SetterGetterGenerationOptions(false);
} }
protected static JComponent getHeaderPanel(final Project project, final TemplatesManager templatesManager, final @Nls String templatesTitle) { protected static JComponent getHeaderPanel(final Project project, final TemplatesManager templatesManager, final @Nls String templatesTitle) {

View File

@@ -232,7 +232,7 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan
boolean copyJavadocCheckbox, boolean copyJavadocCheckbox,
Project project) { Project project) {
MemberChooser<ClassMember> chooser = MemberChooser<ClassMember> chooser =
new MemberChooser<>(members, allowEmptySelection, true, project, getHeaderPanel(project), getOptionControls()) { new MemberChooser<>(members, allowEmptySelection, true, project, getHeaderPanel(project), getOptionControls(project)) {
@Override @Override
protected @Nullable String getHelpId() { protected @Nullable String getHelpId() {
return GenerateMembersHandlerBase.this.getHelpId(); return GenerateMembersHandlerBase.this.getHelpId();
@@ -247,6 +247,10 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan
return null; return null;
} }
protected JComponent @Nullable [] getOptionControls(@Nullable Project project) {
return getOptionControls();
}
protected JComponent @Nullable [] getOptionControls() { protected JComponent @Nullable [] getOptionControls() {
return null; return null;
} }

View File

@@ -763,29 +763,29 @@ public final class GenerateMembersUtil {
} }
public static @NotNull PsiMethod generateSetterPrototype(@NotNull PsiField field, PsiClass aClass) { public static @NotNull PsiMethod generateSetterPrototype(@NotNull PsiField field, PsiClass aClass) {
return generatePrototype(field, aClass, true, EnumSet.noneOf(EncapsulatableClassMember.Option.class), SetterTemplatesManager.getInstance()); return generatePrototype(field, aClass, true, SetterGetterGenerationOptions.empty(), SetterTemplatesManager.getInstance());
} }
static @NotNull PsiMethod generateGetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate) { static @NotNull PsiMethod generateGetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate) {
return generateGetterPrototype(field, ignoreInvalidTemplate, EnumSet.noneOf(EncapsulatableClassMember.Option.class)); return generateGetterPrototype(field, ignoreInvalidTemplate, SetterGetterGenerationOptions.empty());
} }
static @NotNull PsiMethod generateSetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate) { static @NotNull PsiMethod generateSetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate) {
return generateSetterPrototype(field, ignoreInvalidTemplate, EnumSet.noneOf(EncapsulatableClassMember.Option.class)); return generateSetterPrototype(field, ignoreInvalidTemplate, SetterGetterGenerationOptions.empty());
} }
static @NotNull PsiMethod generateGetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate, @NotNull EnumSet<EncapsulatableClassMember.Option> options) { static @NotNull PsiMethod generateGetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate, @NotNull SetterGetterGenerationOptions options) {
return generatePrototype(field, field.getContainingClass(), ignoreInvalidTemplate, options, GetterTemplatesManager.getInstance()); return generatePrototype(field, field.getContainingClass(), ignoreInvalidTemplate, options, GetterTemplatesManager.getInstance());
} }
static @NotNull PsiMethod generateSetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate, @NotNull EnumSet<EncapsulatableClassMember.Option> options) { static @NotNull PsiMethod generateSetterPrototype(@NotNull PsiField field, boolean ignoreInvalidTemplate, @NotNull SetterGetterGenerationOptions options) {
return generatePrototype(field, field.getContainingClass(), ignoreInvalidTemplate, options, SetterTemplatesManager.getInstance()); return generatePrototype(field, field.getContainingClass(), ignoreInvalidTemplate, options, SetterTemplatesManager.getInstance());
} }
private static @NotNull PsiMethod generatePrototype(@NotNull PsiField field, private static @NotNull PsiMethod generatePrototype(@NotNull PsiField field,
PsiClass psiClass, PsiClass psiClass,
boolean ignoreInvalidTemplate, boolean ignoreInvalidTemplate,
@NotNull EnumSet<EncapsulatableClassMember.Option> options, @NotNull SetterGetterGenerationOptions options,
@NotNull TemplatesManager templatesManager) { @NotNull TemplatesManager templatesManager) {
Project project = field.getProject(); Project project = field.getProject();
PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
@@ -833,8 +833,7 @@ public final class GenerateMembersUtil {
} }
if (annotationTarget != null) { if (annotationTarget != null) {
PsiType fieldType = field.getType(); PsiType fieldType = field.getType();
String type = options.contains(EncapsulatableClassMember.Option.COPY_ALL_ANNOTATIONS) ? fieldType.getCanonicalText(true) : String type = options.copyAllAnnotations() ? fieldType.getCanonicalText(true) : getTypeWithNullableAnnotations(factory, fieldType);
getTypeWithNullableAnnotations(factory, fieldType);
if (annotationTarget instanceof PsiParameter psiParameter && psiParameter.getTypeElement() != null) { if (annotationTarget instanceof PsiParameter psiParameter && psiParameter.getTypeElement() != null) {
psiParameter.getTypeElement().replace(factory.createTypeElementFromText(type, psiParameter)); psiParameter.getTypeElement().replace(factory.createTypeElementFromText(type, psiParameter));
} }

View File

@@ -36,6 +36,7 @@ public class GenerateSetterHandler extends GenerateGetterSetterHandlerBase {
@Override @Override
protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException { protected GenerationInfo[] generateMemberPrototypes(PsiClass aClass, ClassMember original) throws IncorrectOperationException {
if (aClass == null) return GenerationInfo.EMPTY_ARRAY;
if (original instanceof PropertyClassMember propertyClassMember) { if (original instanceof PropertyClassMember propertyClassMember) {
final GenerationInfo[] getters = propertyClassMember.generateSetters(aClass, getOptions()); final GenerationInfo[] getters = propertyClassMember.generateSetters(aClass, getOptions());
if (getters != null) { if (getters != null) {

View File

@@ -11,8 +11,6 @@ import com.intellij.util.indexing.DumbModeAccessType;
import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.EnumSet;
public abstract class GetterSetterPrototypeProvider { public abstract class GetterSetterPrototypeProvider {
public static final ExtensionPointName<GetterSetterPrototypeProvider> EP_NAME = ExtensionPointName.create("com.intellij.getterSetterProvider"); public static final ExtensionPointName<GetterSetterPrototypeProvider> EP_NAME = ExtensionPointName.create("com.intellij.getterSetterProvider");
@Contract(pure = true) @Contract(pure = true)
@@ -44,13 +42,13 @@ public abstract class GetterSetterPrototypeProvider {
public static PsiMethod[] generateGetterSetters(PsiField field, public static PsiMethod[] generateGetterSetters(PsiField field,
boolean generateGetter, boolean generateGetter,
boolean ignoreInvalidTemplate) { boolean ignoreInvalidTemplate) {
return generateGetterSetters(field, generateGetter, ignoreInvalidTemplate, EnumSet.noneOf(EncapsulatableClassMember.Option.class)); return generateGetterSetters(field, generateGetter, ignoreInvalidTemplate, SetterGetterGenerationOptions.empty());
} }
public static PsiMethod[] generateGetterSetters(PsiField field, public static PsiMethod[] generateGetterSetters(PsiField field,
boolean generateGetter, boolean generateGetter,
boolean ignoreInvalidTemplate, boolean ignoreInvalidTemplate,
@NotNull EnumSet<EncapsulatableClassMember.Option> options) { @NotNull SetterGetterGenerationOptions options) {
for (GetterSetterPrototypeProvider provider : EP_NAME.getExtensionList()) { for (GetterSetterPrototypeProvider provider : EP_NAME.getExtensionList()) {
if (provider.canGeneratePrototypeFor(field)) { if (provider.canGeneratePrototypeFor(field)) {
return generateGetter ? provider.generateGetters(field) : provider.generateSetters(field); return generateGetter ? provider.generateGetters(field) : provider.generateSetters(field);

View File

@@ -0,0 +1,14 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.generation
import com.intellij.openapi.components.*
@Service(Service.Level.PROJECT)
@State(name = "JavaGeneratorSettingsStorage",
storages = [Storage(StoragePathMacros.WORKSPACE_FILE)])
class JavaGeneratorSettingsStorage : SimplePersistentStateComponent<JavaGeneratorSettingsStorage.State>(State()) {
class State : BaseState() {
var generateAllAnnotations: Boolean by property(false)
}
}

View File

@@ -20,19 +20,17 @@ import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.EnumSet;
public interface PropertyClassMember extends EncapsulatableClassMember { public interface PropertyClassMember extends EncapsulatableClassMember {
/** /**
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
* @deprecated please, use {@link PropertyClassMember#generateGetters(PsiClass, EnumSet)} * @deprecated please, use {@link PropertyClassMember#generateGetters(PsiClass, SetterGetterGenerationOptions)}
*/ */
@Deprecated @Deprecated
GenerationInfo @Nullable [] generateGetters(PsiClass aClass) throws IncorrectOperationException; GenerationInfo @Nullable [] generateGetters(PsiClass aClass) throws IncorrectOperationException;
/** /**
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
* @deprecated please, use {@link PropertyClassMember#generateSetters(PsiClass, EnumSet)} * @deprecated please, use {@link PropertyClassMember#generateSetters(PsiClass, SetterGetterGenerationOptions)}
*/ */
@Deprecated @Deprecated
GenerationInfo @Nullable [] generateSetters(PsiClass aClass) throws IncorrectOperationException; GenerationInfo @Nullable [] generateSetters(PsiClass aClass) throws IncorrectOperationException;
@@ -40,14 +38,14 @@ public interface PropertyClassMember extends EncapsulatableClassMember {
/** /**
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
*/ */
default GenerationInfo @Nullable [] generateGetters(PsiClass aClass, @NotNull EnumSet<Option> options) throws IncorrectOperationException{ default GenerationInfo @Nullable [] generateGetters(@NotNull PsiClass aClass, @NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException{
return generateGetters(aClass); return generateGetters(aClass);
} }
/** /**
* @return PsiElement or TemplateGenerationInfo * @return PsiElement or TemplateGenerationInfo
*/ */
default GenerationInfo @Nullable [] generateSetters(PsiClass aClass, @NotNull EnumSet<Option> options) throws IncorrectOperationException{ default GenerationInfo @Nullable [] generateSetters(@NotNull PsiClass aClass, @NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException{
return generateSetters(aClass); return generateSetters(aClass);
} }
} }

View File

@@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List; import java.util.List;
public class PsiFieldMember extends PsiElementClassMember<PsiField> implements PropertyClassMember { public class PsiFieldMember extends PsiElementClassMember<PsiField> implements PropertyClassMember {
@@ -25,17 +24,25 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements P
@Override @Override
public @Nullable GenerationInfo generateGetter() throws IncorrectOperationException { public @Nullable GenerationInfo generateGetter() throws IncorrectOperationException {
final GenerationInfo[] infos = generateGetters(getElement().getContainingClass()); return generateGetter(SetterGetterGenerationOptions.empty());
}
@Override
public @Nullable GenerationInfo generateGetter(@NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException {
PsiClass containingClass = getElement().getContainingClass();
if(containingClass == null) return null;
final GenerationInfo[] infos = generateGetters(containingClass, options);
return infos != null && infos.length > 0 ? infos[0] : null; return infos != null && infos.length > 0 ? infos[0] : null;
} }
@Override @Override
public GenerationInfo @Nullable [] generateGetters(PsiClass aClass) throws IncorrectOperationException { public GenerationInfo @Nullable [] generateGetters(PsiClass aClass) throws IncorrectOperationException {
return generateGetters(aClass, EnumSet.noneOf(Option.class)); if (aClass == null) return null;
return generateGetters(aClass, SetterGetterGenerationOptions.empty());
} }
@Override @Override
public GenerationInfo @Nullable [] generateGetters(PsiClass aClass, @NotNull EnumSet<Option> options) throws IncorrectOperationException { public GenerationInfo @Nullable [] generateGetters(@NotNull PsiClass aClass, @NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException {
PsiField field = getElement(); PsiField field = getElement();
if (field.hasModifierProperty(PsiModifier.STATIC) && if (field.hasModifierProperty(PsiModifier.STATIC) &&
field.hasModifierProperty(PsiModifier.FINAL)) { field.hasModifierProperty(PsiModifier.FINAL)) {
@@ -47,7 +54,14 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements P
@Override @Override
public @Nullable GenerationInfo generateSetter() throws IncorrectOperationException { public @Nullable GenerationInfo generateSetter() throws IncorrectOperationException {
final GenerationInfo[] infos = generateSetters(getElement().getContainingClass()); return generateSetter(SetterGetterGenerationOptions.empty());
}
@Override
public @Nullable GenerationInfo generateSetter(@NotNull SetterGetterGenerationOptions options) throws IncorrectOperationException {
PsiClass containingClass = getElement().getContainingClass();
if (containingClass == null) return null;
final GenerationInfo[] infos = generateSetters(containingClass, options);
return infos != null && infos.length > 0 ? infos[0] : null; return infos != null && infos.length > 0 ? infos[0] : null;
} }
@@ -58,11 +72,12 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements P
@Override @Override
public GenerationInfo @Nullable [] generateSetters(PsiClass aClass) { public GenerationInfo @Nullable [] generateSetters(PsiClass aClass) {
return generateSetters(aClass, EnumSet.noneOf(Option.class)); if (aClass == null) return null;
return generateSetters(aClass, SetterGetterGenerationOptions.empty());
} }
@Override @Override
public GenerationInfo @Nullable [] generateSetters(PsiClass aClass, @NotNull EnumSet<Option> options) { public GenerationInfo @Nullable [] generateSetters(@NotNull PsiClass aClass, @NotNull SetterGetterGenerationOptions options) {
final PsiField field = getElement(); final PsiField field = getElement();
if (GetterSetterPrototypeProvider.isReadOnlyProperty(field)) { if (GetterSetterPrototypeProvider.isReadOnlyProperty(field)) {
return null; return null;
@@ -75,13 +90,13 @@ public class PsiFieldMember extends PsiElementClassMember<PsiField> implements P
for (PsiMethod prototype : prototypes) { for (PsiMethod prototype : prototypes) {
final PsiMethod method = createMethodIfNotExists(aClass, prototype); final PsiMethod method = createMethodIfNotExists(aClass, prototype);
if (method != null) { if (method != null) {
methods.add(new PsiGenerationInfo(method)); methods.add(new PsiGenerationInfo<>(method));
} }
} }
return methods.isEmpty() ? null : methods.toArray(GenerationInfo.EMPTY_ARRAY); return methods.isEmpty() ? null : methods.toArray(GenerationInfo.EMPTY_ARRAY);
} }
private static @Nullable PsiMethod createMethodIfNotExists(PsiClass aClass, final PsiMethod template) { private static @Nullable PsiMethod createMethodIfNotExists( @NotNull PsiClass aClass, final PsiMethod template) {
PsiMethod existing = aClass.findMethodBySignature(template, false); PsiMethod existing = aClass.findMethodBySignature(template, false);
return existing == null || !existing.isPhysical() ? template : null; return existing == null || !existing.isPhysical() ? template : null;
} }

View File

@@ -0,0 +1,8 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.generation;
public record SetterGetterGenerationOptions(boolean copyAllAnnotations) {
public static SetterGetterGenerationOptions empty() {
return new SetterGetterGenerationOptions(false);
}
}

View File

@@ -24,7 +24,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Collection; import java.util.Collection;
import java.util.EnumSet;
import java.util.List; import java.util.List;
public class GenerateGetterSetterTest extends LightJavaCodeInsightFixtureTestCase { public class GenerateGetterSetterTest extends LightJavaCodeInsightFixtureTestCase {
@@ -464,8 +463,8 @@ public class GenerateGetterSetterTest extends LightJavaCodeInsightFixtureTestCas
} }
@Override @Override
protected @NotNull EnumSet<EncapsulatableClassMember.Option> getOptions() { protected @NotNull SetterGetterGenerationOptions getOptions() {
return allAnnotations ? EnumSet.of(EncapsulatableClassMember.Option.COPY_ALL_ANNOTATIONS) : super.getOptions(); return allAnnotations ? new SetterGetterGenerationOptions(true) : super.getOptions();
} }
}.invoke(getProject(), myFixture.getEditor(), myFixture.getFile()); }.invoke(getProject(), myFixture.getEditor(), myFixture.getFile());
UIUtil.dispatchAllInvocationEvents(); UIUtil.dispatchAllInvocationEvents();
@@ -564,8 +563,8 @@ public class GenerateGetterSetterTest extends LightJavaCodeInsightFixtureTestCas
} }
@Override @Override
protected @NotNull EnumSet<EncapsulatableClassMember.Option> getOptions() { protected @NotNull SetterGetterGenerationOptions getOptions() {
return allAnnotations ? EnumSet.of(EncapsulatableClassMember.Option.COPY_ALL_ANNOTATIONS) : super.getOptions(); return allAnnotations ? new SetterGetterGenerationOptions(true) : super.getOptions();
} }
}.invoke(getProject(), myFixture.getEditor(), myFixture.getFile()); }.invoke(getProject(), myFixture.getEditor(), myFixture.getFile());
UIUtil.dispatchAllInvocationEvents(); UIUtil.dispatchAllInvocationEvents();

View File

@@ -1621,7 +1621,7 @@ generate.getter.error.no.fields=No fields have been found to generate getters fo
generate.getter.error.no.fields.without.getters=No fields without getter were found generate.getter.error.no.fields.without.getters=No fields without getter were found
generate.getter.setter.header.visibility.hint.=Visibility is applied according to File | Settings | Editor | Code Style | Java | Code Generation generate.getter.setter.header.visibility.hint.=Visibility is applied according to File | Settings | Editor | Code Style | Java | Code Generation
generate.getter.setter.generate.all.annotations=Copy &all annotations generate.getter.setter.generate.all.annotations=Copy &all annotations
generate.getter.setter.generate.all.annotations.tooltip=Copy all annotations from fields. Otherwise, only nullable annotations will be copied generate.getter.setter.generate.all.annotations.tooltip=Copy all applicable annotations from fields. Otherwise, only nullability annotations will be copied
generate.members.nothing.to.insert=Nothing found to insert generate.members.nothing.to.insert=Nothing found to insert
generate.setters.no.fields=No fields have been found to generate setters for generate.setters.no.fields=No fields have been found to generate setters for
generate.setters.no.fields.without.setters=No fields without setter were found generate.setters.no.fields.without.setters=No fields without setter were found