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