[kotlin] k2 generate equals & hashCode: hide java variables from kotlin templates

^KTIJ-31238 fixed

GitOrigin-RevId: e65f842926cc4575188a3ba441a4cbacda56879f
This commit is contained in:
Anna Kozlova
2024-09-09 16:56:15 +02:00
committed by intellij-monorepo-bot
parent f6fb559585
commit 56089d87f2
9 changed files with 96 additions and 26 deletions

View File

@@ -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<String, PsiType> getEqualsImplicitVars(Project project) {
Map<String, PsiType> 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<String, PsiType> map) {
map.put("java_version", PsiTypes.intType());
map.put("settings", createElementType(project, JavaCodeStyleSettings.class));
}
public Map<String, PsiType> getHashCodeImplicitVars(Project project) {
Map<String, PsiType> map = GenerateEqualsHelper.getHashCodeImplicitVars();
appendDefaultJavaSettings(project, map);
return map;
}
protected static String readFile(String resourceName) throws IOException {
return readFile(resourceName, EqualsHashCodeTemplatesManager.class);
}

View File

@@ -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<String, PsiType> 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());

View File

@@ -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<Couple<TemplateResource>> {
public class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor<Couple<TemplateResource>> {
private static final Namer<Couple<TemplateResource>> NAMER = new Namer<>() {
@Override
@@ -82,7 +83,7 @@ public final class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor<Cou
}
};
private final Project myProject;
private final TemplatesManager myManager;
private final EqualsHashCodeTemplatesManagerBase myManager;
public EqualsHashCodeTemplatesPanel(Project project, EqualsHashCodeTemplatesManagerBase manager) {
super(NAMER, FACTORY, CLONER, COMPARER, new ArrayList<>(manager.getTemplateCouples()));
@@ -127,8 +128,8 @@ public final class EqualsHashCodeTemplatesPanel extends NamedItemsListEditor<Cou
@Override
protected UnnamedConfigurable createConfigurable(Couple<TemplateResource> 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<Cou
};
}
protected @NotNull Map<String, PsiType> getHashCodeImplicitVars() {
return GenerateEqualsHelper.getHashCodeImplicitVars();
}
protected @NotNull Map<String, PsiType> getEqualsImplicitVars() {
return GenerateEqualsHelper.getEqualsImplicitVars(myProject);
}
@Override
public void apply() throws ConfigurationException {
super.apply();

View File

@@ -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<ComboBox<?>> 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<String> names = new LinkedHashSet<>();
Set<String> 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<String, PsiType> getEqualsImplicitVars() {
return myTemplatesManager.getEqualsImplicitVars(project);
}
@Override
protected @NotNull Map<String, PsiType> 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();

View File

@@ -52,7 +52,6 @@ public class GenerateTemplateConfigurable implements UnnamedConfigurable{
.createFileFromText(template.getFileName(), ftl, template.getTemplate(), LocalTimeCounter.currentTime(), true);
if (!template.isDefault()) {
final HashMap<String, PsiType> 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);

View File

@@ -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
}
}

View File

@@ -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<String, PsiType> {
val map = GenerateEqualsHelper.getEqualsImplicitVars(project)
addPlatformVariables(map)
return map
}
private fun addPlatformVariables(map: MutableMap<String, PsiType>) {
map.put("isCommon", PsiTypes.booleanType())
map.put("isJs", PsiTypes.booleanType())
}
override fun getHashCodeImplicitVars(project: Project): Map<String, PsiType> {
val map = GenerateEqualsHelper.getHashCodeImplicitVars()
addPlatformVariables(map)
return map
}
companion object {
private const val DEFAULT_EQUALS = "defaultEquals.vm"
private const val DEFAULT_HASHCODE = "defaultHashcode.vm"

View File

@@ -46,6 +46,8 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase<Inf
const val SUPER_HAS_EQUALS = "superHasEquals"
const val SUPER_HAS_HASHCODE = "superHasHashCode"
const val SUPER_PARAM_NAME = "superParamName"
const val CHECK_PARAMETER_WITH_INSTANCEOF = "checkParameterWithInstanceof"
}

View File

@@ -10,22 +10,14 @@ import org.jetbrains.java.generate.element.GenerationHelper
import org.jetbrains.java.generate.exception.GenerateCodeException
import org.jetbrains.java.generate.velocity.VelocityFactory
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisFromWriteAction
import org.jetbrains.kotlin.analysis.api.permissions.KaAllowAnalysisOnEdt
import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisFromWriteAction
import org.jetbrains.kotlin.analysis.api.permissions.allowAnalysisOnEdt
import org.jetbrains.kotlin.idea.base.facet.platform.platform
import org.jetbrains.kotlin.platform.isCommon
import org.jetbrains.kotlin.platform.isJs
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded
import java.io.StringWriter
import java.lang.Exception
object VelocityGeneratorHelper {