private static ExpressionSyntax BuildEqualityOperatorCall(GeneratedPropertyInfo property)
 => BinaryExpression
 (
     SyntaxKind.EqualsExpression,
     MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(property.Name)),
     MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(_otherArg), IdentifierName(property.Name))
 );
        private static ExpressionSyntax BuildPropertyHashCodeCall(GeneratedPropertyInfo propertyInfo)
        {
            MemberAccessExpressionSyntax defaultComparer          = DefaultEqualityComparer.AccessExpression(propertyInfo.Type);
            MemberAccessExpressionSyntax defaultGetHashCodeMethod = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, defaultComparer, _getHashCodeIdentifier);
            MemberAccessExpressionSyntax fieldAccess     = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(propertyInfo.Name));
            InvocationExpressionSyntax   getHashCodeCall = InvocationExpression(defaultGetHashCodeMethod).AddArgumentListArguments(Argument(fieldAccess));

            return(getHashCodeCall);
        }
 private PropertyDeclarationSyntax BuildProperty(GeneratedPropertyInfo propertyInfo)
 => PropertyDeclaration(ParseTypeName(propertyInfo.Type.ToDisplayString()), propertyInfo.Name)
 .WithModifiers(SyntaxTokenList.Create(Token(SyntaxKind.PublicKeyword)))
 .WithAccessorList
 (
     AccessorList
     (
         new SyntaxList <AccessorDeclarationSyntax>()
         .Add(AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)))
         .Add(AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(Token(SyntaxKind.SemicolonToken)))
     )
 );
 private static ExpressionSyntax BuildEqualityComparerEqualsCall(GeneratedPropertyInfo property)
 => InvocationExpression
 (
     MemberAccessExpression
     (
         SyntaxKind.SimpleMemberAccessExpression,
         DefaultEqualityComparer.AccessExpression(property.Type),
         IdentifierName(nameof(EqualityComparer <object> .Default.Equals))
     )
 )
 .AddArgumentListArguments
 (
     Argument(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(property.Name))),
     Argument(MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(_otherArg), IdentifierName(property.Name)))
 );
 private static ExpressionSyntax BuildFieldEqualityCall(GeneratedPropertyInfo property)
 => DeclaresEqualityOperator(property.Type) ? BuildEqualityOperatorCall(property) : BuildEqualityComparerEqualsCall(property);
        private static IEnumerable <InterpolatedStringContentSyntax> EnumeratePropertyInterpolationContent(GeneratedPropertyInfo property)
        {
            yield return(Interpolation(InvocationExpression(IdentifierName("nameof")).AddArgumentListArguments(Argument(IdentifierName(property.Name)))));

            yield return(InterpolatedText(": "));

            yield return(Interpolation(IdentifierName(property.Name)));
        }