private TypeDeclarationSyntax TransformProperty(PropertyTransformationResult propertyTransform, TypeDeclarationSyntax newTypeNode, TypeTransformationResult transformResult, INamespaceTransformationMetadata namespaceMetadata, SyntaxTrivia memberWhitespace, bool onlyMissingMembers) { var propertyNode = newTypeNode.GetAnnotatedNodes(propertyTransform.Annotation) .OfType <PropertyDeclarationSyntax>() .First(); var transformedNode = TransformProperty(propertyNode, !onlyMissingMembers, propertyTransform, transformResult, namespaceMetadata); foreach (var transformedAccessor in transformedNode.TransformedAccessors.Where(o => o.Transformed != null)) { foreach (var transformer in _configuration.MethodTransformers) { var methodTransformResult = transformer.Transform(transformedAccessor, transformResult, namespaceMetadata); if (methodTransformResult == MethodTransformerResult.Skip) { continue; } transformedAccessor.Transformed = methodTransformResult.TransformedNode ?? transformedAccessor.Transformed; if (methodTransformResult.Fields != null) { if (transformedNode.Fields == null) { transformedNode.Fields = new List <FieldDeclarationSyntax>(1); } transformedNode.Fields.AddRange(methodTransformResult.Fields); // Update member names for next transformators foreach (var variable in methodTransformResult.Fields.SelectMany(o => o.Declaration.Variables)) { transformResult.MemberNames = transformResult.MemberNames.Add(variable.Identifier.Text); } } if (methodTransformResult.Methods != null) { transformedNode.AddMethods(methodTransformResult.Methods); // Update member names for next transformators foreach (var method in methodTransformResult.Methods) { transformResult.MemberNames = transformResult.MemberNames.Add(method.Identifier.Text); } } } propertyTransform.AddMethod(transformedAccessor.Transformed); } newTypeNode = newTypeNode.AppendMembers(propertyNode, propertyTransform.Fields, propertyTransform.Methods); // We need to remove the property when generating only the missing members if (onlyMissingMembers || propertyTransform.AnalyzationResult.Conversion == PropertyConversion.Ignore) { // We need to add a whitespace trivia to keep directives as they will not have any leading whitespace newTypeNode = newTypeNode.RemoveNodeKeepDirectives(propertyTransform.Annotation, memberWhitespace, transformResult.EndOfLineTrivia); } return(newTypeNode); }