private StatementSyntax GenerateDictionaryHashCodeContribution()

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))))));
        }