SharpGen/Generator/FieldCodeGenerator.Property.cs (94 lines of code) (raw):

using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using SharpGen.Model; using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; namespace SharpGen.Generator { internal sealed partial class FieldCodeGenerator { private PropertyDeclarationSyntax GenerateProperty(CsField csElement, TypeSyntax propertyType, PropertyValueGetTransform getterTransform, PropertyValueSetTransform setterTransform) => AddDocumentationTrivia( PropertyDeclaration(propertyType, csElement.Name) .WithAccessorList( AccessorList( List( new[] { GenerateGetter(csElement, getterTransform), GenerateSetter(csElement, setterTransform) } ) ) ) .WithModifiers(csElement.VisibilityTokenList), csElement ); private delegate ExpressionSyntax PropertyValueGetTransform(ExpressionSyntax value); private delegate ExpressionSyntax PropertyValueSetTransform(ExpressionSyntax oldValue, ExpressionSyntax value); private static PropertyValueGetTransform Compose(PropertyValueGetTransform second, PropertyValueGetTransform first) { if (second == null) return first; if (first == null) return second; return x => { var value = first(x); return second(GeneratorHelpers.WrapInParentheses(value)); }; } private static PropertyValueSetTransform Compose(PropertyValueSetTransform second, PropertyValueSetTransform first) { if (second == null) return first; if (first == null) return second; return (oldValue, x) => { var value = first(oldValue, x); return second(oldValue, GeneratorHelpers.WrapInParentheses(value)); }; } private static AccessorDeclarationSyntax GenerateGetter(CsField csElement, PropertyValueGetTransform valueTransformation) { ExpressionSyntax valueExpression = ParseName(csElement.IntermediateMarshalName); return AccessorDeclaration(SyntaxKind.GetAccessorDeclaration) .WithExpressionBody( ArrowExpressionClause( valueTransformation != null ? valueTransformation(GeneratorHelpers.WrapInParentheses(valueExpression)) : valueExpression ) ) .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); } private static AccessorDeclarationSyntax GenerateSetter(CsField csElement, PropertyValueSetTransform valueTransformation) { ExpressionSyntax valueExpression = IdentifierName("value"); var storage = MemberAccessExpression( SyntaxKind.SimpleMemberAccessExpression, ThisExpression(), IdentifierName(csElement.IntermediateMarshalName) ); return AccessorDeclaration(SyntaxKind.SetAccessorDeclaration) .WithExpressionBody( ArrowExpressionClause( AssignmentExpression( SyntaxKind.SimpleAssignmentExpression, storage, valueTransformation != null ? valueTransformation(storage, valueExpression) : valueExpression ) ) ) .WithSemicolonToken(Token(SyntaxKind.SemicolonToken)); } } }