diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManagerBase.java b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManagerBase.java index ac367fa25aa7..27ceec3222fc 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManagerBase.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/EqualsHashCodeTemplatesManagerBase.java @@ -1,9 +1,16 @@ // 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.generation; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.NlsSafe; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiType; +import com.intellij.psi.PsiTypes; +import com.intellij.psi.codeStyle.JavaCodeStyleSettings; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -13,8 +20,11 @@ import org.jetbrains.java.generate.template.TemplatesManager; import java.io.IOException; import java.util.Collection; import java.util.LinkedHashMap; +import java.util.Map; import java.util.Set; +import static com.intellij.codeInsight.generation.GenerateEqualsHelper.INSTANCE_NAME; + public abstract class EqualsHashCodeTemplatesManagerBase extends TemplatesManager { public static final @NonNls String INTELLI_J_DEFAULT = "IntelliJ Default"; protected static final String DEFAULT_EQUALS = "/com/intellij/codeInsight/generation/defaultEquals.vm"; @@ -86,6 +96,24 @@ public abstract class EqualsHashCodeTemplatesManagerBase extends TemplatesManage return getTemplateBaseName(getDefaultTemplate()); } + public Map getEqualsImplicitVars(Project project) { + Map map = GenerateEqualsHelper.getEqualsImplicitVars(project); + map.put(INSTANCE_NAME, PsiType.getJavaLangString(PsiManager.getInstance(project), GlobalSearchScope.allScope(project))); + appendDefaultJavaSettings(project, map); + return map; + } + + private static void appendDefaultJavaSettings(Project project, Map map) { + map.put("java_version", PsiTypes.intType()); + map.put("settings", createElementType(project, JavaCodeStyleSettings.class)); + } + + public Map getHashCodeImplicitVars(Project project) { + Map map = GenerateEqualsHelper.getHashCodeImplicitVars(); + appendDefaultJavaSettings(project, map); + return map; + } + protected static String readFile(String resourceName) throws IOException { return readFile(resourceName, EqualsHashCodeTemplatesManager.class); } diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java index 126fcf6532d6..5f427ac84851 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/GenerateEqualsHelper.java @@ -27,7 +27,7 @@ import java.util.*; public class GenerateEqualsHelper implements Runnable { private static final Logger LOG = Logger.getInstance(GenerateEqualsHelper.class); - private static final @NonNls String INSTANCE_NAME = "instanceBaseName"; + static final @NonNls String INSTANCE_NAME = "instanceBaseName"; private static final @NonNls String BASE_PARAM_NAME = "baseParamName"; private static final @NonNls String SUPER_PARAM_NAME = "superParamName"; private static final @NonNls String SUPER_HAS_EQUALS = "superHasEquals"; @@ -141,7 +141,6 @@ public class GenerateEqualsHelper implements Runnable { final Map map = new LinkedHashMap<>(); final PsiType stringType = project != null ? PsiType.getJavaLangString(PsiManager.getInstance(project), GlobalSearchScope.allScope(project)) : (PsiPrimitiveType)PsiTypes.nullType(); - map.put(INSTANCE_NAME, stringType); map.put(BASE_PARAM_NAME, stringType); map.put(SUPER_PARAM_NAME, stringType); map.put(CHECK_PARAMETER_WITH_INSTANCEOF, PsiTypes.booleanType()); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java b/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java index d745a9ac7256..d063622632d7 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ui/EqualsHashCodeTemplatesPanel.java @@ -11,6 +11,7 @@ import com.intellij.openapi.ui.NamedItemsListEditor; import com.intellij.openapi.ui.Namer; import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.util.*; +import com.intellij.psi.PsiType; import com.intellij.ui.TitledSeparator; import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.Nls; @@ -18,17 +19,17 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.java.generate.template.TemplateResource; -import org.jetbrains.java.generate.template.TemplatesManager; import org.jetbrains.java.generate.view.GenerateTemplateConfigurable; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.function.BiPredicate; -public final class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor> { +public class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor> { private static final Namer> NAMER = new Namer<>() { @Override @@ -82,7 +83,7 @@ public final class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor(manager.getTemplateCouples())); @@ -127,8 +128,8 @@ public final class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor item) { - final GenerateTemplateConfigurable equalsConfigurable = new GenerateTemplateConfigurable(item.first, GenerateEqualsHelper.getEqualsImplicitVars(myProject), myProject); - final GenerateTemplateConfigurable hashCodeConfigurable = new GenerateTemplateConfigurable(item.second, GenerateEqualsHelper.getHashCodeImplicitVars(), myProject); + final GenerateTemplateConfigurable equalsConfigurable = new GenerateTemplateConfigurable(item.first, getEqualsImplicitVars(), myProject); + final GenerateTemplateConfigurable hashCodeConfigurable = new GenerateTemplateConfigurable(item.second, getHashCodeImplicitVars(), myProject); return new UnnamedConfigurable() { @Override public @NotNull JComponent createComponent() { @@ -176,6 +177,14 @@ public final class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor getHashCodeImplicitVars() { + return GenerateEqualsHelper.getHashCodeImplicitVars(); + } + + protected @NotNull Map getEqualsImplicitVars() { + return GenerateEqualsHelper.getEqualsImplicitVars(myProject); + } + @Override public void apply() throws ConfigurationException { super.apply(); diff --git a/java/java-impl/src/com/intellij/codeInsight/generation/ui/TemplateChooserStep.java b/java/java-impl/src/com/intellij/codeInsight/generation/ui/TemplateChooserStep.java index ca525b5f7734..d0316535bcf8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/generation/ui/TemplateChooserStep.java +++ b/java/java-impl/src/com/intellij/codeInsight/generation/ui/TemplateChooserStep.java @@ -10,12 +10,14 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.ComponentWithBrowseButton; import com.intellij.openapi.ui.VerticalFlowLayout; import com.intellij.openapi.util.NlsContexts; import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiType; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.ui.ContextHelpLabel; import com.intellij.ui.JBColor; @@ -32,10 +34,7 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.Set; +import java.util.*; public abstract class TemplateChooserStep extends StepAdapter { private final JComponent myPanel; @@ -57,10 +56,10 @@ public abstract class TemplateChooserStep extends StepAdapter { .toArray(String[]::new)); myComboBox.setSelectedItem(myTemplatesManager.getDefaultTemplateBaseName()); myComboBox.setSwingPopup(false); + Project project = contextElement.getProject(); final ComponentWithBrowseButton> comboBoxWithBrowseButton = new ComponentWithBrowseButton<>(myComboBox, e -> { - EqualsHashCodeTemplatesPanel ui = new EqualsHashCodeTemplatesPanel(contextElement.getProject(), myTemplatesManager); - ui.selectNodeInTree(myTemplatesManager.getDefaultTemplateBaseName()); + EqualsHashCodeTemplatesPanel ui = createTemplatesPanel(project); ShowSettingsUtil.getInstance().editConfigurable(myPanel, ui); String[] names = myTemplatesManager.getAllTemplates().stream() .map(EqualsHashCodeTemplatesManagerBase::getTemplateBaseName) @@ -72,11 +71,11 @@ public abstract class TemplateChooserStep extends StepAdapter { templateChooserLabel.setLabelFor(myComboBox); ReadAction.nonBlocking(() -> { GlobalSearchScope resolveScope = contextElement.getResolveScope(); - JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(contextElement.getProject()); + JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); Set names = new LinkedHashSet<>(); Set invalid = new HashSet<>(); - DumbService dumbService = DumbService.getInstance(contextElement.getProject()); + DumbService dumbService = DumbService.getInstance(project); for (TemplateResource resource : myTemplatesManager.getAllTemplates()) { String templateBaseName = EqualsHashCodeTemplatesManagerBase.getTemplateBaseName(resource); if (names.add(templateBaseName)) { @@ -110,6 +109,22 @@ public abstract class TemplateChooserStep extends StepAdapter { appendAdditionalOptions(myPanel); } + private @NotNull EqualsHashCodeTemplatesPanel createTemplatesPanel(Project project) { + EqualsHashCodeTemplatesPanel ui = new EqualsHashCodeTemplatesPanel(project, myTemplatesManager) { + @Override + protected @NotNull Map getEqualsImplicitVars() { + return myTemplatesManager.getEqualsImplicitVars(project); + } + + @Override + protected @NotNull Map getHashCodeImplicitVars() { + return myTemplatesManager.getHashCodeImplicitVars(project); + } + }; + ui.selectNodeInTree(myTemplatesManager.getDefaultTemplateBaseName()); + return ui; + } + protected void appendAdditionalOptions(JComponent stepPanel) { boolean useInstanceof = CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER; JPanel panel = new JPanel(); diff --git a/plugins/generate-tostring/src/org/jetbrains/java/generate/view/GenerateTemplateConfigurable.java b/plugins/generate-tostring/src/org/jetbrains/java/generate/view/GenerateTemplateConfigurable.java index c2e7e19a4155..5380748b6023 100644 --- a/plugins/generate-tostring/src/org/jetbrains/java/generate/view/GenerateTemplateConfigurable.java +++ b/plugins/generate-tostring/src/org/jetbrains/java/generate/view/GenerateTemplateConfigurable.java @@ -52,7 +52,6 @@ public class GenerateTemplateConfigurable implements UnnamedConfigurable{ .createFileFromText(template.getFileName(), ftl, template.getTemplate(), LocalTimeCounter.currentTime(), true); if (!template.isDefault()) { final HashMap map = new LinkedHashMap<>(); - map.put("java_version", PsiTypes.intType()); map.put("class", TemplatesManager.createElementType(project, ClassElement.class)); if (multipleFields) { map.put("fields", TemplatesManager.createFieldListElementType(project)); @@ -61,7 +60,6 @@ public class GenerateTemplateConfigurable implements UnnamedConfigurable{ map.put("field", TemplatesManager.createElementType(project, FieldElement.class)); } map.put("helper", TemplatesManager.createElementType(project, GenerationHelper.class)); - map.put("settings", TemplatesManager.createElementType(project, JavaCodeStyleSettings.class)); map.putAll(contextMap); availableImplicits.addAll(map.keySet()); file.getViewProvider().putUserData(TemplatesManager.TEMPLATE_IMPLICITS, map); diff --git a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/GenerateEqualsAndHashCodeUtils.kt b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/GenerateEqualsAndHashCodeUtils.kt index 56d2bddee488..c537f8e0301d 100644 --- a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/GenerateEqualsAndHashCodeUtils.kt +++ b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/GenerateEqualsAndHashCodeUtils.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.k2.codeinsight.generate.KotlinGenerateEqualsAnd import org.jetbrains.kotlin.idea.k2.codeinsight.generate.KotlinGenerateEqualsAndHashcodeAction.Companion.CHECK_PARAMETER_WITH_INSTANCEOF import org.jetbrains.kotlin.idea.k2.codeinsight.generate.KotlinGenerateEqualsAndHashcodeAction.Companion.SUPER_HAS_EQUALS import org.jetbrains.kotlin.idea.k2.codeinsight.generate.KotlinGenerateEqualsAndHashcodeAction.Companion.SUPER_HAS_HASHCODE +import org.jetbrains.kotlin.idea.k2.codeinsight.generate.KotlinGenerateEqualsAndHashcodeAction.Companion.SUPER_PARAM_NAME import org.jetbrains.kotlin.idea.util.application.isUnitTestMode import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds @@ -151,7 +152,9 @@ object GenerateEqualsAndHashCodeUtils { contextMap[BASE_PARAM_NAME] = "other" if (equalsFunction != null) { (equalsFunction as? KaFunctionSymbol)?.valueParameters?.firstOrNull()?.let { - contextMap[BASE_PARAM_NAME] = it.name.asString() + val paramName = it.name.asString() + contextMap[BASE_PARAM_NAME] = paramName + contextMap[SUPER_PARAM_NAME] = paramName } } diff --git a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinEqualsHashCodeTemplatesManager.kt b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinEqualsHashCodeTemplatesManager.kt index 116cf21e3727..06b5b15b36dd 100644 --- a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinEqualsHashCodeTemplatesManager.kt +++ b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinEqualsHashCodeTemplatesManager.kt @@ -2,12 +2,19 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.generate import com.intellij.codeInsight.generation.EqualsHashCodeTemplatesManagerBase +import com.intellij.codeInsight.generation.GenerateEqualsHelper import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.SettingsCategory import com.intellij.openapi.components.State import com.intellij.openapi.components.Storage +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiType +import com.intellij.psi.PsiTypes import org.jetbrains.java.generate.exception.TemplateResourceException import org.jetbrains.java.generate.template.TemplateResource +import org.jetbrains.kotlin.idea.base.facet.platform.platform +import org.jetbrains.kotlin.platform.isCommon +import org.jetbrains.kotlin.platform.isJs import java.io.IOException @State(name = "KotlinEqualsHashcodeTemplates", storages = [Storage("kotlinEqualsHashcodeTemplates.xml")], category = SettingsCategory.CODE) @@ -23,6 +30,23 @@ class KotlinEqualsHashCodeTemplatesManager : EqualsHashCodeTemplatesManagerBase( } } + override fun getEqualsImplicitVars(project: Project): Map { + val map = GenerateEqualsHelper.getEqualsImplicitVars(project) + addPlatformVariables(map) + return map + } + + private fun addPlatformVariables(map: MutableMap) { + map.put("isCommon", PsiTypes.booleanType()) + map.put("isJs", PsiTypes.booleanType()) + } + + override fun getHashCodeImplicitVars(project: Project): Map { + val map = GenerateEqualsHelper.getHashCodeImplicitVars() + addPlatformVariables(map) + return map + } + companion object { private const val DEFAULT_EQUALS = "defaultEquals.vm" private const val DEFAULT_HASHCODE = "defaultHashcode.vm" diff --git a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinGenerateEqualsAndHashcodeAction.kt b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinGenerateEqualsAndHashcodeAction.kt index 33a918c5205b..90f368158872 100644 --- a/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinGenerateEqualsAndHashcodeAction.kt +++ b/plugins/kotlin/code-insight/kotlin.code-insight.k2/src/org/jetbrains/kotlin/idea/k2/codeinsight/generate/KotlinGenerateEqualsAndHashcodeAction.kt @@ -46,6 +46,8 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase