in src/Json.Schema.ToDotNet/EqualityComparerGenerator.cs [702:755]
private StatementSyntax GenerateDictionaryHashCodeContribution(ExpressionSyntax expression)
{
string xorValueVariableName = _localVariableNameGenerator.GetNextXorVariableName();
string collectionElementVariableName = _localVariableNameGenerator.GetNextCollectionElementVariableName();
return SyntaxFactory.IfStatement(
SyntaxHelper.IsNotNull(expression),
SyntaxFactory.Block(
// int xor_0 = 0;
SyntaxFactory.LocalDeclarationStatement(
SyntaxFactory.VariableDeclaration(
SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.IntKeyword)),
SyntaxFactory.SingletonSeparatedList(
SyntaxFactory.VariableDeclarator(
SyntaxFactory.Identifier(xorValueVariableName),
default(BracketedArgumentListSyntax),
SyntaxFactory.EqualsValueClause(
SyntaxFactory.LiteralExpression(
SyntaxKind.NumericLiteralExpression,
SyntaxFactory.Literal(0)))))))
.WithLeadingTrivia(
SyntaxFactory.ParseLeadingTrivia(Resources.XorDictionaryComment)),
SyntaxFactory.ForEachStatement(
SyntaxHelper.Var(),
collectionElementVariableName,
expression,
SyntaxFactory.Block(
// xor_0 ^= value_0.Key.GetHashCode();
Xor(xorValueVariableName, collectionElementVariableName, KeyPropertyName),
SyntaxFactory.IfStatement(
SyntaxHelper.IsNotNull(
SyntaxFactory.MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
SyntaxFactory.IdentifierName(collectionElementVariableName),
SyntaxFactory.IdentifierName(ValuePropertyName))),
SyntaxFactory.Block(
Xor(xorValueVariableName, collectionElementVariableName, ValuePropertyName))))),
SyntaxFactory.ExpressionStatement(
SyntaxFactory.AssignmentExpression(
SyntaxKind.SimpleAssignmentExpression,
SyntaxFactory.IdentifierName(GetHashCodeResultVariableName),
SyntaxFactory.BinaryExpression(
SyntaxKind.AddExpression,
SyntaxFactory.ParenthesizedExpression(
SyntaxFactory.BinaryExpression(
SyntaxKind.MultiplyExpression,
SyntaxFactory.IdentifierName(GetHashCodeResultVariableName),
SyntaxFactory.LiteralExpression(
SyntaxKind.NumericLiteralExpression,
SyntaxFactory.Literal(GetHashCodeCombiningValue)))),
SyntaxFactory.IdentifierName(xorValueVariableName))))));
}