From 14cc54527663018cdf7343eefffc8c37fbce93bb Mon Sep 17 00:00:00 2001
From: Roel Spilker <r.spilker@gmail.com>
Date: Sun, 19 Jan 2014 21:49:35 +0100
Subject: Issue 625: use (even) better primes for hashcodes

---
 src/core/lombok/core/handlers/HandlerUtil.java             | 14 +++++++++++---
 .../lombok/eclipse/handlers/HandleEqualsAndHashCode.java   | 12 ++++++------
 .../lombok/javac/handlers/HandleEqualsAndHashCode.java     |  8 ++++----
 3 files changed, 21 insertions(+), 13 deletions(-)

(limited to 'src')

diff --git a/src/core/lombok/core/handlers/HandlerUtil.java b/src/core/lombok/core/handlers/HandlerUtil.java
index c8076ab6..23b8ccc7 100644
--- a/src/core/lombok/core/handlers/HandlerUtil.java
+++ b/src/core/lombok/core/handlers/HandlerUtil.java
@@ -27,9 +27,17 @@ import lombok.core.LombokNode;
 public class HandlerUtil {
 	private HandlerUtil() {}
 	
-	public static final int PRIME_FOR_HASHCODE = 277;
-	public static final int PRIME_FOR_TRUE = 2591;
-	public static final int PRIME_FOR_FALSE = 2609;
+	public static int primeForHashcode() {
+		return 59;
+	}
+	
+	public static int primeForTrue() {
+		return 79;
+	}
+	
+	public static int primeForFalse() {
+		return 97;
+	}
 	
 	/** Checks if the given name is a valid identifier.
 	 * 
diff --git a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
index 8d95ca64..0cc0836e 100644
--- a/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/eclipse/handlers/HandleEqualsAndHashCode.java
@@ -272,7 +272,7 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
 		
 		final boolean isEmpty = fields.isEmpty();
 		
-		/* final int PRIME = 277; */ {
+		/* final int PRIME = X; */ {
 			/* Without fields, PRIME isn't used, and that would trigger a 'local variable not used' warning. */
 			if (!isEmpty || callSuper) {
 				LocalDeclaration primeDecl = new LocalDeclaration(PRIME, pS, pE);
@@ -281,7 +281,7 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
 				primeDecl.type = TypeReference.baseTypeReference(TypeIds.T_int, 0);
 				primeDecl.type.sourceStart = pS; primeDecl.type.sourceEnd = pE;
 				setGeneratedBy(primeDecl.type, source);
-				primeDecl.initialization = makeIntLiteral(String.valueOf(HandlerUtil.PRIME_FOR_HASHCODE).toCharArray(), source);
+				primeDecl.initialization = makeIntLiteral(String.valueOf(HandlerUtil.primeForHashcode()).toCharArray(), source);
 				statements.add(primeDecl);
 			}
 		}
@@ -313,10 +313,10 @@ public class HandleEqualsAndHashCode extends EclipseAnnotationHandler<EqualsAndH
 			Expression fieldAccessor = createFieldAccessor(field, fieldAccess, source);
 			if (fType.dimensions() == 0 && token != null) {
 				if (Arrays.equals(TypeConstants.BOOLEAN, token)) {
-					/* booleanField ? 2591 : 2609 */
-					IntLiteral intFalse = makeIntLiteral(String.valueOf(HandlerUtil.PRIME_FOR_FALSE).toCharArray(), source);
-					IntLiteral intTrue = makeIntLiteral(String.valueOf(HandlerUtil.PRIME_FOR_TRUE).toCharArray(), source);
-					ConditionalExpression intForBool = new ConditionalExpression(fieldAccessor, intFalse, intTrue);
+					/* booleanField ? X : Y */
+					IntLiteral intTrue = makeIntLiteral(String.valueOf(HandlerUtil.primeForTrue()).toCharArray(), source);
+					IntLiteral intFalse = makeIntLiteral(String.valueOf(HandlerUtil.primeForFalse()).toCharArray(), source);
+					ConditionalExpression intForBool = new ConditionalExpression(fieldAccessor, intTrue, intFalse);
 					setGeneratedBy(intForBool, source);
 					statements.add(createResultCalculation(source, intForBool));
 				} else if (Arrays.equals(TypeConstants.LONG, token)) {
diff --git a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
index 92eee893..05c07c7a 100644
--- a/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
+++ b/src/core/lombok/javac/handlers/HandleEqualsAndHashCode.java
@@ -231,9 +231,9 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
 		Name resultName = typeNode.toName(RESULT_NAME);
 		long finalFlag = JavacHandlerUtil.addFinalIfNeeded(0L, typeNode.getContext());
 		
-		/* final int PRIME = 277; */ {
+		/* final int PRIME = X; */ {
 			if (!fields.isEmpty() || callSuper) {
-				statements.append(maker.VarDef(maker.Modifiers(finalFlag), primeName, maker.TypeIdent(CTC_INT), maker.Literal(HandlerUtil.PRIME_FOR_HASHCODE)));
+				statements.append(maker.VarDef(maker.Modifiers(finalFlag), primeName, maker.TypeIdent(CTC_INT), maker.Literal(HandlerUtil.primeForHashcode())));
 			}
 		}
 		
@@ -255,9 +255,9 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
 			if (fType instanceof JCPrimitiveTypeTree) {
 				switch (((JCPrimitiveTypeTree)fType).getPrimitiveTypeKind()) {
 				case BOOLEAN:
-					/* this.fieldName ? 2591 : 2609 */
+					/* this.fieldName ? X : Y */
 					statements.append(createResultCalculation(typeNode, maker.Conditional(fieldAccessor, 
-							maker.Literal(HandlerUtil.PRIME_FOR_FALSE), maker.Literal(HandlerUtil.PRIME_FOR_TRUE))));
+							maker.Literal(HandlerUtil.primeForTrue()), maker.Literal(HandlerUtil.primeForFalse()))));
 					break;
 				case LONG: {
 						Name dollarFieldName = dollar.append(((JCVariableDecl)fieldNode.get()).name);
-- 
cgit