diff --git a/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/ConvertToRecordFix.java b/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/ConvertToRecordFix.java index b52c450031f8..209aa046cdc4 100644 --- a/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/ConvertToRecordFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/ConvertToRecordFix.java @@ -236,11 +236,18 @@ public class ConvertToRecordFix extends InspectionGadgetsFix { private RecordConstructorCandidate(@NotNull PsiMethod constructor, @NotNull Set instanceFields) { myConstructor = constructor; - if (constructor.getTypeParameters().length > 0) { + if (myConstructor.getTypeParameters().length > 0) { myCanonical = false; return; } PsiParameter[] ctorParams = myConstructor.getParameterList().getParameters(); + Set instanceFieldNames = instanceFields.stream().map(PsiField::getName).collect(Collectors.toSet()); + for (PsiParameter param : ctorParams) { + if (!instanceFieldNames.contains(param.getName())) { + myCanonical = false; + return; + } + } Map ctorParamsWithType = Arrays.stream(ctorParams) .collect(Collectors.toMap(param -> param.getName(), param -> param.getType(), (first, second) -> first)); if (ctorParams.length != ctorParamsWithType.size()) { diff --git a/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/RecordBuilder.java b/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/RecordBuilder.java index 9868a439b644..9856af67728a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/RecordBuilder.java +++ b/java/java-impl/src/com/intellij/codeInspection/classCanBeRecord/RecordBuilder.java @@ -45,7 +45,7 @@ class RecordBuilder { String annotationsText = generateAnnotationsText(parameterName, fieldAccessors); recordComponentsJoiner.add(annotationsText + parameter.getType().getCanonicalText() + " " + parameterName); } - myRecordText.append(recordComponentsJoiner.toString()); + myRecordText.append(recordComponentsJoiner); } myRecordText.append(")"); } diff --git a/java/java-tests/testData/inspection/classCanBeRecord/beforeCtorParamsMoreThanFields.java b/java/java-tests/testData/inspection/classCanBeRecord/beforeCtorParamsMoreThanFields.java new file mode 100644 index 000000000000..9d5ad3b36808 --- /dev/null +++ b/java/java-tests/testData/inspection/classCanBeRecord/beforeCtorParamsMoreThanFields.java @@ -0,0 +1,8 @@ +// "Convert to a record" "false" +class R { + final int first; + + R(int first, int second) { + this.first = first; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/classCanBeRecord/beforeNonFinalInstanceField.java b/java/java-tests/testData/inspection/classCanBeRecord/beforeNonFinalInstanceField.java index a9590e248caa..0fedecacbb00 100644 --- a/java/java-tests/testData/inspection/classCanBeRecord/beforeNonFinalInstanceField.java +++ b/java/java-tests/testData/inspection/classCanBeRecord/beforeNonFinalInstanceField.java @@ -1,4 +1,9 @@ // "Convert to a record" "false" class R { int first = 1; + final int second; + + R(int second) { + this.second = second; + } } \ No newline at end of file