mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-10-23 23:44:44 +07:00
generate equals/hashCode: allow getters (IDEA-73860)
This commit is contained in:
1 parent
2b03432618
commit
04b8cf4aa5
25 files changed
+337
-79
No files matched your search
@@ -118,9 +118,10 @@ public class GenerateEqualsHandler extends GenerateMembersHandlerBase {
|
||||
protected List<? extends GenerationInfo> generateMemberPrototypes(PsiClass aClass, ClassMember[] originalMembers) throws IncorrectOperationException {
|
||||
Project project = aClass.getProject();
|
||||
final boolean useInstanceofToCheckParameterType = CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER;
|
||||
final boolean useAccessors = CodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE;
|
||||
|
||||
GenerateEqualsHelper helper = new GenerateEqualsHelper(project, aClass, myEqualsFields, myHashCodeFields, myNonNullFields,
|
||||
useInstanceofToCheckParameterType);
|
||||
useInstanceofToCheckParameterType, useAccessors);
|
||||
return OverrideImplementUtil.convert2GenerationInfos(helper.generateMembers());
|
||||
}
|
||||
|
||||
|
||||
@@ -47,18 +47,30 @@ public class GenerateEqualsHelper implements Runnable {
|
||||
private final JavaCodeStyleManager myJavaCodeStyleManager;
|
||||
private final Project myProject;
|
||||
private final boolean myCheckParameterWithInstanceof;
|
||||
private final boolean myUseAccessors;
|
||||
|
||||
public GenerateEqualsHelper(Project project,
|
||||
PsiClass aClass,
|
||||
PsiField[] equalsFields,
|
||||
PsiField[] hashCodeFields,
|
||||
PsiField[] nonNullFields,
|
||||
boolean useInstanceofToCheckParameterType) {
|
||||
this(project, aClass, equalsFields, hashCodeFields, nonNullFields, useInstanceofToCheckParameterType, false);
|
||||
}
|
||||
|
||||
public GenerateEqualsHelper(Project project,
|
||||
PsiClass aClass,
|
||||
PsiField[] equalsFields,
|
||||
PsiField[] hashCodeFields,
|
||||
PsiField[] nonNullFields,
|
||||
boolean useInstanceofToCheckParameterType) {
|
||||
boolean useInstanceofToCheckParameterType,
|
||||
boolean useAccessors) {
|
||||
myClass = aClass;
|
||||
myEqualsFields = equalsFields;
|
||||
myHashCodeFields = hashCodeFields;
|
||||
myProject = project;
|
||||
myCheckParameterWithInstanceof = useInstanceofToCheckParameterType;
|
||||
myUseAccessors = useAccessors;
|
||||
|
||||
myNonNullSet = new HashSet<PsiField>();
|
||||
ContainerUtil.addAll(myNonNullSet, nonNullFields);
|
||||
@@ -157,7 +169,7 @@ public class GenerateEqualsHelper implements Runnable {
|
||||
|
||||
final String methodText = GenerationUtil
|
||||
.velocityGenerateCode(myClass, equalsFields, myNonNullSet, new HashMap<String, String>(), contextMap,
|
||||
EqualsHashCodeTemplatesManager.getInstance().getDefaultEqualsTemplate().getTemplate(), 0, false);
|
||||
EqualsHashCodeTemplatesManager.getInstance().getDefaultEqualsTemplate().getTemplate(), 0, false, myUseAccessors);
|
||||
buffer.append(methodText);
|
||||
PsiMethod result;
|
||||
try {
|
||||
@@ -196,7 +208,7 @@ public class GenerateEqualsHelper implements Runnable {
|
||||
|
||||
final String methodText = GenerationUtil
|
||||
.velocityGenerateCode(myClass, Arrays.asList(myHashCodeFields), myNonNullSet, new HashMap<String, String>(), contextMap,
|
||||
EqualsHashCodeTemplatesManager.getInstance().getDefaultHashcodeTemplate().getTemplate(), 0, false);
|
||||
EqualsHashCodeTemplatesManager.getInstance().getDefaultHashcodeTemplate().getTemplate(), 0, false, myUseAccessors);
|
||||
buffer.append(methodText);
|
||||
PsiMethod hashCode;
|
||||
try {
|
||||
|
||||
@@ -14,8 +14,8 @@ Object $paramName){
|
||||
#if($superHasEquals)
|
||||
.appendSuper(super.equals($paramName))
|
||||
#end
|
||||
#foreach($field in $members)
|
||||
.append($field.name, ${classInstanceName}.$field.name)
|
||||
#foreach($field in $fields)
|
||||
.append($field.accessor, ${classInstanceName}.$field.accessor)
|
||||
#end
|
||||
.isEquals();
|
||||
}
|
||||
@@ -14,8 +14,8 @@ Object $paramName){
|
||||
#if($superHasEquals)
|
||||
.appendSuper(super.equals($paramName))
|
||||
#end
|
||||
#foreach($field in $members)
|
||||
.append($field.name, ${classInstanceName}.$field.name)
|
||||
#foreach($field in $fields)
|
||||
.append($field.accessor, ${classInstanceName}.$field.accessor)
|
||||
#end
|
||||
.isEquals();
|
||||
}
|
||||
@@ -3,8 +3,8 @@ public int hashCode() {
|
||||
#if($superHasHashCode)
|
||||
.appendSuper(super.hashCode())
|
||||
#end
|
||||
#foreach($field in $members)
|
||||
.append($field.name)
|
||||
#foreach($field in $fields)
|
||||
.append($field.accessor)
|
||||
#end
|
||||
.toHashCode();
|
||||
}
|
||||
@@ -3,8 +3,8 @@ public int hashCode() {
|
||||
#if($superHasHashCode)
|
||||
.appendSuper(super.hashCode())
|
||||
#end
|
||||
#foreach($field in $members)
|
||||
.append($field.name)
|
||||
#foreach($field in $fields)
|
||||
.append($field.accessor)
|
||||
#end
|
||||
.toHashCode();
|
||||
}
|
||||
@@ -5,11 +5,11 @@ public boolean equals(##
|
||||
#end
|
||||
Object $paramName){
|
||||
#addEqualsPrologue()
|
||||
#if ($members.size() > 0)
|
||||
#if ($fields.size() > 0)
|
||||
|
||||
#addClassInstance()
|
||||
|
||||
#foreach($field in $members)
|
||||
#foreach($field in $fields)
|
||||
#if ($field.array)
|
||||
#addArrayEquals($field)
|
||||
#elseif ($field.primitive)
|
||||
@@ -30,29 +30,29 @@ Object $paramName){
|
||||
}
|
||||
##
|
||||
#macro(addPrimitiveFieldComparison $field)
|
||||
if($field.name != ${classInstanceName}.$field.name) return false;
|
||||
if($field.accessor != ${classInstanceName}.$field.accessor) return false;
|
||||
#end
|
||||
##
|
||||
#macro(addDoubleFieldComparison $field)
|
||||
#if ($field.double)
|
||||
if(Double.compare(${classInstanceName}.$field.name, $field.name) != 0)return false;
|
||||
if(Double.compare(${classInstanceName}.$field.accessor, $field.accessor) != 0)return false;
|
||||
#else
|
||||
if(Float.compare(${classInstanceName}.$field.name, $field.name) != 0)return false;
|
||||
if(Float.compare(${classInstanceName}.$field.accessor, $field.accessor) != 0)return false;
|
||||
#end
|
||||
#end
|
||||
##
|
||||
#macro(addFieldComparison $field)
|
||||
#if ($field.notNull)
|
||||
if(!${field.name}.equals(${classInstanceName}.$field.name))return false;
|
||||
if(!${field.accessor}.equals(${classInstanceName}.$field.accessor))return false;
|
||||
#else
|
||||
if($field.name != null ? !${field.name}.equals(${classInstanceName}.$field.name) : ${classInstanceName}.$field.name != null)return false;
|
||||
if($field.accessor != null ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : ${classInstanceName}.$field.accessor != null)return false;
|
||||
#end
|
||||
#end
|
||||
##
|
||||
#macro(addArrayEquals $field)
|
||||
#if ($field.nestedArray)
|
||||
#if ($java_version > 4)
|
||||
if(!java.util.Arrays.deepEquals($field.name, ${classInstanceName}.$field.name)) return false;
|
||||
if(!java.util.Arrays.deepEquals($field.accessor, ${classInstanceName}.$field.accessor)) return false;
|
||||
#else
|
||||
// Compare nested arrays - values of $field.name here
|
||||
#end
|
||||
@@ -61,5 +61,5 @@ Object $paramName){
|
||||
#if ($field.objectArray)
|
||||
// Probably incorrect - comparing Object[] arrays with Arrays.equals
|
||||
#end
|
||||
if(!java.util.Arrays.equals($field.name, ${classInstanceName}.$field.name)) return false;
|
||||
if(!java.util.Arrays.equals($field.accessor, ${classInstanceName}.$field.accessor)) return false;
|
||||
#end
|
||||
@@ -1,14 +1,14 @@
|
||||
public int hashCode() {
|
||||
#if (!$superHasHashCode && $members.size() == 1)
|
||||
#set($field = $members.get(0))
|
||||
#if (!$superHasHashCode && $fields.size() == 1)
|
||||
#set($field = $fields.get(0))
|
||||
#if ($field.primitive)
|
||||
#addTempForOneField($field)
|
||||
return #addPrimitiveFieldHashCode($field);
|
||||
#else
|
||||
return #addFieldHashCode($field, false);
|
||||
#end
|
||||
#elseif ($members.size() > 0)
|
||||
#set($resultName = $helper.getUniqueLocalVarName("result", $members, $settings))
|
||||
#elseif ($fields.size() > 0)
|
||||
#set($resultName = $helper.getUniqueLocalVarName("result", $fields, $settings))
|
||||
int $resultName ##
|
||||
#set($resultAssigned = false)
|
||||
#set($resultDeclarationCompleted = false)
|
||||
@@ -19,7 +19,7 @@ public int hashCode() {
|
||||
#end
|
||||
#addTempDeclaration($resultDeclarationCompleted)
|
||||
#set($tempName = "#addTempDeclaration($resultDeclarationCompleted)")
|
||||
#foreach($field in $members)
|
||||
#foreach($field in $fields)
|
||||
#addTempAssignment($field)
|
||||
#if ($resultDeclarationCompleted)
|
||||
$resultName ##
|
||||
@@ -44,7 +44,7 @@ public int hashCode() {
|
||||
}
|
||||
##
|
||||
#macro (addPrimitiveFieldHashCode $field)
|
||||
#set ($fName = $field.name)
|
||||
#set ($fName = $field.accessor)
|
||||
#if ($field.byte || $field.short || $field.char)
|
||||
(int) $fName##
|
||||
#elseif ($field.long)
|
||||
@@ -64,7 +64,7 @@ public int hashCode() {
|
||||
#end
|
||||
##
|
||||
#macro(getTempVarName)
|
||||
$helper.getUniqueLocalVarName("temp", $members, $settings)##
|
||||
$helper.getUniqueLocalVarName("temp", $fields, $settings)##
|
||||
#end
|
||||
##
|
||||
#macro(addTempForOneField $field)
|
||||
@@ -73,7 +73,7 @@ public int hashCode() {
|
||||
final ##
|
||||
#end
|
||||
#set($tempName = "#getTempVarName()")
|
||||
long $tempName = Double.doubleToLongBits($field.name);
|
||||
long $tempName = Double.doubleToLongBits($field.accessor);
|
||||
#end
|
||||
#end
|
||||
##
|
||||
@@ -82,9 +82,9 @@ public int hashCode() {
|
||||
#if ($field.nestedArray)
|
||||
// Probably incorrect - hashCode for high dimension arrays with Arrays.hashCode
|
||||
#end
|
||||
java.util.Arrays.hashCode($field.name)##
|
||||
java.util.Arrays.hashCode($field.accessor)##
|
||||
#else
|
||||
${field.name}.hashCode()##
|
||||
${field.accessor}.hashCode()##
|
||||
#end
|
||||
#end
|
||||
##
|
||||
@@ -97,8 +97,8 @@ public int hashCode() {
|
||||
#end
|
||||
##
|
||||
#macro(addTempDeclaration $resultDeclarationCompleted)
|
||||
#foreach($member in $members)
|
||||
#if ($member.double)
|
||||
#foreach($field in $fields)
|
||||
#if ($field.double)
|
||||
#if (!$resultDeclarationCompleted)
|
||||
;
|
||||
#end
|
||||
@@ -113,12 +113,12 @@ public int hashCode() {
|
||||
#macro(addTempAssignment $field)
|
||||
#if ($field.double)
|
||||
#set($tempName = "#getTempVarName()")
|
||||
$tempName = Double.doubleToLongBits($field.name);
|
||||
$tempName = Double.doubleToLongBits($field.accessor);
|
||||
#end
|
||||
#end
|
||||
##
|
||||
#macro(addFieldHashCode $field $brace)
|
||||
#set($name = $field.name)
|
||||
#set($name = $field.accessor)
|
||||
#if ($field.notNull)#adjustHashCodeToArrays($field)
|
||||
#else
|
||||
#if ($brace)(##
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#set($classInstanceName = $helper.getUniqueLocalVarName($instanceName, $members, $settings))
|
||||
#set($paramName = $helper.getUniqueLocalVarName($baseParamName, $members, $settings))
|
||||
#set($classInstanceName = $helper.getUniqueLocalVarName($instanceName, $fields, $settings))
|
||||
#set($paramName = $helper.getUniqueLocalVarName($baseParamName, $fields, $settings))
|
||||
#macro(addClassInstance)
|
||||
#if ($settings.generateFinalLocals)
|
||||
final ##
|
||||
|
||||
@@ -8,19 +8,19 @@ Object $paramName){
|
||||
#addClassInstance()
|
||||
return ##
|
||||
#set($i = 0)
|
||||
#foreach($field in $members)
|
||||
#foreach($field in $fields)
|
||||
#if ($i > 0)
|
||||
&&
|
||||
#end
|
||||
#set($i = $i + 1)
|
||||
#if ($field.array)
|
||||
#if ($field.nestedArray)
|
||||
java.util.Arrays.deepEquals($field.name, ${classInstanceName}.$field.name)##
|
||||
java.util.Arrays.deepEquals($field.accessor, ${classInstanceName}.$field.accessor)##
|
||||
#else
|
||||
java.util.Arrays.equals($field.name, ${classInstanceName}.$field.name)##
|
||||
java.util.Arrays.equals($field.accessor, ${classInstanceName}.$field.accessor)##
|
||||
#end
|
||||
#else
|
||||
com.google.common.base.Objects.equal($field.name, ${classInstanceName}.$field.name)##
|
||||
com.google.common.base.Objects.equal($field.accessor, ${classInstanceName}.$field.accessor)##
|
||||
#end
|
||||
#end
|
||||
;
|
||||
|
||||
@@ -5,12 +5,12 @@ public int hashCode() {
|
||||
super.hashCode() ##
|
||||
#set($i = 1)
|
||||
#end
|
||||
#foreach($member in $members)
|
||||
#if (!$member.static)
|
||||
#foreach($field in $fields)
|
||||
#if (!$field.static)
|
||||
#if ($i > 0)
|
||||
, ##
|
||||
#end
|
||||
$member.name ##
|
||||
$field.accessor ##
|
||||
#set($i = $i + 1)
|
||||
#end
|
||||
#end
|
||||
|
||||
@@ -8,19 +8,19 @@ Object $paramName){
|
||||
#addClassInstance()
|
||||
return ##
|
||||
#set($i = 0)
|
||||
#foreach($field in $members)
|
||||
#foreach($field in $fields)
|
||||
#if ($i > 0)
|
||||
&&
|
||||
#end
|
||||
#set($i = $i + 1)
|
||||
#if ($field.array)
|
||||
#if ($field.nestedArray)
|
||||
java.util.Arrays.deepEquals($field.name, ${classInstanceName}.$field.name)##
|
||||
java.util.Arrays.deepEquals($field.accessor, ${classInstanceName}.$field.accessor)##
|
||||
#else
|
||||
java.util.Arrays.equals($field.name, ${classInstanceName}.$field.name)##
|
||||
java.util.Arrays.equals($field.accessor, ${classInstanceName}.$field.accessor)##
|
||||
#end
|
||||
#else
|
||||
java.util.Objects.equals($field.name, ${classInstanceName}.$field.name)##
|
||||
java.util.Objects.equals($field.accessor, ${classInstanceName}.$field.accessor)##
|
||||
#end
|
||||
#end
|
||||
;
|
||||
|
||||
@@ -5,12 +5,12 @@ public int hashCode() {
|
||||
super.hashCode() ##
|
||||
#set($i = 1)
|
||||
#end
|
||||
#foreach($member in $members)
|
||||
#if (!$member.static)
|
||||
#foreach($field in $fields)
|
||||
#if (!$field.static)
|
||||
#if ($i > 0)
|
||||
, ##
|
||||
#end
|
||||
$member.name ##
|
||||
$field.accessor ##
|
||||
#set($i = $i + 1)
|
||||
#end
|
||||
#end
|
||||
|
||||
+22
-12
@@ -341,23 +341,15 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard<PsiClass,
|
||||
private final JComponent myPanel;
|
||||
|
||||
private TemplateChooserStep(boolean isFinal, Project project) {
|
||||
final JCheckBox checkbox = new NonFocusableCheckBox(CodeInsightBundle.message("generate.equals.hashcode.accept.sublcasses"));
|
||||
checkbox.setSelected(!isFinal && CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER);
|
||||
checkbox.setEnabled(!isFinal);
|
||||
checkbox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(@NotNull final ActionEvent M) {
|
||||
CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER = checkbox.isSelected();
|
||||
}
|
||||
});
|
||||
|
||||
myPanel = new JPanel(new VerticalFlowLayout());
|
||||
final JPanel templateChooserPanel = new JPanel(new BorderLayout());
|
||||
final JLabel templateChooserLabel = new JLabel("Template:");
|
||||
final JLabel templateChooserLabel = new JLabel(CodeInsightBundle.message("generate.equals.hashcode.template"));
|
||||
templateChooserPanel.add(templateChooserLabel, BorderLayout.WEST);
|
||||
|
||||
final ComboBox comboBox = new ComboBox();
|
||||
final ComponentWithBrowseButton<ComboBox> comboBoxWithBrowseButton = new ComponentWithBrowseButton<ComboBox>(comboBox,
|
||||
new MyEditTemplatesListener(project, myPanel, comboBox));
|
||||
final ComponentWithBrowseButton<ComboBox> comboBoxWithBrowseButton =
|
||||
new ComponentWithBrowseButton<ComboBox>(comboBox, new MyEditTemplatesListener(project, myPanel, comboBox));
|
||||
templateChooserLabel.setLabelFor(comboBox);
|
||||
final EqualsHashCodeTemplatesManager manager = EqualsHashCodeTemplatesManager.getInstance();
|
||||
comboBox.setModel(new DefaultComboBoxModel(manager.getTemplateNames()));
|
||||
comboBox.setSelectedItem(manager.getDefaultTemplateBaseName());
|
||||
@@ -369,8 +361,26 @@ public class GenerateEqualsWizard extends AbstractGenerateEqualsWizard<PsiClass,
|
||||
|
||||
templateChooserPanel.add(comboBoxWithBrowseButton, BorderLayout.CENTER);
|
||||
myPanel.add(templateChooserPanel);
|
||||
|
||||
final JCheckBox checkbox = new NonFocusableCheckBox(CodeInsightBundle.message("generate.equals.hashcode.accept.sublcasses"));
|
||||
checkbox.setSelected(!isFinal && CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER);
|
||||
checkbox.setEnabled(!isFinal);
|
||||
checkbox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(@NotNull final ActionEvent M) {
|
||||
CodeInsightSettings.getInstance().USE_INSTANCEOF_ON_EQUALS_PARAMETER = checkbox.isSelected();
|
||||
}
|
||||
});
|
||||
myPanel.add(checkbox);
|
||||
myPanel.add(new JLabel(CodeInsightBundle.message("generate.equals.hashcode.accept.sublcasses.explanation")));
|
||||
|
||||
final JCheckBox gettersCheckbox = new NonFocusableCheckBox(CodeInsightBundle.message("generate.equals.hashcode.use.getters"));
|
||||
gettersCheckbox.setSelected(CodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE);
|
||||
gettersCheckbox.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(@NotNull final ActionEvent M) {
|
||||
CodeInsightSettings.getInstance().USE_ACCESSORS_IN_EQUALS_HASHCODE = gettersCheckbox.isSelected();
|
||||
}
|
||||
});
|
||||
myPanel.add(gettersCheckbox);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in new issue
Block a user