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