mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-19 13:02:30 +07:00
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:
committed by
intellij-monorepo-bot
parent
415d6a8b56
commit
85598d6315
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user