From 415d6a8b5689c3e8aa386a87a99a2db627851d37 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 2 Jan 2024 16:37:15 +0100 Subject: [PATCH] Java: respect "Make generated parameters final" setting when creating constructor parameters from field (IDEA-341545) GitOrigin-RevId: 3f12122ecf79a835e649425f2301b7fbda950afc --- ...reateConstructorParameterFromFieldFix.java | 25 ++++++++----------- .../afterSameParameterSameTypes.java | 2 +- .../afterSameParameterSimpleNames.java | 2 +- ...ameParameterSimpleNamesDifferentTypes.java | 2 +- ...eateConstructorParameterFromFieldTest.java | 3 ++- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java index d74a40686f6c..6d984547f847 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldFix.java @@ -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.application.options.CodeStyle; @@ -51,8 +51,7 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc @Override protected @NotNull ModCommand perform(@NotNull ActionContext context, @NotNull PsiField field) { PsiClass psiClass = Objects.requireNonNull(field.getContainingClass()); - PsiMethod[] constructors = getNonSyntheticConstructors(psiClass); - final List filtered = getFilteredConstructors(constructors, field); + final List filtered = getFilteredConstructors(psiClass.getConstructors(), field); if (filtered.size() <= 1) { return performForConstructors(context, field, filtered); } @@ -80,10 +79,6 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc constructors)); } - private static PsiMethod[] getNonSyntheticConstructors(@NotNull PsiClass psiClass) { - return ContainerUtil.filter(psiClass.getConstructors(), c -> !(c instanceof SyntheticElement)).toArray(PsiMethod[]::new); - } - @NotNull private static List getFilteredConstructors(PsiMethod[] constructors, PsiField field) { Arrays.sort(constructors, new Comparator<>() { @@ -105,8 +100,7 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc } @NotNull - private static List getFieldsToFix(@NotNull PsiClass psiClass, @NotNull PsiField startField, - @NotNull List constructors) { + static List getFieldsToFix(@NotNull PsiClass psiClass, @NotNull PsiField startField, @NotNull List constructors) { List fields = new ArrayList<>(); for (PsiField field : psiClass.getFields()) { if (field == startField || @@ -144,7 +138,7 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc } private static boolean isFieldAssignedInConstructor(@NotNull PsiField field, @NotNull PsiMethod ctr) { - return VariableAccessUtils.variableIsAssigned(field, getTargetConstructor(ctr)); + return ctr instanceof SyntheticElement || VariableAccessUtils.variableIsAssigned(field, getTargetConstructor(ctr)); } @NotNull @@ -195,9 +189,13 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc CodeStyle.runWithLocalSettings(project, allSettings, () -> { final String uniqueParameterName = getUniqueParameterName(parameterList.getParameters(), param, usedFields); usedFields.put(field, uniqueParameterName); - PsiParameter parameter = factory - .createParameter(uniqueParameterName, AnnotationTargetUtil.keepStrictlyTypeUseAnnotations(param.getModifierList(), paramType), - parameterList); + PsiType type = AnnotationTargetUtil.keepStrictlyTypeUseAnnotations(param.getModifierList(), paramType); + PsiParameter parameter = factory.createParameter(uniqueParameterName, type, parameterList); + if (settings.GENERATE_FINAL_PARAMETERS) { + PsiModifierList modifierList = parameter.getModifierList(); + assert modifierList != null; + modifierList.setModifierProperty(PsiModifier.FINAL, true); + } if (prev.isNull()) { prev.set(parameterList.isEmpty() ? parameterList.add(parameter) : parameterList.addBefore(parameter, parameterList.getParameter(0))); @@ -320,7 +318,6 @@ public class CreateConstructorParameterFromFieldFix extends PsiBasedModCommandAc @Override public int compare(PsiVariable o1, PsiVariable o2) { - if (o1 instanceof PsiParameter && ((PsiParameter)o1).isVarArgs()) return 1; if (o2 instanceof PsiParameter && ((PsiParameter)o2).isVarArgs()) return -1; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSameTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSameTypes.java index 0dd4406bff7b..1035edcf4ef6 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSameTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSameTypes.java @@ -4,7 +4,7 @@ class A { private final String oldClass; private final String newClass; - A(String oldClass, String newClass) { + A(final String oldClass, final String newClass) { this.oldClass = oldClass; this.newClass = newClass; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java index 3b65e88d8bb8..93aa9a46a1ab 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNames.java @@ -2,7 +2,7 @@ class A { private final int _field; private final int field; - A(int field, int field1) { + A(final int field, final int field1) { this._field = field; this.field = field1; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNamesDifferentTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNamesDifferentTypes.java index bc6a47509756..d21fe0dc1f65 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNamesDifferentTypes.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterSameParameterSimpleNamesDifferentTypes.java @@ -4,7 +4,7 @@ class A { private final LibraryManager libraryManager; private final DependencyManager dependencyManager; - A(LibraryManager manager, DependencyManager dependencyManager) { + A(final LibraryManager manager, final DependencyManager dependencyManager) { this.libraryManager = manager; this.dependencyManager = dependencyManager; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldTest.java index f950d9d89530..9f1e0ece5250 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/impl/quickfix/CreateConstructorParameterFromFieldTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2022 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.quickFix.LightQuickFixParameterizedTestCase; @@ -19,6 +19,7 @@ public class CreateConstructorParameterFromFieldTest extends LightQuickFixParame final JavaCodeStyleSettings settings = JavaCodeStyleSettings.getInstance(getProject()); if (getTestName(false).contains("SameParameter")) { settings.PREFER_LONGER_NAMES = false; + settings.GENERATE_FINAL_PARAMETERS = true; } }