Пример #1
0
        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);
        }