java: don't create final field from parameter when this does not compile (IDEA-359980)

GitOrigin-RevId: d7ce31fbb607a409afa0e2b988eed424440cc336
This commit is contained in:
Bas Leijdekkers
2024-10-02 20:13:41 +00:00
committed by intellij-monorepo-bot
parent cefb5228e1
commit 14096f0f03
2 changed files with 12 additions and 7 deletions
@@ -18,11 +18,13 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.codeStyle.SuggestedNameInfo;
import com.intellij.psi.codeStyle.VariableKind;
import com.intellij.psi.util.PsiTreeUtil;
import com.siyeh.ig.psiutils.FinalUtils;
import com.siyeh.ig.psiutils.VariableAccessUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Objects;
/**
* @author Max Medvedev
@@ -82,7 +84,7 @@ public final class CreateFieldFromParameterAction extends PsiUpdateModCommandAct
String parameterName = parameter.getName();
String propertyName = styleManager.variableNameToPropertyName(parameterName, VariableKind.PARAMETER);
PsiMethod method = (PsiMethod)parameter.getDeclarationScope();
if (!(parameter.getDeclarationScope() instanceof PsiMethod method)) return;
PsiClass targetClass = method.getContainingClass();
if (targetClass == null) return;
@@ -92,13 +94,16 @@ public final class CreateFieldFromParameterAction extends PsiUpdateModCommandAct
SuggestedNameInfo suggestedNameInfo = styleManager.suggestVariableName(kind, propertyName, null, type);
SuggestedNameInfo uniqueNameInfo = styleManager.suggestUniqueVariableName(suggestedNameInfo, targetClass, true);
boolean isFinal = !isMethodStatic && method.isConstructor();
PsiVariable variable = FieldFromParameterUtils.createFieldAndAddAssignment(
boolean maybeFinal = !isMethodStatic && method.isConstructor();
boolean isFinal = maybeFinal && targetClass.getConstructors().length == 1;
PsiField field = FieldFromParameterUtils.createFieldAndAddAssignment(
project, targetClass, method, parameter, type, uniqueNameInfo.names[0], isMethodStatic, isFinal);
assert variable != null;
assert field != null;
if (maybeFinal && !isFinal && FinalUtils.canBeFinal(field)) {
Objects.requireNonNull(field.getModifierList()).setModifierProperty(PsiModifier.FINAL, true);
}
updater.rename(variable, List.of(uniqueNameInfo.names));
updater.rename(field, List.of(uniqueNameInfo.names));
}
private static boolean isUnusedSymbolInspectionEnabled(@NotNull PsiElement element) {
@@ -2,7 +2,7 @@
class Person {
private String __fname;
private final int <caret>myId;
private int <caret>myId;
private String __lname;
private String __street;