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(@" }"); }
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}); }}"); }