public static PropertyRegistrationType?GetPropertyRegistrationType(this IPropertySymbol property, Compilation compilation) { if (property.Type.TypeKind == TypeKind.TypeParameter) { return(property.GetGenericPropertyRegistrationType(compilation)); } if (!(property.Type is INamedTypeSymbol propertyType)) { return(null); } var parent = property.GetPropertyRegistrationParentType(compilation); if (!parent.HasValue) { return(null); } var parentValue = parent.Value; if (propertyType.EqualsTo(KnownTypes.LocalColumnOf, compilation)) { return(PropertyRegistrationType.LocalColumn); } else if (propertyType.IsDerivedFrom(KnownTypes.Column, compilation)) { return(parentValue == PropertyRegistrationParentType.Model ? PropertyRegistrationType.ModelColumn : PropertyRegistrationType.ProjectionColumn); } else if (propertyType.IsDerivedFrom(KnownTypes.Projection, compilation)) { return(PropertyRegistrationType.Projection); } else if (propertyType.IsDerivedFrom(KnownTypes.ColumnList, compilation)) { return(PropertyRegistrationType.ColumnList); } else if (propertyType.IsDerivedFrom(KnownTypes.Model, compilation)) { return(PropertyRegistrationType.ChildModel); } else { return(null); } }