private IfStatementSyntax MakeDictionaryEqualsTest()

in src/Json.Schema.ToDotNet/EqualityComparerGenerator.cs [446:530]


        private IfStatementSyntax MakeDictionaryEqualsTest(
            string propertyInfoKey,
            ExpressionSyntax left,
            ExpressionSyntax right)
        {
            string dictionaryElementVariableName = _localVariableNameGenerator.GetNextCollectionElementVariableName();
            string otherPropertyVariableName = _localVariableNameGenerator.GetNextCollectionElementVariableName();

            // Construct the key into the PropertyInfoDictionary so we can look up how
            // dictionary elements are to be compared.
            string valuePropertyInfoKey = PropertyInfoDictionary.MakeDictionaryItemKeyName(propertyInfoKey);
            TypeSyntax dictionaryValueType = _propertyInfoDictionary[valuePropertyInfoKey].Type;

            return SyntaxFactory.IfStatement(
                // if (!Object.ReferenceEquals(left, right))
                SyntaxHelper.AreDifferentObjects(left, right),
                SyntaxFactory.Block(
                    // if (left == null || right == null || left.Count != right.Count)
                    SyntaxFactory.IfStatement(
                        SyntaxFactory.BinaryExpression(
                            SyntaxKind.LogicalOrExpression,
                            SyntaxHelper.IsNull(left),
                            SyntaxFactory.BinaryExpression(
                                SyntaxKind.LogicalOrExpression,
                                SyntaxHelper.IsNull(right),
                                SyntaxFactory.BinaryExpression(
                                    SyntaxKind.NotEqualsExpression,
                                    SyntaxFactory.MemberAccessExpression(
                                        SyntaxKind.SimpleMemberAccessExpression,
                                        left,
                                        SyntaxFactory.IdentifierName(CountPropertyName)),
                                    SyntaxFactory.MemberAccessExpression(
                                        SyntaxKind.SimpleMemberAccessExpression,
                                        right,
                                        SyntaxFactory.IdentifierName(CountPropertyName))))),
                        // return false;
                        SyntaxFactory.Block(SyntaxHelper.Return(false))),
                    // foreach (var value_0 in left)
                    SyntaxFactory.ForEachStatement(
                        SyntaxHelper.Var(),
                        dictionaryElementVariableName,
                        left,
                        SyntaxFactory.Block(
                            // var value_1;
                            SyntaxFactory.LocalDeclarationStatement(
                                default(SyntaxTokenList), // modifiers
                                SyntaxFactory.VariableDeclaration(
                                    dictionaryValueType,
                                    SyntaxFactory.SingletonSeparatedList(
                                        SyntaxFactory.VariableDeclarator(otherPropertyVariableName)))),
                            // if (!right.TryGetValue(value_0.Key, out value_1))
                            SyntaxFactory.IfStatement(
                                SyntaxFactory.PrefixUnaryExpression(
                                    SyntaxKind.LogicalNotExpression,
                                    SyntaxFactory.InvocationExpression(
                                        SyntaxFactory.MemberAccessExpression(
                                            SyntaxKind.SimpleMemberAccessExpression,
                                            right,
                                            SyntaxFactory.IdentifierName("TryGetValue")),
                                        SyntaxFactory.ArgumentList(
                                            SyntaxFactory.SeparatedList(
                                                new ArgumentSyntax[]
                                                {
                                                    SyntaxFactory.Argument(
                                                        SyntaxFactory.MemberAccessExpression(
                                                            SyntaxKind.SimpleMemberAccessExpression,
                                                            SyntaxFactory.IdentifierName(dictionaryElementVariableName),
                                                            SyntaxFactory.IdentifierName(KeyPropertyName))),
                                                    SyntaxFactory.Argument(
                                                        default(NameColonSyntax),
                                                        SyntaxFactory.Token(SyntaxKind.OutKeyword),
                                                        SyntaxFactory.IdentifierName(otherPropertyVariableName))

                                                })))),
                                // return false;
                                SyntaxFactory.Block(SyntaxHelper.Return(false))),

                            GeneratePropertyComparison(
                                    valuePropertyInfoKey,
                                    SyntaxFactory.MemberAccessExpression(
                                        SyntaxKind.SimpleMemberAccessExpression,
                                        SyntaxFactory.IdentifierName(dictionaryElementVariableName),
                                        SyntaxFactory.IdentifierName(ValuePropertyName)),
                                    SyntaxFactory.IdentifierName(otherPropertyVariableName))))));
        }