Java: don't generate uncompilable code in case of chained constructors (IDEA-342068)

in "Initialize in constructor" quick-fix

GitOrigin-RevId: 626d5ce6dfa823c0b1bd37c37c59edc1b45e03d6
This commit is contained in:
Bas Leijdekkers
2024-01-02 16:59:02 +01:00
committed by intellij-monorepo-bot
parent 415d6a8b56
commit 85598d6315
3 changed files with 37 additions and 1 deletions

View File

@@ -1,4 +1,4 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.daemon.QuickFixBundle;
@@ -13,11 +13,13 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.JavaPsiConstructorUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
@@ -59,6 +61,13 @@ public class InitializeFinalFieldInConstructorFix extends PsiBasedModCommandActi
List<PsiMethod> ctors =
CreateConstructorParameterFromFieldFix.filterConstructorsIfFieldAlreadyAssigned(myClass.getConstructors(), field);
for (Iterator<PsiMethod> iterator = ctors.iterator(); iterator.hasNext(); ) {
PsiMethodCallExpression constructorCall = JavaPsiConstructorUtil.findThisOrSuperCallInConstructor(iterator.next());
if (JavaPsiConstructorUtil.isChainedConstructorCall(constructorCall)) {
// otherwise final field can be initialized multiple times, which does not compile
iterator.remove();
}
}
List<PsiMethodMember> allMembers = ContainerUtil.map(ctors, PsiMethodMember::new);
if (ctors.size() == 1) {

View File

@@ -0,0 +1,14 @@
// "Initialize in constructor" "true-preview"
class C {
private final int a;
private final int b;
C() {
this(1);
}
C(int a) {
this.a = a;
b = 0;
}
}

View File

@@ -0,0 +1,13 @@
// "Initialize in constructor" "true-preview"
class C {
private final int a;
private final int b<caret>;
C() {
this(1);
}
C(int a) {
this.a = a;
}
}