// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using CommunityToolkit.Mvvm.SourceGenerators.Extensions;
using CommunityToolkit.Mvvm.SourceGenerators.Helpers;
namespace CommunityToolkit.Mvvm.SourceGenerators.ComponentModel.Models;
///
/// A model representing an generated property
///
/// The type name for the generated property, including nullability annotations.
/// The field name.
/// The generated property name.
/// The sequence of property changing properties to notify.
/// The sequence of property changed properties to notify.
/// The sequence of commands to notify.
/// Whether or not the generated property also broadcasts changes.
/// Whether or not the generated property also validates its value.
/// The sequence of forwarded attributes for the generated property.
internal sealed record PropertyInfo(
string TypeNameWithNullabilityAnnotations,
string FieldName,
string PropertyName,
ImmutableArray PropertyChangingNames,
ImmutableArray PropertyChangedNames,
ImmutableArray NotifiedCommandNames,
bool NotifyPropertyChangedRecipients,
bool NotifyDataErrorInfo,
ImmutableArray ForwardedAttributes)
{
///
/// An implementation for .
///
public sealed class Comparer : Comparer
{
///
protected override void AddToHashCode(ref HashCode hashCode, PropertyInfo obj)
{
hashCode.Add(obj.TypeNameWithNullabilityAnnotations);
hashCode.Add(obj.FieldName);
hashCode.Add(obj.PropertyName);
hashCode.AddRange(obj.PropertyChangingNames);
hashCode.AddRange(obj.PropertyChangedNames);
hashCode.AddRange(obj.NotifiedCommandNames);
hashCode.Add(obj.NotifyPropertyChangedRecipients);
hashCode.Add(obj.NotifyDataErrorInfo);
hashCode.AddRange(obj.ForwardedAttributes, AttributeInfo.Comparer.Default);
}
///
protected override bool AreEqual(PropertyInfo x, PropertyInfo y)
{
return
x.TypeNameWithNullabilityAnnotations == y.TypeNameWithNullabilityAnnotations &&
x.FieldName == y.FieldName &&
x.PropertyName == y.PropertyName &&
x.PropertyChangingNames.SequenceEqual(y.PropertyChangingNames) &&
x.PropertyChangedNames.SequenceEqual(y.PropertyChangedNames) &&
x.NotifiedCommandNames.SequenceEqual(y.NotifiedCommandNames) &&
x.NotifyPropertyChangedRecipients == y.NotifyPropertyChangedRecipients &&
x.NotifyDataErrorInfo == y.NotifyDataErrorInfo &&
x.ForwardedAttributes.SequenceEqual(y.ForwardedAttributes, AttributeInfo.Comparer.Default);
}
}
}