mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-03-22 06:50:54 +07:00
[kotlin] k2 generate equals & hashCode: hide java variables from kotlin templates
^KTIJ-31238 fixed GitOrigin-RevId: e65f842926cc4575188a3ba441a4cbacda56879f
This commit is contained in:
committed by
intellij-monorepo-bot
parent
f6fb559585
commit
56089d87f2
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user