Пример #1
0
        private static IDocument GetOrCreateBackingField(this IDocument document, SyntaxAnnotation propertyAnnotation, out IFieldSymbol backingField)
        {
            var semanticModel  = document.GetSemanticModel();
            var property       = document.GetAnnotatedNode <PropertyDeclarationSyntax>(propertyAnnotation);
            var propertySymbol = (IPropertySymbol)semanticModel.GetDeclaredSymbol(property);
            var getter         = property.AccessorList.Accessors.First(a => a.Kind == SyntaxKind.GetAccessorDeclaration);

            if (getter.Body == null)
            {
                // When the getter doesn't have a body (i.e. an auto-prop), we'll need to generate a new field.
                var newField = SymbolFactory.CreateField(
                    attributes: null,
                    accessibility: CommonAccessibility.Private,
                    modifiers: new SymbolModifiers(),
                    type: propertySymbol.Type,
                    name: GenerateFieldName(property, semanticModel));

                var codeGenResult = newField.AddFieldTo(propertySymbol.ContainingType, document.Project.Solution);

                document       = codeGenResult;
                semanticModel  = document.GetSemanticModel();
                property       = document.GetAnnotatedNode <PropertyDeclarationSyntax>(propertyAnnotation);
                propertySymbol = (IPropertySymbol)semanticModel.GetDeclaredSymbol(property);

                backingField = (IFieldSymbol)propertySymbol.ContainingType.GetMembers(newField.Name).Single();

                return(document);
            }
            else
            {
                backingField = GetBackingFieldFromGetter(getter, semanticModel);
                return(document);
            }
        }