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