for (PsiField classField : psiFields) {
final String fieldName = classField.getName();
final String fieldAccessor = buildAttributeNameString(doNotUseGetters, classField, psiClass);
final PsiType classFieldType = classField.getType();
if (classFieldType instanceof PsiPrimitiveType) {
if (PsiType.BOOLEAN.equals(classFieldType)) {
builder.append("result = ((result * PRIME) + (this.").append(fieldAccessor).append(" ? ").append(PRIME_FOR_TRUE).append(" : ").append(PRIME_FOR_FALSE).append("));\n");
} else if (PsiType.LONG.equals(classFieldType)) {
builder.append("final long $").append(fieldName).append(" = this.").append(fieldAccessor).append(";\n");
builder.append("result = result * PRIME + (int)($").append(fieldName).append(" >>> 32 ^ $").append(fieldName).append(");\n");
} else if (PsiType.FLOAT.equals(classFieldType)) {
builder.append("result = result * PRIME + java.lang.Float.floatToIntBits(this.").append(fieldAccessor).append(");\n");
} else if (PsiType.DOUBLE.equals(classFieldType)) {
builder.append("final long $").append(fieldName).append(" = java.lang.Double.doubleToLongBits(this.").append(fieldAccessor).append(");\n");
builder.append("result = result * PRIME + (int)($").append(fieldName).append(" >>> 32 ^ $").append(fieldName).append(");\n");
} else {
builder.append("result = result * PRIME + this.").append(fieldAccessor).append(";\n");
}
} else if (classFieldType instanceof PsiArrayType) {
final PsiType componentType = ((PsiArrayType) classFieldType).getComponentType();
if (componentType instanceof PsiPrimitiveType) {
builder.append("result = result * PRIME + java.util.Arrays.hashCode(this.").append(fieldName).append(");\n");
} else {
builder.append("result = result * PRIME + java.util.Arrays.deepHashCode(this.").append(fieldName).append(");\n");
}