generate equals/hashCode: allow getters (IDEA-73860)

This commit is contained in:
Anna Kozlova committed 2015-01-13 12:48:00 +01:00
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
@@ -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