private void GenerateExplicitConversionToKey(EqualityInstanceMemberInfo keyMemberInfo)
    {
        var keyMember = keyMemberInfo.Member;

        if (keyMember.IsReferenceType || !_state.IsReferenceType)
        {
            return;
        }

        _sb.Append($@"

      /// <summary>
      /// Explicit conversion to the type <see cref=""{keyMember.TypeMinimallyQualified}""/>.
      /// </summary>
      /// <param name=""obj"">Object to covert.</param>
      /// <returns>The <see cref=""{keyMember.Name}""/> of provided <paramref name=""obj""/> or <c>default</c> if <paramref name=""obj""/> is <c>null</c>.</returns>
      [return: global::System.Diagnostics.CodeAnalysis.NotNullIfNotNull(""obj"")]
      public static explicit operator {keyMember.TypeFullyQualifiedWithNullability}({_state.TypeFullyQualified} obj)
      {{
         if(obj is null)
            throw new global::System.NullReferenceException();

         return obj.{keyMember.Name};
      }}");
    }
    private void GenerateImplicitConversionToKey(EqualityInstanceMemberInfo keyMemberInfo)
    {
        var keyMember = keyMemberInfo.Member;
        var returnTypeNullableQuestionMark = _state.IsReferenceType ? "?" : keyMember.NullableQuestionMark;

        _sb.Append($@"

      /// <summary>
      /// Implicit conversion to the type <see cref=""{keyMember.TypeMinimallyQualified}""/>.
      /// </summary>
      /// <param name=""obj"">Object to covert.</param>
      /// <returns>The <see cref=""{keyMember.Name}""/> of provided <paramref name=""obj""/> or <c>default</c> if <paramref name=""obj""/> is <c>null</c>.</returns>
      [return: global::System.Diagnostics.CodeAnalysis.NotNullIfNotNull(""obj"")]
      public static implicit operator {keyMember.TypeFullyQualified}{returnTypeNullableQuestionMark}({_state.TypeFullyQualified}{_state.NullableQuestionMark} obj)
      {{");

        if (_state.IsReferenceType)
        {
            _sb.Append($@"
         return obj is null ? null : obj.{keyMember.Name};");
        }
        else
        {
            _sb.Append($@"
         return obj.{keyMember.Name};");
        }

        _sb.Append(@"
      }");
    }
Exemple #3
0
    private IReadOnlyList <EqualityInstanceMemberInfo> GetEqualityMembers()
    {
        var members = AssignableInstanceFieldsAndProperties;

        if (members.Count == 0)
        {
            return(Array.Empty <EqualityInstanceMemberInfo>());
        }

        List <EqualityInstanceMemberInfo>?equalityMembers = null;

        foreach (var member in members)
        {
            var settings = member.ValueObjectMemberSettings;

            if (settings.IsExplicitlyDeclared)
            {
                var equalityComparer = settings.EqualityComparer;
                var comparer         = settings.Comparer;
                var equalityMember   = new EqualityInstanceMemberInfo(member, equalityComparer, comparer);

                (equalityMembers ??= new List <EqualityInstanceMemberInfo>()).Add(equalityMember);
            }
        }

        return(equalityMembers ?? members.Select(m => new EqualityInstanceMemberInfo(m, null, null)).ToList());
    }
   private static string GenerateFormatter(ValueObjectSourceGeneratorState state, EqualityInstanceMemberInfo keyMember)
   {
      var ns = state.Namespace;

      return $@"{GENERATED_CODE_PREFIX}
{(ns is null ? null : $@"
namespace {ns}
{{")}
    private void GenerateCompareTo(EqualityInstanceMemberInfo keyMemberInfo)
    {
        var keyMember = keyMemberInfo.Member;
        var comparer  = keyMemberInfo.Comparer;

        _sb.Append($@"

      /// <inheritdoc />
      public int CompareTo(object? obj)
      {{
         if(obj is null)
            return 1;

         if(obj is not {_state.TypeFullyQualified} valueObject)
            throw new global::System.ArgumentException(""Argument must be of type \""{_state.TypeMinimallyQualified}\""."", nameof(obj));

         return this.CompareTo(valueObject);
      }}

      /// <inheritdoc />
      public int CompareTo({_state.TypeFullyQualified}{_state.NullableQuestionMark} obj)
      {{");

        if (_state.IsReferenceType)
        {
            _sb.Append(@"
         if(obj is null)
            return 1;
");
        }

        if (comparer is null)
        {
            if (keyMember.IsReferenceType)
            {
                _sb.Append($@"
         if(this.{keyMember.Name} is null)
            return obj.{keyMember.Name} is null ? 0 : -1;
");
            }

            _sb.Append($@"
         return this.{keyMember.Name}.CompareTo(obj.{keyMember.Name});");
        }
        else
        {
            _sb.Append($@"
         return {comparer}.Compare(this.{keyMember.Name}, obj.{keyMember.Name});");
        }

        _sb.Append(@"
      }");
    }
    private void GenerateToStringFormat(EqualityInstanceMemberInfo keyMemberInfo)
    {
        var keyMember = keyMemberInfo.Member;

        _sb.Append($@"

      /// <inheritdoc />
      public string ToString(string? format, global::System.IFormatProvider? formatProvider = null)
      {{
         return this.{keyMember.Name}.ToString(format, formatProvider);
      }}");
    }
    private void GenerateTypeConverter(EqualityInstanceMemberInfo keyMemberInfo)
    {
        var keyMember = keyMemberInfo.Member;

        _sb.Append($@"
   public class {_state.Name}_ValueObjectTypeConverter : global::Thinktecture.ValueObjectTypeConverter<{_state.TypeFullyQualified}, {keyMember.TypeFullyQualifiedWithNullability}>
   {{
      /// <inheritdoc />");

        if (keyMember.IsReferenceType)
        {
            _sb.Append($@"
      [return: global::System.Diagnostics.CodeAnalysis.NotNullIfNotNull(""{keyMember.ArgumentName}"")]");
        }

        _sb.Append($@"
      protected override {_state.TypeFullyQualified}{(keyMember.IsReferenceType ? _state.NullableQuestionMark : null)} ConvertFrom({keyMember.TypeFullyQualified}{keyMember.NullableQuestionMark} {keyMember.ArgumentName})
      {{");

        if (keyMember.IsReferenceType)
        {
            _sb.Append($@"
         if({keyMember.ArgumentName} is null)
            return default({_state.TypeFullyQualified});
");
        }

        _sb.Append($@"
         return {_state.TypeFullyQualified}.Create({keyMember.ArgumentName});
      }}

      /// <inheritdoc />
      protected override {keyMember.TypeFullyQualifiedWithNullability} GetKeyValue({_state.TypeFullyQualified} obj)
      {{
         return ({keyMember.TypeFullyQualifiedWithNullability}) obj;
      }}
   }}
");
    }
    private void GenerateExplicitConversion(EqualityInstanceMemberInfo keyMemberInfo)
    {
        var keyMember             = keyMemberInfo.Member;
        var bothAreReferenceTypes = _state.IsReferenceType && keyMemberInfo.Member.IsReferenceType;
        var nullableQuestionMark  = bothAreReferenceTypes ? "?" : null;

        _sb.Append($@"

      /// <summary>
      /// Explicit conversion from the type <see cref=""{keyMember.TypeMinimallyQualified}""/>.
      /// </summary>
      /// <param name=""{keyMember.ArgumentName}"">Value to covert.</param>
      /// <returns>An instance of <see cref=""{_state.TypeMinimallyQualified}""/>.</returns>");

        if (bothAreReferenceTypes)
        {
            _sb.Append($@"
      [return: global::System.Diagnostics.CodeAnalysis.NotNullIfNotNull(""{keyMember.ArgumentName}"")]");
        }

        _sb.Append($@"
      public static explicit operator {_state.TypeFullyQualified}{nullableQuestionMark}({keyMember.TypeFullyQualified}{nullableQuestionMark} {keyMember.ArgumentName})
      {{");

        if (bothAreReferenceTypes)
        {
            _sb.Append($@"
         if({keyMember.ArgumentName} is null)
            return null;
");
        }

        _sb.Append($@"
         return {_state.TypeFullyQualified}.Create({keyMember.ArgumentName});
      }}");
    }