From 9092a09789c27fe55e51fa28d157dbca5fa98868 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 10 Sep 2024 17:41:50 +0200 Subject: [PATCH] [java-intentions] BindFieldsFromParameters: disable for existing field if static or type doesn't match GitOrigin-RevId: ad1d93533626f5e76a3f53c5ab25b06a5aa07f1e --- .../impl/FieldFromParameterUtils.java | 24 ++++++++++++------- .../afterFieldExistStaticDiffers.java | 12 ++++++++++ .../beforeFieldExistStaticDiffers.java | 11 +++++++++ 3 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterFieldExistStaticDiffers.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldExistStaticDiffers.java diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java index 216e1f86f875..efa22ddfa31c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/FieldFromParameterUtils.java @@ -269,21 +269,29 @@ public final class FieldFromParameterUtils { return isAvailable(myParameter, type, targetClass, true); } - public static boolean isAvailable(@NotNull PsiParameter myParameter, + public static boolean isAvailable(@NotNull PsiParameter parameter, @Nullable PsiType type, @Nullable PsiClass targetClass, boolean findIndirectAssignments) { - if (!myParameter.isValid() || - !BaseIntentionAction.canModify(myParameter) || - !(myParameter.getDeclarationScope() instanceof PsiMethod method)) { + if (!parameter.isValid() || + !BaseIntentionAction.canModify(parameter) || + !(parameter.getDeclarationScope() instanceof PsiMethod method)) { return false; } + if (type == null || targetClass == null || !type.isValid()) { + return false; + } + PsiField existingField = targetClass.findFieldByName(parameter.getName(), true); + if (existingField != null) { + if (!existingField.getType().isAssignableFrom(type) || + method.hasModifierProperty(PsiModifier.STATIC) != existingField.hasModifierProperty(PsiModifier.STATIC) || + existingField.hasModifierProperty(PsiModifier.FINAL) && !method.isConstructor()) { + return false; + } + } return method.getBody() != null && - type != null && - type.isValid() && - targetClass != null && !targetClass.isInterface() && (!targetClass.isRecord() || method.hasModifierProperty(PsiModifier.STATIC)) && - getParameterAssignedToField(myParameter, findIndirectAssignments) == null; + getParameterAssignedToField(parameter, findIndirectAssignments) == null; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterFieldExistStaticDiffers.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterFieldExistStaticDiffers.java new file mode 100644 index 000000000000..94181dcc80ad --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/afterFieldExistStaticDiffers.java @@ -0,0 +1,12 @@ +// "Bind method parameters to fields" "true-preview" + +class Bar { + private static int f4; + private int f1; + private static boolean f2; + private static final int f3 = 123; + + static void test(int f1, int f2, int f3, int f4) { + Bar.f4 = f4; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldExistStaticDiffers.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldExistStaticDiffers.java new file mode 100644 index 000000000000..afe2166ac030 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/bindFieldsFromParameters/beforeFieldExistStaticDiffers.java @@ -0,0 +1,11 @@ +// "Bind method parameters to fields" "true-preview" + +class Bar { + private int f1; + private static boolean f2; + private static final int f3 = 123; + + static void test(int f1, int f2, int f3, int f4) { + + } +} \ No newline at end of file