private SourceCode GetProperties(SemanticModel semanticModel, HashSet <string> typeReferences, IEnumerable <PropertyDeclarationSyntax> propertyDeclarations, bool isFromInterface) { var generatedProperties = new SourceCode { MainPart = "" }; foreach (var propertyDeclaration in propertyDeclarations) { string identifier = propertyDeclaration.Identifier.ValueText; var propertyType = propertyDeclaration.Type; var typeReference = TypeReferenceGenerator.GenerateTypeReference(propertyType, semanticModel); if (!typeReference.IsPredefined) { typeReferences.Add(typeReference.Text); } bool isStatic = HasStaticModifier(propertyDeclaration.Modifiers.ToList()); bool isVirtual = isFromInterface || HasVirtualModifier(propertyDeclaration.Modifiers.ToList()); var propertyAccessModifier = GetAccessModifier(propertyDeclaration.Modifiers.ToList()); var accessors = propertyDeclaration.AccessorList.Accessors; var getAccessor = accessors.FirstOrDefault(syntax => syntax.Keyword.Text == "get"); var setAccessor = accessors.FirstOrDefault(syntax => syntax.Keyword.Text == "set"); if (propertyDeclaration.AccessorList.Accessors.Any(syntax => syntax.Body != null)) { var complexPropertyDescription = new ComplexPropertyDescription { PropertyName = identifier, PropertyType = typeReference, GetAccessModifier = new Optional <AccessModifier>(), SetAccessModifier = new Optional <AccessModifier>(), IsStatic = isStatic, IsVirtual = isVirtual }; if (getAccessor != null) { var getAccessModifier = GetAccessModifier(getAccessor.Modifiers); var getModifier = MaxRestrictionAccessModifier(propertyAccessModifier, getAccessModifier); complexPropertyDescription.GetAccessModifier = getModifier; if (getAccessor.Body != null) { var statements = new List <string>(); foreach (var statement in getAccessor.Body.Statements) { string generatedStatement = StatementGenerator.Generate(statement, semanticModel); statements.Add(generatedStatement); } complexPropertyDescription.GetStatements = statements; } } if (setAccessor != null) { var setAccessModifier = GetAccessModifier(setAccessor.Modifiers); var setModifier = MaxRestrictionAccessModifier(propertyAccessModifier, setAccessModifier); complexPropertyDescription.SetAccessModifier = setModifier; if (setAccessor.Body != null) { var statements = new List <string>(); foreach (var statement in setAccessor.Body.Statements) { string generatedStatement = StatementGenerator.Generate(statement, semanticModel); statements.Add(generatedStatement); } complexPropertyDescription.SetStatements = statements; } } SourceCode generatedProperty = PropertyGenerator.GenerateComplexProperty(complexPropertyDescription, semanticModel); generatedProperties.MainPart += "\n" + generatedProperty.MainPart; } else { var simplePropertyDescription = new SimplePropertyDescription { PropertyName = identifier, PropertyType = typeReference, GetAccessModifier = new Optional <AccessModifier>(), SetAccessModifier = new Optional <AccessModifier>(), IsStatic = isStatic, IsVirtual = isVirtual, IsFromInterface = isFromInterface }; if (getAccessor != null) { var getAccessModifier = GetAccessModifier(getAccessor.Modifiers); var getModifier = MaxRestrictionAccessModifier(propertyAccessModifier, getAccessModifier); simplePropertyDescription.GetAccessModifier = getModifier; } if (setAccessor != null) { var setAccessModifier = GetAccessModifier(setAccessor.Modifiers); var setModifier = MaxRestrictionAccessModifier(propertyAccessModifier, setAccessModifier); simplePropertyDescription.SetAccessModifier = setModifier; } SourceCode generatedProperty = PropertyGenerator .GenerateSimpleProperty(simplePropertyDescription, semanticModel, isFromInterface); generatedProperties.MainPart += "\n" + generatedProperty.MainPart; } } return(generatedProperties); }