EA-261935 - additional check for the case when we have duplicated fields or some field is not initialized in ctor

GitOrigin-RevId: bdb9c907210141695a29b08c39dd06a4d26c15af
This commit is contained in:
Ilyas Selimov
2021-03-24 09:53:42 +00:00
committed by intellij-monorepo-bot
parent 7680878112
commit f8167bee4d
3 changed files with 36 additions and 10 deletions
@@ -4,6 +4,7 @@ package com.intellij.codeInspection.classCanBeRecord;
import com.intellij.codeInsight.AnnotationTargetUtil;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.util.IntentionFamilyName;
@@ -240,20 +241,23 @@ public class ConvertToRecordFix extends InspectionGadgetsFix {
myCanonical = false;
return;
}
PsiParameter[] ctorParams = myConstructor.getParameterList().getParameters();
Set<String> instanceFieldNames = instanceFields.stream().map(PsiField::getName).collect(Collectors.toSet());
for (PsiParameter param : ctorParams) {
if (!instanceFieldNames.contains(param.getName())) {
myCanonical = false;
return;
}
}
Map<String, PsiType> ctorParamsWithType = Arrays.stream(ctorParams)
.collect(Collectors.toMap(param -> param.getName(), param -> param.getType(), (first, second) -> first));
if (ctorParams.length != ctorParamsWithType.size()) {
if (instanceFieldNames.size() != instanceFields.size()) {
myCanonical = false;
return;
}
PsiParameter[] ctorParams = myConstructor.getParameterList().getParameters();
if (instanceFields.size() != ctorParams.length) {
myCanonical = false;
return;
}
PsiCodeBlock ctorBody = myConstructor.getBody();
if (ctorBody == null) {
myCanonical = false;
return;
}
Map<String, PsiType> ctorParamsWithType = Arrays.stream(ctorParams)
.collect(Collectors.toMap(param -> param.getName(), param -> param.getType(), (first, second) -> first));
for (PsiField instanceField : instanceFields) {
PsiType ctorParamType = ObjectUtils.tryCast(ctorParamsWithType.get(instanceField.getName()), PsiType.class);
if (ctorParamType instanceof PsiEllipsisType) {
@@ -263,6 +267,10 @@ public class ConvertToRecordFix extends InspectionGadgetsFix {
myCanonical = false;
return;
}
if (!HighlightControlFlowUtil.variableDefinitelyAssignedIn(instanceField, ctorBody)) {
myCanonical = false;
return;
}
}
myCanonical = true;
}
@@ -0,0 +1,9 @@
// "Convert to a record" "false"
class <caret>R {
final int first;
final int second;
R(int first, int second) {
this.first = first;
}
}
@@ -0,0 +1,9 @@
// "Convert to a record" "false"
class <caret>R {
final int first;
final int first;
R(int first) {
this.first = first;
}
}